MATLAB内存分配:在mat文件上循环

MATLAB内存分配:在mat文件上循环,matlab,memory,Matlab,Memory,我有nmat文件,其中包含单个巨大矩阵的部分。我想加载mat文件并连接行、列和值向量以构建矩阵W。现在,我正在执行以下操作,但速度非常慢,我知道我不应该动态增加行,cols,vals: 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];

我有
n
mat文件,其中包含单个巨大矩阵的部分。我想加载mat文件并连接行、列和值向量以构建矩阵
W
。现在,我正在执行以下操作,但速度非常慢,我知道我不应该动态增加
cols
vals

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

非常快,非常感谢

您需要预先分配一个数组。假设
r
c
v
的大小各为a*b

总的来说,您需要a*n行和b列,因此使用
rows=nan(a*n,b)

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

一些想法

  • 在我看来,矩阵的大小是一样的
  • 另一个瓶颈可能是
    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)

这里有一个技巧,有时可以帮助您加快速度,就好像您的变量已经初始化一样。然而,有时这并没有什么帮助,所以找到答案的唯一方法是尝试:

替换以下行:

rows = [rows; r];
rows(end+(1:numel(r))) = r;
通过以下方式:

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

问题是我不知道
r
c
v
的维度。但是,我想这无论如何都可以实现,方法是以最大大小分配
VAL
,并动态确定每个子矩阵的大小。已经谢谢了,我会试试这个然后再给你回复!实际上这个代码在matlab中是无效的。对于ii=1:n,它应该是
谢谢你指出这一点,我修正了它。请给出哪一行花费时间最多的配置文件结果。同时给出这些行中变量的相关大小,并检查调用这些行的频率命令是我的问题。我解决了它,并将相应地更新我的帖子!谢谢你的回答。请注意:1。矩阵的大小是一样的,这是事实。2.查找功能非常快,通常不是瓶颈。3.很好,但幸运的是,这不会发生在我身上。您的解决方案是可行的,但以这种方式对稀疏矩阵的写入访问速度非常慢,应该避免,因为稀疏矩阵的组织方式(如果您感兴趣,请提供更多信息)。我明白了-您的矩阵是否足够小,可以以完整形式存储在内存中?那可能会更快。不,不幸的是这不可能。同时,我找到了一个解决方案,不过,感谢您的投入!