如何在线性算子(Scipy)和稀疏矩阵(CSC矩阵)之间求矩阵-矩阵乘积?

enxuqcxy  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(122)

我使用的是一个用Python实现的数学对象(H²矩阵),它是密集矩阵的近似(来自h2tools库)。这个包只实现了一个矩阵向量积,所以我可以创建一个描述它的线性运算符。
我需要在一个线性算子(来自scipy.sparse. linalg.LinearOperator)和一个稀疏矩阵(CSC格式)之间做矩阵乘积。此产品的结果需要采用稀疏格式。
有没有一种方法可以用Scipy或其他库来做到这一点?
我试过一个简单的例子。
我创建了一个稀疏CSC矩阵,并从矩阵中提取非线性算子:

import numpy as np
from scipy.sparse import csc_matrix
from scipy.sparse.linalg import LinearOperator

# Define a CSC matrix A
A = csc_matrix([[1, 0], [0, 1]])

# Creating Linear operator from another matrix
B = np.array([[10, 0], [0, 10]] )
lin_op_B = LinearOperator(B.shape, matvec=B.dot)

然后我想执行矩阵乘积:

# Perform the matrix-matrix multiplication
result = A @ lin_op_B
print(result.todense())

这将打印B矩阵:
[[10 0]
[0 10]]
CSC格式。

j7dteeu8

j7dteeu81#

正如我所评论的,将点应用于稀疏矩阵试图做一个纯粹的密集点。稀疏的文档试图强调这一点。

In [3]: B.dot(A)
Out[3]: 
array([[<2x2 sparse matrix of type '<class 'numpy.int32'>'
            with 2 stored elements in Compressed Sparse Column format>,
        <2x2 sparse matrix of type '<class 'numpy.int32'>'
            with 2 stored elements in Compressed Sparse Column format>],
       [<2x2 sparse matrix of type '<class 'numpy.int32'>'
            with 2 stored elements in Compressed Sparse Column format>,
        <2x2 sparse matrix of type '<class 'numpy.int32'>'
            with 2 stored elements in Compressed Sparse Column format>]],
      dtype=object)

正确的点:

In [4]: B.dot(A.todense())
Out[4]: 
matrix([[10,  0],
        [ 0, 10]])

或使B稀疏

In [5]: csc_matrix(B).dot(A)
Out[5]: 
<2x2 sparse matrix of type '<class 'numpy.intc'>'
    with 2 stored elements in Compressed Sparse Column format>

In [6]: csc_matrix(B).dot(A).todense()
Out[6]: 
matrix([[10,  0],
        [ 0, 10]], dtype=int32)

matmul运算符也可以工作,但结果是稠密的

In [10]: B@A
Out[10]: 
array([[10,  0],
       [ 0, 10]], dtype=int32)

另一个密集的结果:

In [12]: A.T.dot(B.T)
Out[12]: 
array([[10,  0],
       [ 0, 10]], dtype=int32)

只有当B本身是稀疏的时,才会得到稀疏结果。也就是说,sparse与sparse的dot/matmul产生sparse。否则,稀疏与密集会产生密集。

相关问题