如果我只需要对角线周围的皮带,如何加速 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 matrices(numpy
也来自)。
针对您的具体问题:
对角线元素是矩阵的元素乘积及其转置的列式总和 v = np.sum(np.multiply(A, A.T), axis=0)
非对角线元素是相同的,只是删除最后一个 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
- 然后你可以构造对角矩阵
np.diag(v)
:
A_res = np.diag(v) + np.diag(v_pos, k=1) + np.diag(v_neg, k=-1)
我需要计算方阵 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 matrices(numpy
也来自)。
针对您的具体问题:
对角线元素是矩阵的元素乘积及其转置的列式总和
v = np.sum(np.multiply(A, A.T), axis=0)
非对角线元素是相同的,只是删除最后一个 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
- 然后你可以构造对角矩阵
np.diag(v)
:
A_res = np.diag(v) + np.diag(v_pos, k=1) + np.diag(v_neg, k=-1)