不同格式的稀疏矩阵和向量的点复杂度

时间:2016-11-02 18:08:54

标签: scipy sparse-matrix matrix-multiplication

我想了解为什么稀疏矩阵和密集向量的点积的时间增加:csr最快,然后是csccoolil和{{ 1}}(最慢)。换句话说,我用不同的dok来衡量这个程序的时间:

fmt

我想找到dot的功能scipy的源代码。 A = scipy.sparse.random(1000, 1000, format=fmt) b = np.random.randn(1000, 1) res = %timeit -o A * b csrcoocsr_matveccoo_matvec和csc_matvec很容易 - 它应该是第三个链接,如果我有10个reputaion =) )。但是我找不到csclil这样的功能。有人能回答我怎么找到它吗?

1 个答案:

答案 0 :(得分:3)

// the `C&&` from the move will bind to the `const C&` of the operator=
auto anotherC = std::move(aC);

In [298]: M=sparse.coo_matrix(np.eye(3)) 格式的产品首先转换为lil

csr

In [299]: Ml=M.tolil() In [300]: Ml._mul_vector?? Signature: Ml._mul_vector(other) Source: def _mul_vector(self, other): return self.tocsr()._mul_vector(other) File: /usr/lib/python3/dist-packages/scipy/sparse/base.py Type: method 是自己做的。 dokdok的子类。

dict

但是为了与另一个稀疏矩阵相乘,它会进行In [303]: Md=M.todok() In [304]: Md._mul_vector?? Signature: Md._mul_vector(other) Source: def _mul_vector(self, other): # matrix * vector result = np.zeros(self.shape[0], dtype=upcast(self.dtype,other.dtype)) for (i,j),v in iteritems(self): result[i] += v * other[j] return result File: /usr/lib/python3/dist-packages/scipy/sparse/dok.py 转换。

csr

请注意,最后一个代码位于In [305]: Md._mul_sparse_matrix?? Signature: Md._mul_sparse_matrix(other) Source: def _mul_sparse_matrix(self, other): return self.tocsr()._mul_sparse_matrix(other) File: /usr/lib/python3/dist-packages/scipy/sparse/base.py 。这是通用稀疏代码所在的位置。如果格式没有定义自己的方法,则使用基本版本。

base.py

In [306]: Md.__class__.__mro__ Out[306]: (scipy.sparse.dok.dok_matrix, scipy.sparse.base.spmatrix, scipy.sparse.sputils.IndexMixin, dict, object) 也会将coo转换为完整的矩阵产品。