使用if / else为bsxfun写函数

时间:2017-09-15 20:10:45

标签: matlab if-statement bsxfun

在我的代码中,我需要将矩阵的每个值除以另一个的值。我可以使用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);

3 个答案:

答案 0 :(得分:3)

为什么不在以后更换不需要的值?

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

您可以执行C(isnan(C))=0;,但这会替换所有NaN,即使是0/0未创建的C(B==0)=0;。如果零总是一起发生,那么只需要public int add(params int[] args) { int Total = 0; for (int i = 0; i < args.Length; i++) { Total += args[i]; } return Total; }

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

>> 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