如果我只需要对角线周围的皮带,如何加速 numpy 中的矩阵乘法?

How to speed up matrix multiplication in numpy if I only need the belt around the diagonal?

我需要计算方阵 A (A*A^T) 的二次方,但我只对结果对角线附近的值感兴趣。换句话说,我需要计算相邻行的点积,其中邻域由固定大小的 window 定义,理想情况下,我想避免计算剩余的点积。如何在没有 运行 带有一些掩码的全矩阵乘法的情况下在 numpy 中执行此操作?生成的数组应如下所示:

a1*a1  a1*a2  0      0      0      0
a2*a1  a2*a2  a2*a3  0      0      0
0      a3*a2  a3*a3  a3*a4  0      0
0      0      a4*a3  a4*a4  a4*a5  0...
0      0      0      ...
...

示例矩阵包含相邻行的点积。每行仅与其左右相邻行相乘。为了节省时间,理想情况下不应由解计算零点。 似乎正朝着类似的方向发展。

scipy 查看 sparse matricesnumpy 也来自)。

针对您的具体问题:

  1. 对角线元素是矩阵的元素乘积及其转置的列式总和 v = np.sum(np.multiply(A, A.T), axis=0)

  2. 非对角线元素是相同的,只是删除最后一个 row/column 并在第一个索引处用零 column/row 代替:

pos_offset = np.concatenate((np.zeros((n, 1)), A[:, :-1]), axis=1)
v_pos = np.sum(np.multiply(A, pos_offset.T), axis=0)
# similar for the negative offset diagonal
  1. 然后你可以构造对角矩阵 np.diag(v):
A_res = np.diag(v) + np.diag(v_pos, k=1) + np.diag(v_neg, k=-1)