2013-03-16 62 views
1

我想實現一個分段周期函數,它在某些時間間隔內應該爲零,並且看起來像其他地方的測試函數(例如exp(a^2/(abs(x)^2-a^2))abs(x)< a,否則爲零)。
我試圖從matlab中的匿名函數接收NaN

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

爲這些值逐個評估函數,你會看到NaN來自哪裏;)btw:'0 * NaN + 1 = NaN' – 2013-03-16 12:17:14

回答

0

我在執行矢量化計算時使用的一個技巧是,其中存在除零或相關錯誤的風險,即使用條件來修改問題值。例如,假設您想要反轉向量中的所有條目,但將零置於零(並將1e-8內的任何值設置爲零)。你可以這樣做:

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

對於滿足條件abs(value)> 1e-8的值,計算1 /值。如果abs(值)< = 1e-8,它實際上計算1 /(值+ 1),然後乘以零,導致零值。沒有分母內的條件,當值爲零時,它會計算1 /值,導致inf ...,然後將inf乘以零,導致NaN。

相同的技術應該與你更復雜的匿名函數一起工作。