2013-12-14 46 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

我敢打赌,这不会是你这个周末的最后一次! –