2012-04-14 14 views
2

scipy.weave.inlineを使用しているときに問題があります。私は、lcenterを中心としたunitstep関数と、width_nmのwithを使ってプログラムを作成したいと考えています。私は2つのバージョンがあります:pmと最適化された関数pm_weaveというPythonバージョンですが、absが正しく動作していないようです。以下のコードを参照してください。あなたがそれを実行すると、入力が何であっても、織りバラエティーのサイズ1のウィンドウが表示されるので、absが機能しないように見えます。たとえば、ABSを取り除くと、まったく同じように動作します数学ライブラリでscipy.weave.inlineが期待通りに機能しない

どうすればこの問題を解決できますか?

def pm_weave(w,lcenter,width_nm): 
    """ Return a unitstep function that is centered around lcenter with height 1.0 and width width_nm """ 
    lcenter = float(lcenter) 
    w = float(w) 
    width_nm = float(width_nm) 
    code = """ 
    #include <math.h> 
    float wl = 1.88495559215387594307758602997E3/w; 

    if(abs(lcenter-wl) < width_nm) { 
    return_val = 1.0; 
    } 
    else { 
    return_val = 0.0; 
    } 
    """ 
    res = weave.inline(code,['w','lcenter','width_nm'], 
        type_converters = weave.converters.blitz, 
        compiler = "gcc", headers=["<math.h>"] 
        ) 
    return res 



def pm(w,lcenter,width_nm): 
    """ 
    Return a unitstep function centered around lcenter [nm] with width width_nm. w 
    should be a radial frequency. 
    """ 
    return abs(600*np.pi/w - lcenter) < width_nm/2. and 1. or 0. 



plot(wavelength_list,map(lambda w:pm(toRadialFrequency(w),778,1),wavelength_list),label="Desired behaviour") 
plot(wavelength_list,map(lambda w:pm_weave(toRadialFrequency(w),778,1),wavelength_list),'^',label="weave.inline behaviour") 
ylim(0,1.5) 
show() 

答えて

2

私はあなたのCコードでfabs()代わりのabs()を使用する必要があるかもしれないと思います。 abs()は結果を切り捨てますが、fabs()は浮動小数点演算に使用できます。

+0

うわー...それは簡単でした! ありがとう!それが問題を解決しました! – Dirklinux