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

时间:2016-07-12 18:03:39

标签: matlab

我有一个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 两个非单身尺寸 输入数组必须相互匹配。

如何在不使用循环的情况下解决问题?

1 个答案:

答案 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以获得正确的形状。