2012-04-14 4 views
2

Ich habe ein Problem mit scipy.weave.inline. Ich möchte eine Unitstep-Funktion programmieren, die um lcenter zentriert ist, und mit einer Breite von width_nm. Ich habe zwei Versionen: Die Python-Version namens pm und eine optimierte Funktion namens pm_weave, aber es sieht so aus, als würde abs nicht richtig funktionieren. Siehe den folgenden Code. Wenn Sie es ausführen, erhalten Sie ein Fenster der Größe 1 für die Webart, egal was die Eingabe ist, also sieht es so aus, als ob die Bauchmuskeln nicht funktionieren. Wenn Sie zum Beispiel die Bauchmuskeln entfernen, funktioniert es genau so, wie Sie es erwarten.scipy.weave.inline funktioniert nicht wie erwartet mit Math-Bibliothek

Wie kann ich das beheben?

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() 

Antwort

2

Ich glaube, Sie könnten fabs() statt abs() im C-Code verwenden müssen. abs() wird das Ergebnis abgeschnitten, während fabs() für Gleitkommaarithmetik funktioniert.

+0

Wow ... Das war einfach! Danke! Das hat das Problem gelöst! – Dirklinux

Verwandte Themen