2013-11-20 138 views
0

我填充与基于功能f一些值稀疏矩阵生成使用嵌套的循环,像这样:快速(稀疏)矩阵在MATLAB

B = sparse(x, y); 
for ix=1:x 
    for jy=1:y 
     if f(ix,jy) 
       B(ix, jy) = 1; 
     end 
    end 
end 

这是做事的最佳和最快的方式matlab,还是有一个优化的方式?

+0

什么是'f'?函数还是矩阵? – jkshah

+0

功能,抱歉,不清楚。 – rhombidodecahedron

+4

您的函数可以使用矢量输入并输出相同长度的矢量吗? – chappjc

回答

0

你可以尝试像以下,这就避免了循环:

如果
[is, js] = ind2sub(size(B), 1:numel(B)); 
fval = arrayfun(f, is, js); 
B(find(fval)) = 1; 

不知道这将是虽然更快。

如果f接受向量而不是单个索引,则可跳过arrayfun

+0

你知道我怎么能确定哪个更快? – rhombidodecahedron

+1

你为什么不试试看? – 3lectrologos

0

如果你的函数可以接受向量输入,您可以计算的f所有值在一杆,然后用sparse

[II,JJ] = ndgrid(1:y,1:x); 
F = reshape(f(II(:),JJ(:)),x,y); % maybe just f(II,JJ) if f allows it 
[ii,jj] = find(F); 
B = sparse(ii,jj,1,x,y); 

如果你的函数不接受向量,你将不得不通过运行它该循环或使用arrayfun来生成F(ix,iy) = f(ix,iy);,然后如上所述使用findsparse

+0

在没有函数'f'的情况下指出它有点难,特别是因为'x'是行而'y'是问题中的列。一些摆弄索引可能是需要的,但重点是在计算'F'后使用'稀疏'... – chappjc