多个方阵相乘
Multiplying many square matrices
我有一个问题,我想将许多 2x2 方阵相乘。矩阵中的元素是来自a+ib(复数)
代码如下所示:
Final_list=[]
for x in list_x:
Matrix=np.array([[1,0],[0,1]])
for y in list_y:
Matrix_y=[....] #create a 2x2 matrix from values x and y
Matrix= Matrix.dot(Matrix_y)
value= 5/(Matrix[0,0] + Matrix[1,0]....) #something like this
Final_list.append(abs(value))
Final_list是我需要的
我的代码可以工作,但需要一段时间,我觉得一定有更好的方法来编写它。如果 list_x=30000 和 list_y=300 的长度需要一段时间来计算~一分钟左右。
我能够创建一个大的形状矩阵 (300,30000,2,2)。我通过数组广播和使用 np.shape 做到了这一点。我希望将一列中的所有矩阵相乘以获得形状为 (30000,2,2) 的矩阵数组。我认为这可能有助于计算,但还没有想出办法。
有没有比使用多个 for 循环更好的写法?
谢谢
我不知道完全矢量化的解决方案。最初我认为 np.matmul.reduce
可能有效,但根据 old docs,reduce
似乎不支持 non-commutative 操作。还有 np.linalg.multi_dot
,但对于 2 x 2 矩阵来说似乎有点矫枉过正。
这是一个在我的机器上运行 1.5 秒的答案;它类似于 here.
的方法
arr = np.random.rand(300, 30_000, 2, 2)
def my_mul(mats):
if len(mats) == 1:
return mats[0,...]
elif len(mats) == 2:
return mats[0,...] @ mats[1,...]
else:
mid = len(mats) // 2
return my_mul(mats[:mid,...]) @ my_mul(mats[mid:,...])
result = my_mul(arr) # 1.53 s
我有一个问题,我想将许多 2x2 方阵相乘。矩阵中的元素是来自a+ib(复数)
代码如下所示:
Final_list=[]
for x in list_x:
Matrix=np.array([[1,0],[0,1]])
for y in list_y:
Matrix_y=[....] #create a 2x2 matrix from values x and y
Matrix= Matrix.dot(Matrix_y)
value= 5/(Matrix[0,0] + Matrix[1,0]....) #something like this
Final_list.append(abs(value))
Final_list是我需要的
我的代码可以工作,但需要一段时间,我觉得一定有更好的方法来编写它。如果 list_x=30000 和 list_y=300 的长度需要一段时间来计算~一分钟左右。
我能够创建一个大的形状矩阵 (300,30000,2,2)。我通过数组广播和使用 np.shape 做到了这一点。我希望将一列中的所有矩阵相乘以获得形状为 (30000,2,2) 的矩阵数组。我认为这可能有助于计算,但还没有想出办法。
有没有比使用多个 for 循环更好的写法?
谢谢
我不知道完全矢量化的解决方案。最初我认为 np.matmul.reduce
可能有效,但根据 old docs,reduce
似乎不支持 non-commutative 操作。还有 np.linalg.multi_dot
,但对于 2 x 2 矩阵来说似乎有点矫枉过正。
这是一个在我的机器上运行 1.5 秒的答案;它类似于 here.
的方法arr = np.random.rand(300, 30_000, 2, 2)
def my_mul(mats):
if len(mats) == 1:
return mats[0,...]
elif len(mats) == 2:
return mats[0,...] @ mats[1,...]
else:
mid = len(mats) // 2
return my_mul(mats[:mid,...]) @ my_mul(mats[mid:,...])
result = my_mul(arr) # 1.53 s