2014-07-01 65 views
2

我有一個大小爲m × n × p × q的4D矩陣A。考慮B = A(:,:,1,1)這是一個m × n矩陣。我想總結B的所有元素以給出一個數字。我想爲所有這樣的B矩陣做所有A所以最後我會有pq矩陣。在matlab中求和沒有for循環的4D矩陣

我該如何做到這一點沒有for循環?

至於三維矩陣(例如A是3D矩陣)我想這樣的作品爲例,

sum(squeeze(sum(A,1)),1) 

但我不知道如何爲一個四維矩陣做到這一點...

+2

性能的角度來看,這是更好地總結了尾部尺寸(即第三和第四),而不是領先的尺寸(即第一和第二)。所以,如果你可以構造你的矩陣,使它的形狀爲[p q m n],然後求和第三和第四維,那麼它會更快。 – Shai

+0

它有很大的區別嗎?你所擁有的解決方案將用於我所知道的N維矩陣。除此之外,如果不是您的解決方案在清晰度方面更有意義,我會建議您首先總結拖尾維度。我猜想重塑也可能會更快,但它的可讀性略有下降。 – patrik

回答

3

有什麼錯

[m n p q] = size(A); 
squeeze(sum(reshape(A, [], p, q), 1)) 

另外,

squeeze(sum(sum(A, 2), 1)) 
1

大概最快:

permute(sum(sum(A)), [3 4 1 2]); 

編輯:不,夏嘉曦的第一個解決方案是快:)

+2

我想''permute'複製內存中的元素,因爲數據的重新排序,而'reshape'只改變'A'的頭部而不是它在內存中的內部表示... – Shai

+0

@Shai:也許......個人而言,我懷疑你可能會對'sum'進行雙重調用,因爲你的secnod解決方案與我的性能相當。 –

+1

你的表現相當於什麼?是關於計算的速度? – user3482383