【问题标题】:Dividing each slice of a MATLAB 3D array by a different number将 MATLAB 3D 数组的每个切片除以不同的数字
【发布时间】:2016-07-12 18:03:39
【问题描述】:

我有一个 3D MATLAB 函数。

我想将矩阵的每个切片乘以不同的数字。

我尝试在以下示例代码中通过 bsxfun 实现这一点:

 a=randi(10,4,3,2);
 b=[2 3];
 c=bsxfun(@times,a,b)

我打算将“a”的第一个 4*3 切片乘以 2,而“a”的第二个 4*3 切片将乘以 3。

但是,我只收到以下错误:

???使用 ==> bsxfun 时出错 两者的非单一维度 输入数组必须相互匹配。

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

【问题讨论】:

    标签: matlab


    【解决方案1】:

    正如错误所说,您需要使向量和矩阵的维度匹配。由于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 以获得正确的形状。

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 2017-04-10
      • 1970-01-01
      • 2013-06-18
      • 2020-05-07
      • 2018-03-02
      • 2015-10-15
      • 1970-01-01
      • 2016-08-24
      相关资源
      最近更新 更多