稀疏3D矩阵与2D矩阵相乘

时间:2020-10-24 15:54:54

标签: python matrix sparse-matrix matrix-multiplication

我有稀疏的COO 3D A矩阵NxNxM(第三维是M)和密集的2D B矩阵(NxN),这将是我的求解器的优化变量。我想将A和B相乘以获得(NxNXM)矩阵。然后,我需要对所得3D矩阵的元素求和以创建2D矩阵(NxN)。

为澄清起见,如果我不使用稀疏矩阵,则可以使用以下代码来实现。它是3D和2D矩阵的乘积。

np.sum(np.einsum('ijk,jk->ijk', A, B))

其中A是3D矩阵,B是2D矩阵。

我的目标功能是最小化稀疏A与决策变量矩阵B相乘的元素之和。

我该怎么做?

我正在使用pydata sparse library创建稀疏矩阵。

1 个答案:

答案 0 :(得分:0)

https://sparse.pydata.org/en/stable/

幸运的是,在许多情况下,如果我们能够智能地将多维数组转置并重整为合适的二维稀疏矩阵,执行修改后的稀疏矩阵运算,然后重整并转置回去,则可以利用现有的scipy.sparse算法。 。通过修改坐标数组,这些整形和转置操作都可以以无数的速度完成。在scipy.sparse运行其操作(通常用C语言编写)之后,我们可以使用相同的反向转换和变位路径转换回。

它所要做的就是这个;你应该裁掉中间人。通过将其作为3d阵列进行操作,您实际上并没有获得任何收益,使用起来更加困难。

from scipy import sparse
import numpy as np    

M, N = 1000, 100

A = sparse.random(M, N ** 2, density=0.01, format='csr')
B = np.random.rand(N ** 2)

C = A.multiply(B).sum(axis=0).A

>>> A
<1000x10000 sparse matrix of type '<class 'numpy.float64'>'
    with 100000 stored elements in Compressed Sparse Row format>
>>> B.shape
(10000,)
>>> C.shape
(1, 10000)