2

scipy.weave.inlineの使用に問題があります。lcenterを中心とし、width_nmのwithを使用してunitstep関数をプログラムしたいと思います。私には2つのバージョンがあります:pmと呼ばれるpythonバージョンとpm_weaveと呼ばれる最適化された関数ですが、absが正しく機能していないようです。以下のコードを参照してください。これを実行すると、入力内容に関係なく、織りの種類に応じてサイズ1のウィンドウが表示されるため、absが機能していないように見えます。たとえば、腹筋を削除すると、期待どおりに機能します

どうすればこれを修正できますか?

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

1 に答える 1

2

Cコードのfabs()代わりに使用する必要があるかもしれません。結果を切り捨てますが、浮動小数点演算では機能します。abs()abs()fabs()

于 2012-04-14T22:57:43.980 に答える