Source: https://cs.baylor.edu/~maurer/aida/courses/matmpy.pdf