[英]How to multiply matrixes using for loops - Python
我什至不知道如何开始这样做它需要是一个 for 循环来乘以 mtrixes
例如
[[1,2],[3,4]] * [[3,4],[5,6]]
[1 , 2] , [3 , 4]
[3, 4] *[5, 6]
非常感谢需要帮助我知道 90% 的人不想为我编码,所以没关系
只需要两个方阵
我很确定模式正在列表中查看它
a[1][1]*b[1][1]+a[1][2]*b[2][1] a[1][1]b[1][2]+a[1][2]b[2][2]
a[2][1]b[1][1]+a[2][2]b[2][1] a[2][1]b[1][2]+a[2][2]b[2][2]
result = [] # final result
for i in range(len(A)):
row = [] # the new row in new matrix
for j in range(len(B[0])):
product = 0 # the new element in the new row
for v in range(len(A[i])):
product += A[i][v] * B[v][j]
row.append(product) # append sum of product into the new row
result.append(row) # append the new row into the final result
print(result)
如果你看看矩阵乘法是如何工作的:
[ 1 2 ] x [ 5 6 ] = [ 1*5+2*7 1*6+2*8 ]
[ 3 4 ] [ 7 8 ] [ 3*5+4*7 3*6+4*8 ]
那么您可以确定一种计算方法,例如,如果您要乘以输出矩阵的元素i , j ,那么您需要将 LHS 矩阵第i行中的所有内容乘以 RHS 矩阵第j列中的所有内容,所以那是一个 for 循环(因为行i 中的元素数等于列j )。
您还需要涵盖输出矩阵维度的i和j 的每个组合,这是一个 for 循环,用于嵌套在行的 for 循环中的列。
当然,实际的代码是一个供您实现的练习。
打破它。 在尝试编写矩阵相乘的函数之前,先编写一个向量相乘的函数。 如果你能做到这一点,那么两个矩阵相乘只是将结果矩阵的每个元素 i,j 的行 i 和列 j 相乘。
def matmul(matrix1_,matrix2_):
result = [] # final result
for i in range(len(matrix1_)):
row = [] # the new row in new matrix
for j in range(len(matrix2_[0])):
product = 0 # the new element in the new row
for v in range(len(matrix1_[i])):
product += matrix1_[i][v] * matrix2_[v][j]
row.append(product) # append sum of product into the new row
result.append(row) # append the new row into the final result
return result
from numpy import *
m1 = array([[1, 2, 3],[4, 5, 6] ])
m2 = array([[7, 8],[9, 10],[11, 12]])
r = array([[0, 0],[0, 0]])
s = 0
for i in range(2):
for j in range(2):
for k in range(3):
s = s + m1[i][k]*m2[k][j]
r[i][j] = s
s = 0
print(r)
我认为当我们使用 numpy 模块时 append 函数在二维数组中不起作用,所以这就是我解决它的方法。
>>> A=[[1,2],[3,4]]
>>> B=[[3,4],[5,6]]
>>> n=2
>>> ans=[[0]*n for i in range(n)]
>>> ans
[[0, 0], [0, 0]]
>>> for i in range(n):
... for j in range(n):
... ans[i][j]=sum((A[i][v]*B[v][j] for v in range(n)))
...
>>> ans
[[13, 16], [29, 36]]
我认为您只需要简化矩阵乘法的公式即可。
我们有 A*B=C 那么: Cij=答案的第 i 行第 j 列中的值。 例如上面我们有 C12=16 和 C11=13..(注意这是数组中的第 0 个位置,所以我们经常从 0 开始而不是 1)
Cij= dot_product(row_i_of_A,column_j_of_B)=sum(row_i_of_A(v)*column_j_of_B(v) for v in range(n))
因为我们想要完整的答案(所有的 C),所以我们需要计算出所有可能的 Cij。 这意味着我们需要尝试所有可能的对 ij,因此我们在 range(n) 中遍历 i,在 range(n) 中遍历 j,并对每个可能的对执行此操作。
u 和 v 是为可视化目的而构建的。
from typing import List
A = [[1,0,0],[-1,0,3]]
B = [[7,0,0],[0,0,0],[0,0,1]]
def mult_mat(A:List[List[int]], B:List[List[int]]) -> List[List[int]]:
n = len(A) # Number of rows in matrix A
m = len(B[0]) # Number of columns in matrix B
ret = [[0 for i in range(m)] for j in range(n)]
for row in range(n):
u = A[row]
for col in range(m):
v = [B[i][col] for i in range(len(B))]
# Here you can calculate ret[row][col] directly without v
# But v is constructed for visualization purpose
ret[row][col] = sum([x*y for x,y in zip(u,v)])
return ret
if __name__ == '__main__':
print(mult_mat(A,B))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.