2013-12-14 42 views
2

減去每個矢量元素的有效辦法,我有一個函數f應該給我在哪裏xm從矩陣

m = ones(4); 
f = @(x) m-x; 

當我調用此函數與

f(5) 
減去元素方式矩陣

一切工作正常。

但我怎麼能調用這個函數與向量

f([5,7]) 

,所以我得到

-4 -4 -4 -4 
-4 -4 -4 -4 
-4 -4 -4 -4 
-4 -4 -4 -4 

-6 -6 -6 -6 
-6 -6 -6 -6 
-6 -6 -6 -6 
-6 -6 -6 -6 

在類似的3維矩陣。

如果可能我正在尋找最有效的方法來做到這一點,所以我不想使用循環。

謝謝你的幫助!

回答

3

你不需要爲此定義一個函數。就在向量轉移到第三個維度,並使用bsxfun

m = ones(4); 
v = [5 7]; 
bsxfun(@minus, m, shiftdim(v(:),-2)) 
+1

Makin'看起來很容易。爲了完整性,我使用'permute'添加了一個變體。 – chappjc

2

要添加到路易斯Mendo的接受的答案,你可以使用permute重新排列向量的尺寸,如果這是更直觀的你比shiftdim

v = [5 7]; 
bsxfun(@minus, m, permute(v,[3 1 2])) % 4x4x1 @minus 1x1x2 => 4x4x2 

隨着bsxfun,這是關於對齊的非單身維度。請注意,在執行負向(右側)有效班次時,您還可以使用reshape(如reshape(v,[1,1,size(v)]))從1x2切換到1x1x1x2。

+0

...這是我對週末的貢獻! – chappjc

+2

我敢打賭,這不會是你這個週末的最後一次! –