MATLAB内存分配:循环mat-files

时间:2014-01-14 11:39:38

标签: matlab memory

我有n个mat文件,包含单个巨大矩阵的部分内容。我想加载mat文件并连接行,列,值向量来构建矩阵W。现在,我正在做以下事情,但它确实很慢,我知道我不应该动态增加rowscolsvals的大小:

rows=[];cols=[];vals=[];

for ii=1:n
    var = load( sprintf('w%d.mat', ii) );
    [r,c,v] = find( var.w );

    rows = [rows; r];
    cols = [cols; c];
    vals = [vals; v];
end

W = sparse( rows, cols, vals );

你知道更好的方法吗?提前谢谢!

解决方案

根据Daniel R的建议,我解决了这个问题:

rows=zeros(maxSize,1);
cols=zeros(maxSize,1);
vals=zeros(maxSize,1);
idx = 1;

for ii=1:n
    var = load( sprintf('w%d.mat', ii) );
    [r,c,v] = find( var.w );        

    len = size(r,1);
    rows(idx:(idx-1+len))=r;
    cols(idx:(idx-1+len))=c;
    vals(idx:(idx-1+len))=v;
    idx = idx+len;
end

W = sparse( rows, cols, vals );

非常快,非常感谢!

3 个答案:

答案 0 :(得分:1)

您需要预先分配数组。假设rcv的大小为a * b。

总共需要* n行和b列,因此使用rows=nan(a*n,b)预先分配

要将数据写入数组,您必须设置正确的索引:rows((ii-1)*a+1:ii*a,1:end)=r

答案 1 :(得分:0)

一些想法。

  • 在我看来,矩阵具有相同的大小。
  • 另一个瓶颈可能是find功能。
  • 可能会发生两个矩阵在同一个索引上有不同的值吗?这可能会导致问题。

你可以这样做:

 var = load( 'w1.mat' );
 W = var.w;
 for ii  = 2:n
    var = load( sprintf('w%d.mat', ii) );
    ig = var.w~=0;
    W(ig) = var.w(ig);
 end

如果var.w不稀疏,请添加W = sparse(W)

答案 2 :(得分:0)

这是一个技巧,有时可以帮助加快速度,就像你的变量被初始化一样。但是,有时它只是没有用,所以找出答案的唯一方法是尝试:

替换以下行:

rows = [rows; r];

通过以下行:

rows(end+(1:numel(r))) = r;