我有稀疏的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创建稀疏矩阵。
答案 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)