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