我正在填充一个稀疏矩阵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可以产生差异?)
答案 0 :(得分:2)
sparse
有一个第六个输入参数,它告诉矩阵中非零元素的数量。这是Matlab用来预分配的:
S = sparse(i,j,s,m,n,nzmax)
使用向量i
,j
和s
生成m
- by -n
稀疏矩阵,S(i(k),j(k)) = s(k)
,带空格 分配给nzmax
非零。
所以你可以用
初始化P = sparse([],[],[],230e3,290e3,nzmax);
您可以猜测非零数(可能是检查文件大小?)并将其用作nzmax
。如果它转向你最后需要更多的非零元素,Matlab将在运行中(缓慢地)预先分配。
答案 1 :(得分:0)
到目前为止,使用matlab生成稀疏矩阵的最快方法是立即加载所有值,然后在一次调用sparse
中生成稀疏矩阵。您必须加载数据并将其排列为定义每个填充单元格的行和列索引和值的向量。然后,您可以使用sparse
语法调用S = sparse(i,j,s,m,n)
。