多个方阵相乘

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 docsreduce 似乎不支持 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