2015-03-18 80 views
2

我想減去兩個不同大小的MATLAB數組,我目前正在使用for循環,這需要很長的時間。 有什麼辦法讓代碼更快?我想知道如果也許我可以以一種快速的方式創建一個沒有for循環的117x489x489的數組。MATLAB如何擺脫循環減去兩個陣列

第一個數組a的尺寸爲1x117,第二個數組b的尺寸爲489x489。 結果矩陣的尺寸爲117x489x489。

這裏是我如何減去兩個數組:

for i = 1:length(a) 
    result(i) = a(i) - b; 
end 

回答

6

您可以使用有效bsxfun這裏做既abexpansions的大小117x489x489避免了循環再下進行elementwise subtraction引擎蓋。因此,它提出了一個矢量化的方法來達到預期的結果。下面的代碼 -

result = bsxfun(@minus,a(:),permute(b,[3 1 2])) 

(:)apermuteb有助於根據需要爲它們各自的擴張與bsxfun分別創建singleton dimensionsab


可避免permute有一些reshaping像這樣 -

result = reshape(bsxfun(@minus,a(:),b(:).'),[numel(a) size(b)]) 
+0

爲什麼你想避免'permute'?比'reshape'慢得多嗎? – kkuilla 2015-03-19 10:18:29

+0

@kkuilla是的,從我的一點經驗來看,它很重,特別是在排列大型數組和多維數組時。在這種情況下,'b'是'489x489',它可能是昂貴的。如果它是'a'而不是'1x117',那不會有什麼大不了的。另一方面,「重塑」在運行成本上應該很輕。 – Divakar 2015-03-19 11:50:41