【问题标题】:Subtracting each element of A from every element of B从 B 的每个元素中减去 A 的每个元素
【发布时间】:2017-10-27 20:12:11
【问题描述】:

假设我有两个矩阵 A 和 B,其中: A 是 100x2 B 是 5x2

我想用 B 中的每个元素减去 A 的每个元素。我可以运行以下命令来实现我想要的:

for j = 1:5
    D = A - B(j, :);
    C = [C(:,:); D(:,:)];
end;

然而,对于巨大的矩阵,这很慢。我所有将其向量化的尝试都遇到了“不一致的论点”的错误

j = 1:5;
C = A - B(j, :);

如何压缩上述 for 循环以利用矢量化?

【问题讨论】:

    标签: matlab vectorization octave


    【解决方案1】:

    Permute axes,使用bsxfun 广播减法,reshape2D -

    reshape(bsxfun(@minus, permute(A,[1,3,2]), permute(B,[3,1,2])),[],2)
    

    implicit-broadcasting/implicit-expansion -

    reshape(permute(A,[1,3,2]) - permute(B,[3,1,2]),[],2)
    

    示例运行 -

    >> A
    A =
         1     2
         4     8
    >> B
    B =
         3     2
         5     6
    
    % Original loopy code
    >> C = [];  
    for j = 1:size(B,1)
        D = bsxfun(@minus, A, B(j, :));
        C = [C(:,:); D(:,:)];
    end;
    >> C
    C =
        -2     0
         1     6
        -4    -4
        -1     2
    
    % Proposed code
    >> reshape(bsxfun(@minus, permute(A,[1,3,2]), permute(B,[3,1,2])),[],2)
    ans =
        -2     0
         1     6
        -4    -4
        -1     2
    

    【讨论】:

      【解决方案2】:

      这样的事情可能会对你有所帮助:

      arrayfun(@(x) x*B, A, 'Uni', 0)
      

      【讨论】:

      • 谢谢!我尝试了 bsxfun 无济于事,但这有效!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多