【问题标题】:Sparse Matrix Assignment becomes very slow in Matlab稀疏矩阵赋值在 Matlab 中变得非常慢
【发布时间】:2014-09-19 07:34:09
【问题描述】:

我正在用来自我逐行读取的文本文件的值填充稀疏矩阵 P (230k,290k),这是(简化的)代码

while ...
            C = textscan(text_line,'%d','delimiter',',','EmptyValue', 0);
            line_number = line_number+1;
            P(line_number,:)=C{1};
end

我遇到的问题是,在开始的时候

P(line_number,:)=C{1};

语句很快,几千行之后变得非常慢,我猜是因为Matlab每次都需要找到要分配的内存空间。有没有办法用稀疏矩阵预分配内存?我不这么认为,但也许我错过了一些东西。任何其他可以加快操作的建议(例如,拥有大量可用 RAM 可以有所作为?)

【问题讨论】:

  • 到目前为止,生成稀疏矩阵的最快方法是一次加载所有值,然后在一次调用sparse 中生成稀疏矩阵。但是,可能有更好的方法来做您需要的事情。读入数据后,您将如何使用矩阵 P
  • 您的意思是将值分配给普通矩阵,然后将其转换为稀疏矩阵吗?我不认为它是可行的,矩阵很大。我实际上正在使用这里建议的代码stackoverflow.com/questions/24789600/… 来填充矩阵,它看起来很好,但正如所说的,一段时间后变得非常慢。
  • 不,我的意思是将所有值作为向量读取,创建其列和行目标的向量,然后调用 sparse 一次性为您创建稀疏矩阵(请参阅文档sparse).
  • 该技术的坏处是您至少需要四倍的内存:一个向量用于值,另一个用于行和列,然后再次用于稀疏矩阵。见dylan-muir.com/articles/matlab_sparse_matricesdylan-muir.com/articles/matlab_sparse_direct
  • 我终于按照您的建议一次性创建了稀疏矩阵,我能够在不到 12 小时的时间内创建它,这对我来说还可以。谢谢。如果您愿意,可以添加您的评论作为答案,我会接受。

标签: matlab sparse-matrix


【解决方案1】:

sparse 的第六个输入参数告诉矩阵中非零元素的数量。 Matlab 使用它来预分配:

S = sparse(i,j,s,m,n,nzmax) 使用向量 ijs 生成 m-by-n 稀疏矩阵使得S(i(k),j(k)) = s(k),有空格 分配给nzmax nonzeros。

所以你可以初始化

P = sparse([],[],[],230e3,290e3,nzmax);

您可以猜测非零的数量(也许检查文件大小?)并将其用作nzmax。如果最终你需要更多的非零元素,Matlab 将动态预分配(缓慢地)。

【讨论】:

  • 我试过了,P2 = sparse([],[],[],m,n,60000000);但是几千行后赋值仍然很慢,或多或少执行时间是相同的。那么内存分配不是瓶颈?
  • @Eugenio 看起来是这样。但我真的不知道Matlab如何用稀疏矩阵分配内存
【解决方案2】:

到目前为止,使用 matlab 生成稀疏矩阵的最快方法是一次加载所有值,然后在一次调用 sparse 中生成稀疏矩阵。您必须加载数据并将其排列到定义每个填充单元格的行和列索引和值的向量中。然后,您可以使用S = sparse(i,j,s,m,n) 语法调用sparse

【讨论】:

猜你喜欢
  • 2014-11-13
  • 2018-11-30
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2017-07-02
  • 2014-09-07
  • 2012-06-20
  • 2013-03-02
相关资源
最近更新 更多