将 MATLAB 3D 数组的每个切片除以不同的数字



我有一个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以获得正确的形状。

最新更新