2013-10-29 35 views
1

我對上述變量運行上述循環:如何使MATLAB遍歷2D陣列更快

  • A是大小爲m×n的2D陣列。
  • 掩模尺寸的1XN
  • 結果一維邏輯陣列大小的一維數組1XN
  • B爲形式MX1
  • ℃的載體是MXM矩陣,m是與上述相同。

編輯:將foo(x)展開爲函數。

這裏是代碼:

temp = (B.'*C*B);  
for k = 1:n 
    x = A(:,k); 
    if(mask(k) == 1) 
     result(k) = (B.'*C*x)^2/(temp*(x.'*C*x)); %returns scalar 
    end 
end 

注意一下,我已經成功地使用上面的代碼爲PARFOR循環,而不是爲。我希望你能夠建議一些方法來使用meshgrid或排序來產生更好的性能改進。我不認爲我有內存問題,所以解決方案也可能是昂貴的內存明智的。

非常感謝。

+0

您的'foo'是否允許輸入矩陣,或只輸入列? –

+0

預分配'結果'。將if(mask(k)== 1)'改爲'if mask(k)'。不過,你不會從中獲得太多收益。 –

+0

嗨,我不認爲矩陣輸入應該有任何問題。 – user2324712

回答

1

試試這個:

result=(B.'*C*A).^2./diag(temp*(A.'*C*A))'.*mask; 

通過矩陣乘法這也量化將確保result是1XN載體。在你提供的代碼中可能會出現mask中的最後一個元素爲零的情況,在這種情況下,你的代碼會將result截斷爲較小的長度,而在答案中它將使這些元素保持爲零。

+0

的行來「擴展」結果'謝謝!它似乎工作得更快! – user2324712

1

如果您foo承認矩陣輸入,你可以這樣做:

result = zeros(1,n); % preallocate result with zeros 
mask = logical(mask); % make mask logical type 
result(mask) = foo(A(mask),:); % compute foo for all selected columns 
+0

你爲什麼預先分配NaN而不是零? – user2324712

+0

因爲我不知道你希望哪些結果不在'mask'中。但是,是的,0在你的代碼中是隱含的。我糾正了我目前失敗的答案 –

+0

。我猜foo函數不適合矩陣。我會研究它。沒有將矩陣放入foo中可以做什麼? – user2324712