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()
Wow ... Das war einfach! Danke! Das hat das Problem gelöst! – Dirklinux