稀疏矩阵分配变得在Matlab
我填充从中我逐行读取的文本文件来值的稀疏矩阵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可以改变它们)
sparse
有第六个输入参数,它告诉矩阵中非零元素的个数。这是用于用Matlab预先分配:
S = sparse(i,j,s,m,n,nzmax)
使用矢量i
,j
和s
以产生m
-by-n
稀疏矩阵,使得S(i(k),j(k)) = s(k)
,与分配用于nzmax
非零空间 。
所以,你可以用initiallize
P = sparse([],[],[],230e3,290e3,nzmax);
你可以做一个关于非零(也许是检查文件的大小?)的数量的猜测并用其作为nzmax
。如果最终你需要更多的非零元素,Matlab将会实时预先分配(缓慢)。
我试过了,P2 =稀疏([],[],[],m,n,60000000);但数千行之后的赋值仍然很慢,或多或少的执行时间相同。所以内存分配不是瓶颈? – Eugenio 2014-09-19 10:45:14
@Eugenio它会出现这样。但我真的不知道Matlab如何用稀疏矩阵分配内存 – 2014-09-23 23:18:35
到目前为止,生成稀疏矩阵的最快方法是一次加载所有的值,然后在一次调用稀疏矩阵来生成稀疏矩阵。 但是,可能有更好的方法来做你需要的。一旦你阅读了数据,你将如何处理矩阵“P”? – 2014-09-19 09:31:08
您的意思是将该值赋值给一个常规矩阵,然后将其转换为稀疏矩阵? 我不是起诉它是可行的,矩阵非常大。我实际上使用这里提供的代码http://*.com/questions/24789600/handling-a-very-big-and-sparse-matrix-in-matlab来填充矩阵,它似乎很好,但是,作为说了一段时间后变得非常缓慢。 – Eugenio 2014-09-19 10:49:02
不,我的意思是读取所有的值作为一个向量,创建它们列和行目标的向量,然后调用'sparse'来一次为你创建稀疏矩阵(参见稀疏文档)。 – 2014-09-23 06:23:00