2011-08-01 78 views
1

我有一個用Fortran寫的標量函數,我在Mathematica中通過一個小數學模塊使用。我希望這個函數儘可能接近本地Mathematica函數,包括處理符號常量。Mathlink和延遲評估/變量

很多時候我希望在mathematica中用符號常量/變量寫一些表達式,這些符號常量/變量將被替換規則列表替換。然而,Mathematica立即嘗試用符號參數來評估我的數學運算函數,它顯然失敗了。例如,即使下面這個簡單的表達式將失敗

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

@Brett,好點。我原本以爲他會希望對'dummyf [a_]'有一個通用的定義,而不是使用這個未定義的技巧,所以它需要其他未定義的東西。現在更清楚的是當時正在發生的事情。但我可以編輯我的答案。 – Verbeia