2014-09-19 127 views
2

我填充从中我逐行读取的文本文件来值的稀疏矩阵P(230K,290K)很慢,在这里是(简化的)代码稀疏矩阵分配变得在Matlab

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}; 

说法是快过了几十万行成为exterely慢,我猜是因为Matlab的需要找到存储空间分配给每一个时间。有没有办法用稀疏矩阵预先分配内存?我不这么认为,但也许我错过了一些东西。任何其他可以加速操作的建议(例如,有很多可用的RAM可以改变它们)

+0

到目前为止,生成稀疏矩阵的最快方法是一次加载所有的值,然后在一次调用稀疏矩阵来生成稀疏矩阵。 但是,可能有更好的方法来做你需要的。一旦你阅读了数据,你将如何处理矩阵“P”? – 2014-09-19 09:31:08

+0

您的意思是将该值赋值给一个常规矩阵,然后将其转换为稀疏矩阵? 我不是起诉它是可行的,矩阵非常大。我实际上使用这里提供的代码http://stackoverflow.com/questions/24789600/handling-a-very-big-and-sparse-matrix-in-matlab来填充矩阵,它似乎很好,但是,作为说了一段时间后变得非常缓慢。 – Eugenio 2014-09-19 10:49:02

+1

不,我的意思是读取所有的值作为一个向量,创建它们列和行目标的向量,然后调用'sparse'来一次为你创建稀疏矩阵(参见稀疏文档)。 – 2014-09-23 06:23:00

回答

0

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

+0

如果矩阵很庞大,可以加载所有数据。那我们该怎么做呢? – Ehsan 2015-06-24 13:27:14

+0

我的意思是不可能加载所有数据 – Ehsan 2015-06-24 14:06:28

2

sparse有第六个输入参数,它告诉矩阵中非零元素的个数。这是用于用Matlab预先分配:

S = sparse(i,j,s,m,n,nzmax)使用矢量ijs以产生 m -by- n稀疏矩阵,使得S(i(k),j(k)) = s(k),与分配用于nzmax非零空间 。

所以,你可以用initiallize

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

你可以做一个关于非零(也许是检查文件的大小?)的数量的猜测并用其作为nzmax。如果最终你需要更多的非零元素,Matlab将会实时预先分配(缓慢)。

+0

我试过了,P2 =稀疏([],[],[],m,n,60000000);但数千行之后的赋值仍然很慢,或多或少的执行时间相同。所以内存分配不是瓶颈? – Eugenio 2014-09-19 10:45:14

+0

@Eugenio它会出现这样。但我真的不知道Matlab如何用稀疏矩阵分配内存 – 2014-09-23 23:18:35