内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我试图用纯python将两个矩阵相乘。输入(X1为3x3,Xt为3x2):
X1 = [[1.0016, 0.0, -16.0514], [0.0, 10000.0, -40000.0], [-16.0514, -40000.0, 160513.6437]] Xt = [(1.0, 1.0), (0.0, 0.25), (0.0, 0.0625)]
其中XT是另一个矩阵的压缩转置。下面是代码:
def matrixmult (A, B): C = [[0 for row in range(len(A))] for col in range(len(B[0]))] for i in range(len(A)): for j in range(len(B[0])): for k in range(len(B)): C[i][j] += A[i][k]*B[k][j] return C
python给我的错误是:IndexError: list index out of range
这是不正确的初始化。
C = [[0 for row in range(len(A))] for col in range(len(B[0]))]
正确的初始化将是
C = [[0 for col in range(len(B[0]))] for row in range(len(A))]
此外,我建议使用更好的命名约定。在调试方面会有很大的帮助。例如:
def matrixmult (A, B): rows_A = len(A) cols_A = len(A[0]) rows_B = len(B) cols_B = len(B[0]) if cols_A != rows_B: print "Cannot multiply the two matrices. Incorrect dimensions." return # Create the result matrix # Dimensions would be rows_A x cols_B C = [[0 for row in range(cols_B)] for col in range(rows_A)] print C for i in range(rows_A): for j in range(cols_B): for k in range(cols_A): C[i][j] += A[i][k] * B[k][j] return C
如果你真的不想用numpy
你可以这样做:
def matmult(a,b): zip_b = zip(*b) # uncomment next line if python 3 : # zip_b = list(zip_b) return [[sum(ele_a*ele_b for ele_a, ele_b in zip(row_a, col_b)) for col_b in zip_b] for row_a in a] x = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]] y = [[1,2],[1,2],[3,4]] import numpy as np # I want to check my solution with numpy mx = np.matrix(x) my = np.matrix(y)
结果:
>>> matmult(x,y) [[12, 18], [27, 42], [42, 66], [57, 90]] >>> mx * my matrix([[12, 18], [27, 42], [42, 66], [57, 90]])