【问题标题】:Simplified implementation of an equation involving matrices [closed]涉及矩阵的方程的简化实现[关闭]
【发布时间】:2017-05-25 14:47:32
【问题描述】:

我想以简洁的形式计算以下两个矩阵 P 和 Q,这样我就可以一次计算矩阵,而不是遍历所有索引。

谁能建议我在 python 中计算这些矩阵 P 和 Q 的有效方法是什么?我附上了我的实现代码。我想避免在索引 i 和 j 上循环,而是在单个表达式中计算 P。

import numpy as np

def sum_matrices(i,j):
      a=0;
      for m in range(M+1):
            a+= p[m]*W[m][i]*np.dot(A[m][j][:],x);
return a;

for i in range(N):
     for j in range(N):
          P[i][j]=sum_matrices(i,j);

【问题讨论】:

  • numpy 支持全矩阵计算
  • 您的意思是通过循环 i 和 j 并使用上述公式计算 $P$ 的每个元素?
  • 请展示您希望改进的当前实现,我想我想我会更容易理解您需要在代码中看到它做什么,然后在数学中看到它。
  • @TadhgMcDonald-Jensen:做到了。
  • @TadhgMcDonald-Jensen:为什么它被否决并搁置?我添加了代码并解释了我的方法和问题。

标签: python numpy matrix


【解决方案1】:

所以在numpy 术语中

W - (M,N) shape, dtype float
A - (M,N,N)
x - (N,)
p - (M,)

将您的方程式即时转换为爱因斯坦符号,然后转换为np.einsum,我想您想要:

Ax = np.einsum('mjk,k->mj', A, x)    # sums on k
P = np.einsum('m,mi,mj->ij', p, W, Ax)   # sums on m
pW = np.einsum('m,mi->i', p, W)      # sums on m
Q = np.einsum('m,i,mj->ij', p, pW, Ax)   # sums on m

显然它需要用小的 M 和 N 以及样本数组进行测试。我也没有尝试深入理解方程式。我主要关注索引符号。

================

我会将你的代码改写为:

def sum_matrices(i,j):
      a=0;
      for m in range(M):
            a+= p[m]*W[m, i]*np.dot(A[m,j],x);
      return a;

def sum_matrices(i, j):
      Ax = np.array([np.dot(A[m,j,:], x) for m in range(M)])
      a = p * W[:, i] * Ax
      return a.sum()

另见Multiple matrix multiplication

【讨论】:

  • 反正 i 和 j 的 for 循环可以消除吗?我必须多次计算这些矩阵 P 和 Q。所以我觉得运行两个 for 循环会很慢。
  • einsum 表单不循环。
  • 我的错。因此,上述答案有效地是同一问题的 3 种不同解决方案,对吗?其中两个涉及循环,而 einsum 一个不涉及任何循环。与上述循环方法相比,einsum 通常是慢还是快?
  • einsum 表达式是我的主要答案。其余的都是改进代码的不完整尝试。
猜你喜欢
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2020-10-18
相关资源
最近更新 更多