我有一个3D MATLAB函数。
我想将矩阵的每个切片乘以不同的数字。
我尝试在以下示例代码中通过 bsxfun 实现这一点:
a=randi(10,4,3,2);
b=[2 3];
c=bsxfun(@times,a,b)
我打算将"a"的第一个 4*3 切片乘以 2,第二个 4*3 切片
"a"乘以 3。但是,我只收到以下错误:
???使用 ==> bsxfun 时出错两者的非单例尺寸输入数组必须相互匹配。
如何在不使用循环的情况下解决问题?
正如错误所说,您需要使向量和矩阵的维度匹配。由于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
排列为正确的形状,通过使其在三维中扩展来乘以切片:
a = randi(10, 4, 3, 2);
b = [2 3];
bp = permute(b, [1 3 2]);
c = bsxfun(@times, a, bp)
在这种情况下,由于我们没有更改a
,我们不必再次排列c
以获得正确的形状。