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.很好,但幸运的是,这不会发生在我身上。您的解决方案是可行的,但以这种方式对稀疏矩阵的写入访问速度非常慢,应该避免,因为稀疏矩阵的组织方式(如果您感兴趣,请提供更多信息)。我明白了-您的矩阵是否足够小,可以以完整形式存储在内存中?那可能会更快。不,不幸的是这不可能。同时,我找到了一个解决方案,不过,感谢您的投入!