2011-04-15 253 views
9

這使我困擾了一下:三維矩陣乘法與矢量

假設你有一個三層矩陣。

有一個簡單的方法,以使第一層(所有元素)獲取與向量的第一個元素相乘等三個元素的矢量乘這個矩陣...

現在我有用一個函數來做到這一點是這樣的:

function out=fun(matrix,vector) 

out=matrix; 
for k=1:3 
    out(:,:,k)=out(:,:,k)*vector(k); 
end 

有沒有一種有效的方法來做到這一點的只有一條線路,而不需要一個功能?

回答

17

一種非常簡潔的解決方案是reshapevector成1×1×3矩陣,並使用該函數BSXFUN進行逐元素乘法(它將複製尺寸根據需要匹配兩個的尺寸輸入參數):

newMatrix = bsxfun(@times,matrix,reshape(vector,[1 1 3])); 
+0

正是我想要的,謝謝! – shant 2011-04-15 20:46:18

+1

希望我可以再次爲你提供「rep乞丐」的讚賞:)令人驚訝的是,Jonas和其他人今天也有類似的評論,過去我不得不幾次提醒人們禮節。當問題得到解決後,似乎確實有一批一次性問題提出者拋棄現場。但是,我在這裏沒有足夠長的時間,所以這可能是正常的。 – abcd 2011-04-16 01:02:18

+0

@yoda:是的,看到一次發貼並永不返回的駕車用戶很常見。不能做太多的事情。然而,當我看到一位新用戶提出了一些明智的,寫得很好的問題,對評論給出了很好的反饋,並且通常以積極的態度行事,我認爲這值得*輕輕地*指向一些常見問題,詳細說明更多內部工作的SO。我認爲,如果他們瞭解更多信息,他們可能會更有可能返回,我們需要更多這樣的用戶。 – gnovice 2011-04-16 03:55:49

2

有一個叫做repmat的matlab函數可以幫助你。

M = [1 2 3] 
M * repmat([1 2 3], 3,1) 
ans = 

6 12 18 
6 12 18 
6 12 18 

M = [1 2 3] 
M .* repmat([1 2 3], 3,1) 
ans = 

1  4  9 
1  4  9 
1  4  9 

取決於你想如何組織你的矩陣。

1

另一種方式是重複矢量按大小矩陣匹配:

out = out.*shiftdim(repmat(vector(:),[1 size(out(:,:,1))]),1) 
1

除了gnovice的answer,你也可以沿着其他維度複製您的載體,做一個直接的元素方式乘法。

A=randn(1000,1000,3);%# this is your matrix 
vector=[1,2,3];%# this is your vector 

[dim1 dim2 ~]=size(A); 
replicatedVector=repmat(reshape(vector,1,1,3),[dim1,dim2,1]); 
out=A.*replicatedVector;