2011-08-01 24 views
1

私はMathematicaで小さなmathlinkモジュールを使用しているFortranで書かれたスカラー関数を持っています。この関数は、シンボル定数の扱いを含め、できるだけネイティブのMathematica関数の近くで動作するようにしたい。Mathlinkと遅延評価/変数

私は何度もmathematicaにシンボリックな定数/変数を書いて、置き換えルールのリストで置き換えたいと思っています。しかし、Mathematicaは直ちにシンボリック引数を使用してmathlink関数を評価しようとしますが、明らかに失敗します。たとえば、でも次のような単純な式が

extf[a]/.a->5 

すべてのシンボリック引数が数字に置き換えられているまで、機能の評価を遅らせるための方法はありますが失敗しますか?

私はいくつかの成功を収めていますが(ただし、この関数を一般的なmathematicaパッケージに含めて同僚と共有したいのであれば)外部への「ダミー」参照をすべて評価することです私は他の数値定数をすべて評価すると同時に、実参照のすべてのダミー参照を交換するための置換規則を使用します。例えば

dummyf[a]/.{a->5,dummyf->extf} 
+0

どのような引数パターンを使用しましたか?引数のパターンが一致しない場合、関数は評価されずに戻ります。その時点で、置き換えが開始され、関数は数値引数で評価される必要があります。 –

答えて

4

Mathematicaパターンマッチャーを使用すると便利なものはありますか?入力が数字以外の場合は、holddummyfの定義を省略する必要があることに注意してください。

dummyf[a_?NumericQ] := extf[a] 
holddummyf[a_?NumericQ] := extf[a] 
dummyf[a_] := holddummyf[a] 

[In] dummyf[0.3] 
[Out] extf[0.3] 

[In] dummyf[b] 
[Out] holddummyf[b] 

[In] % /. b -> 5 
[Out] extf[5] 

私が聞いて、他の質問はFortranでextfを持つことが厳密に必要であるかどうかだと思います。

+4

私はあなたが 'holddummyf'のものはまったく必要としないと思います。それがなければ 'dummyf'は引数が数値でない場合には評価されずに戻ります。 –

+0

完全に動作します。以前はパラメータのパターンマッチングを使用していませんでしたが、Mathematicaがこの機能を持っているかどうかはわかりませんでした。 extfはPythonライブラリ(複雑なエラー関数を計算するための最適化された数値ルーチン)から取られていますが、Mathematicaで記述することができますが、時間がかかりますし、コードを高速化するドロップイン最適化関数が必要です短期間で – crasic

+0

@ブレット、良い点。もともと私は、それが未定義のままにするというトリックを使うのではなく、 'dummyf [a_]'の一般的な定義をしたいと思っていたので、未定義のものが必要です。その後、何が起こっているのかがはっきりしています。しかし私は自分の答えを編集することができます。 – Verbeia