我有一个函数f
,它应该给我一个矩阵,其中x
是从m
中逐元素减去的
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
类似于三维矩阵。
如果可能的话,我正在寻找最有效的方法,所以我不想使用循环。
谢谢你的帮助!
您不需要为此定义函数。只需将矢量移动到第三个维度并使用bsxfun
:
m = ones(4);
v = [5 7];
bsxfun(@minus, m, shiftdim(v(:),-2))
要添加到Luis Mendo接受的答案中,您可以使用permute
重新排列向量的维度,如果这比shiftdim
:更直观的话
v = [5 7];
bsxfun(@minus, m, permute(v,[3 1 2])) % 4x4x1 @minus 1x1x2 => 4x4x2
使用bsxfun
,这一切都是为了对齐非单例维度。请注意,当进行负(右)有效偏移时,您也可以像使用reshape(v,[1,1,size(v)])
一样使用reshape
从1x2偏移到1x1x2。