我有n
个mat文件,包含单个巨大矩阵的部分内容。我想加载mat文件并连接行,列,值向量来构建矩阵W
。现在,我正在做以下事情,但它确实很慢,我知道我不应该动态增加rows
,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 );
非常快,非常感谢!
答案 0 :(得分:1)
您需要预先分配数组。假设r
,c
和v
的大小为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;