2013-11-20 177 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