2012-10-21 61 views
5

我有一個3D(或一般n維)矩陣A與尺寸由列向量乘法三維矩陣

size(A) = [d1 d2 d3 ... dn]. 

現在我想做的一個列向量v一個矢量乘法在一個維度(我會做在2個維度,在那裏我得到返回的載體 - 例如用於d1 = 2d3 = 4size(v) = d2),使

(A*d)_i = sum(a_ij*v_j). 

因此,我想通過一個維度減少。

是否有用於返回d3維列向量v

(A*v)_ij = sum(A_ijk*v_k). 

我希望這是一個明確的MATLAB函數(除循環等)。

謝謝!

回答

3

你可以做到這一點與一些reshape的:

A=rand(2,3,4); 
v=rand(1,4); 
reshape(reshape(A,[size(A,1)*size(A,2),size(A,3)])*v,[size(A,1) size(A,2)]) 

基本上,你重塑成一個二維矩陣A2((九),(K))= A((I),(J ),(k))的:

A2=reshape(A,[size(A,1)*size(A,2),size(A,3)]) 

然後,你做平常multiplcation:

所有(IJ)B2((IJ))= sum_k A2((IJ),(k))的* v ((k)):

B2=A2*v 

的你重塑回:

B((I),(J))= B((九))

B=reshape(B2,[size(A,1) size(A,2)]) 

我希望這是明確的

+1

好嗎 - 非常感謝。我希望有更順暢的事情,但我想這很公平。 – user1763302

+1

此方法僅適用於要相乘的維度是N-d矩陣的最後維度。如果代碼適用於N-D矩陣的任何維1 ... N,那將會很好。似乎可以在開始和結束時使用'dimshift'。 – cjh

+0

確實可以用'permute'實現......這需要幾分鐘的時間來思考它。隨意編輯我的答案,或者添加你自己的答案。我有一個最後期限。 – Oli

3

你可以這樣做有點平滑。對於矩陣reshape只需要1個參數,如果沒有指定,另一個會自動計算出來,這在這種情況下非常有用。

因此,由奧利奇提出的解決方案可以更簡單地寫成

A = rand(2,3,4); 
v = rand(4,1); 

A2 = reshape(A, [], numel(v));  % flatten first two dimensions 
B2 = A2*v; 
B = reshape(B2, size(A, 1), []);