【发布时间】: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_matrices 和dylan-muir.com/articles/matlab_sparse_direct
-
我终于按照您的建议一次性创建了稀疏矩阵,我能够在不到 12 小时的时间内创建它,这对我来说还可以。谢谢。如果您愿意,可以添加您的评论作为答案,我会接受。
标签: matlab sparse-matrix