从矩阵中减去每个向量元素的有效方法

时间:2013-12-14 15:55:29

标签: performance matlab matrix bsxfun

我有一个函数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

{{1}}

类似于三维矩阵。

如果可能的话,我正在寻找最有效的方法,所以我不想使用循环。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您无需为此定义函数。只需将矢量移至第三维,然后使用bsxfun

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

答案 1 :(得分:2)

要添加到Luis 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。