我想实现一个分段周期函数,它在某些时间间隔内应为零,并且在其他地方看起来像一个测试函数(例如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
。
有什么想法吗?谢谢你的建议!
答案 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。
同样的技术应该适用于更复杂的匿名函数。