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…
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
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…
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