我有一个3D MATLAB功能。
我想将矩阵的每个切片乘以不同的数字。
我尝试通过以下示例代码中的bsxfun实现此功能:
a=randi(10,4,3,2);
b=[2 3];
c=bsxfun(@times,a,b)
我打算将第一张4 * 3切片放在' a'将乘以2,并将第二个4 * 3切片乘以' a'将乘以3.
但是,我只收到以下错误:
???使用==>时出错bsxfun 两个非单身尺寸 输入数组必须相互匹配。
如何在不使用循环的情况下解决问题?
答案 0 :(得分:3)
如错误所示,您需要使矢量和矩阵的尺寸匹配。由于b
是行向量,因此可以将矩阵的切片制成列。您可以使用permute执行此操作:
a = randi(10, 4, 3, 2);
b = [2 3];
ap = permute(a, [1 3 2]);
c = bsxfun(@times, ap, b)
然后,要使结果矩阵恢复到正确的形状,您需要再次置换。您可以找出正确的排列顺序(在这种情况下恰好相同,即[1 3 2]
),或者您可以使用ipermute(反向置换)并让它为您解决。只需按照之前permute
给出的相同排列顺序。
c = ipermute(c, [1 3 2]);
或者,您可以将矢量b
置换为正确的形状,以通过使切片在第3维中扩展来相乘:
a = randi(10, 4, 3, 2);
b = [2 3];
bp = permute(b, [1 3 2]);
c = bsxfun(@times, a, bp)
在这种情况下,由于我们没有更改a
,因此我们不必再次置换c
以获得正确的形状。