How do I multiply two matrices in pyhton without numpy?

Question:

Implement a function mat_mult_by_transpose(mat) which gets a valid matrix
called mat and returns a new matrix which is the matrix multiplication of and ( ) , i.e. ( ) ⋅ ( ) .
Return a new matrix, without modifying mat2.
You may assume that the input matrix is not empty.

Example 1:

    mat = [[1,2],[3,4],[5,6]] 
    mult_mat = mat_mult_by_transpose(mat) 
    print(mat) # [[1, 2], [3, 4], [5, 6]] 
    print(mult_mat) # [[5, 11, 17], [11, 25, 39], [17, 39, 61]]

Example 2:

    mat2 = [[0, 1, 2], [10, 11, 12], [20, 21, 22]] 
    mult_mat2 = mat_mult_by_transpose(mat2) 
    print(mult_mat2) # [[5, 35, 65], [35, 365, 695], [65, 695, 1325]]

This is my attempt:

def mat_transpose(mat):
    transposedMat= []
    i = 0
    for i in range(len(mat[i])):
        newMat= []
        for j in range(len(mat)):
                newMat.append(mat[j][i])
        transposedMat.append(newMat)
    return transposedMat

def mat_mult_by_transpose(mat):
    matT = mat_transpose(mat)
    mat2 = []
    for i in range(len(matT)):
        temp_list=[]
        for j in range(len(matT)):
            sum = 0
            for k in range(len(matT[0])):
                sum += mat[i][k] * matT[k][j]
            temp_list.append(sum)
        mat2.append(temp_list)
    return mat2

The error I ran into is this:

Traceback (most recent call last):
  File "file0.py", line 156, in <module>
    mult_mat = mat_mult_by_transpose(mat)
  File "file0.py", line 97, in mat_mult_by_transpose
    sum += mat[i][k] * matT[k][j]
IndexError: list index out of range

I don’t understand where my mistake is…

Asked By: Libi

||

Answers:

Assuming your mat_transpose() works fine. Look at it in terms of dimensions.

Let mat has dimension MxN
Hence M = len(mat) and N = len(mat[0])

Now matT will have dimension NxM
Hence N = len(matT) and M = len(matT[0])

You need to traverse row of first matrix mat, i.e i ranges [0..M]
then column of second matrix matT, i.e j ranges [0..M]
and k should be ranging the common dimension which is [0..N]

Here is the code:

def mat_mult_by_transpose(mat):
    matT = mat_transpose(mat)
    mat2 = []
    for i in range(len(mat)): # M,
        temp_list=[]
        for j in range(len(matT[0])): # M
            sum = 0
            for k in range(len(mat[0])): # N, you can use len(matT) also
                sum += mat[i][k] * matT[k][j]
            temp_list.append(sum)
        mat2.append(temp_list)
    return mat2
Answered By: Kartoos