【问题标题】:Write function for bsxfun with if/else使用 if/else 为 bsxfun 编写函数
【发布时间】:2017-09-15 20:10:44
【问题描述】:

在我的代码中,我需要将矩阵的每个值除以另一个矩阵的值。我可以使用A./B,但 B 中的某些元素为 0。我知道如果 B(i,j) = 0 则 A(i,j) = 0 也希望 0/0 = 0。所以我写了一个函数 div,我使用 bsxfun 但我没有 0,我有 NaN :

A = [1,0;1,1];
B = [1,0;1,2];
function n = div(a,b)
   if(b==0)
      n = 0;
   else
      n = a./b;
   end
end
C = bsxfun(@div,A,B);

【问题讨论】:

    标签: matlab if-statement bsxfun


    【解决方案1】:

    为什么不直接替换不需要的值呢?

    C=A./B;
    C(A==0 & B==0)=0;
    

    您可以使用C(isnan(C))=0;,但这将替换所有NaN,即使是那些不是由0/0 创建的。如果零总是一起出现,那么C(B==0)=0; 就可以了

    【讨论】:

      【解决方案2】:

      如果您知道 B 中的非零值永远不会小于一个非常小的数字 eps(例如 1e-300),那么一个简单的技巧就是将 eps 添加到 B。所有非零值都保持不变,而所有零值变为 eps。除以 0/eps 时,您会得到想要的结果。

      【讨论】:

        【解决方案3】:

        发生这种情况的原因是bsxfun 没有按元素处理数组。因此,您的函数不会包含两个标量。它实际上只被调用一次。您的if 语句不适用于b 的非标量值。

        bsxfun 替换为arrayfun 将使用标量输入调用您的函数,并将产生预期的结果:

        >> C = arrayfun(@div,A,B)
        C =
            1.0000         0
            1.0000    0.5000
        

        尽管如此,其他两个答案中的任何一个都会更有效:

        >> C = A./B;
        >> C(B==0) = 0   % Ander's answer
        C =
            1.0000         0
            1.0000    0.5000
        

        C = A./(B+eps)   % user10259794's answer
        C =
            1.0000         0
            1.0000    0.5000
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-25
          • 2021-07-30
          • 1970-01-01
          • 1970-01-01
          • 2022-11-22
          • 2019-04-21
          • 1970-01-01
          • 2021-06-07
          相关资源
          最近更新 更多