从matlab中的匿名函数接收NaN

时间:2013-03-16 10:55:20

标签: matlab anonymous-function nan piecewise

我想实现一个分段周期函数,它在某些时间间隔内应为零,并且在其他地方看起来像一个测试函数(例如exp(a^2/(abs(x)^2-a^2))abs(x)< a,否则为零)。
我试过了

nu = @(x) ((8*10^(-4)/exp(1)*exp(30^2./(abs(mod(x,365)-31).^2-30.^2))).* ... 
        and((1<mod(x,365)),(mod(x,365)<61)) + ...
      (8*10^(-4)/exp(1)*exp(10^2./(abs(mod(x,365)-300).^2-10.^2))).* ...
        and((290<mod(x,365)),(mod(x,365)<310)));
分别

nu = @(x) ((0*x).* and((0<=mod(x,365)),(mod(x,365)<=1)) + ...
      (8*10^(-4)/exp(1)*exp(30^2./(abs(mod(x,365)-31).^2-30.^2))).* ... 
        and((1<mod(x,365)),(mod(x,365)<61)) + ...
      (0*x).* and((61<=mod(x,365)),(mod(x,365)<=290)) + ...
      (8*10^(-4)/exp(1)*exp(10^2./(abs(mod(x,365)-300).^2-10.^2))).* ...
        and((290<mod(x,365)),(mod(x,365)<310)) + ...
      (0*x).* and((310<=mod(x,365)),(mod(x,365)<365)));

应该表现相同。目标是有一个[0,365]的周期,因此是模数。

现在我的问题是nu(1)=nu(61)=nu(290)=nu(310)=NaN以及它们的一个小邻域,例如nu(0.99)=NaN。但是我从指数函数中排除了这些点,这会导致问题。即使我对指数函数使用较小的区间(例如(2,60)和(291,309)),我也会在相同点接收NaN

有什么想法吗?谢谢你的建议!

1 个答案:

答案 0 :(得分:0)

我在执行矢量化计算时使用的一个技巧是使用条件来修改问题值,其中存在被零除或相关错误划分的风险。例如,假设您想要反转向量中的所有条目,但是将零保留为零(并将任何值设置为1e-8也为零)。你这样做:

outVect = 1./(inVect+(abs(inVect)<=1e-8)).*(abs(inVect)>1e-8);

对于满足abs(值)> 1e-8的条件的值,这计算1 /值。如果abs(值)&lt; = 1e-8,它实际上计算1 /(值+ 1),然后乘以零,得到零值。如果没有分母内的条件,它将在值为零时计算1 /值,导致inf ...然后将inf乘以零,从而产生NaN。

同样的技术应该适用于更复杂的匿名函数。