【发布时间】:2020-05-11 22:03:51
【问题描述】:
我正在将 Matlab 代码翻译成 Python 环境,现在在 Matlab 中处理稀疏函数。我知道我们有一个名为 scipy.sparse 的库,其中一个名为 csc_matrix((data, (row_ind, col_ind)), [shape=(M, N)])。
但是,当我检查从 scipy.sparse 库计算的那些时,它们与 Matlab 中的不匹配。
我有大小为 1693872 的大数据,称为 Ig (1693872,)、Jg(1693872,) 和 K_dummy (1693872,),其中 K_dummy(Ig(i),Jg(i)) = K_dummy(i)。
我已经用 Matlab 检查了所有变量 Ig、Jg、K_dummy 并且完全匹配。你们知道我必须考虑其他方面吗?
这是我在 python 和 Matlab 中的示例代码,分别作为参考:
K = csc_matrix((K_dummy.flatten('F'),(Ig.flatten('F')-1,Jg.flatten('F')-1)),shape=(noDofs,noDofs))
K = sparse(Ig(:),Jg(:),K_dummy_python(:),noDofs,noDofs);
其中K_dummy 是 (18, 18, 5228) 数组,Ig 是 (324, 5228) 数组,Jg 是 (324, 5228) 数组,noDofs 是一个 int 变量,为 42442。
【问题讨论】:
-
如果示例很小且我们可以在自己的机器上重现值,则最容易提供帮助。虽然几年前我曾在 MATLAB 上工作过,但我还没有尝试过并排创作(使用 Octave)。我已经通过
.mat文件导入 Octave 创建稀疏。 -
我很想在 Octave 中创建一个样本,然后将密集和稀疏的值传输到
scipy(通过io.loadmat),但是制作一些能够捕捉形状和顺序复杂性的东西正在推进比我现在要做的更多的工作。有什么区别?稀疏性(非零位置)是否正确?只是非零值的差异? -
它们之间的区别在于存储在稀疏矩阵中的非零元素的数量......而且,我检查了所有扁平化的索引,Ig、Jg 和所有正确的。
-
应该有 1693872 个非零元素(
M.nnz、nnz(M))。可能的例外 -K_dummy有一些 0 值,其中一个正在删除,另一个没有。或者有一些重复,一个是求和,另一个不是。scipy有一个M.eliminate_zeros()方法可以在处理留下零时使用。对重复项求和是两者的常态。
标签: python matlab scipy sparse-matrix