你是對所有點。 ILNumerics目前沒有優化軟件包。但是,正如您所知,.NET的一大優勢是易於整合外部封裝。有幾個選項存在這裏:
的PInvoke(本機模塊)
由於大多數現有的優化包存在作爲本機模塊,PInvoke的是你的朋友。存在幾種自動DLLImport簽名生成工具。我個人更喜歡創建這些簽名manually。尤其是,由於大多數科學軟件包都提供了一個簡單的簽名,該簽名很容易併入.NET。但是,從本機到託管代碼的回調和複雜結構的編組問題可能會出現。 (SO,我們將幫助您解決所有這些...
.NET模塊
您可能會發現現有的.NET優化模塊。看到這個職位(Free Optimization Library in C#)或嘗試使用Microsoft求解基礎,更好的模塊可已經存在 - 我還沒有找過一段時間,除非執行過程非常仔細,否則它們可能會因性能不佳(無)內存管理而受到影響(據我所知,沒有其他項目會跟蹤內存與ILNumerics相同的有效方式)但是,連接這些庫會很容易:不需要DLLImport簽名,但爲了從ILNumerics內存管理中獲益,必須在'ILNumerics'一側管理數組內存。因此,模式給一些System.Array的一些其他.NET功能將是:
.... inside ILNumerics function
using (ILScope.Enter(inparameter1,inparameter2)) {
....
ILArray<double> A = zeros(1000,1000); // allocate memory for external use
var aArray = A.GetArrayForWrite(); // fetch reference to underlying System.Array
callOtherLib(aArray); // let other lib use and fill the array
// proceed normally with A...
return A + 1 * 2 ... ;
}
如果其它LIB從給定的陣列讀取只,A.GetArrayForRead()可以給出更好的性能。通過使用該方案,可以確保最有效的內存使用 - 至少在實現的ILNumerics方面。
從兩側混合數據結構不會造成任何傷害 - 但通常也不會帶來太多好處:通常這會減少方便的語法,因爲沒有用於混合矩陣實現的組合運算符。此外,您經常會被迫將您的矩陣訪問分解爲元素操作,這可能導致性能較低的解決方案。因此,我建議使用明確分離的API的模塊化設計。
上述內存方案也適用於(並建議)接口本機庫。當然 - -
使用ILNumerics只有
另一種方法是重新實現一些自己的模塊,使用內置的功能和特性陣列ILNumerics。這種方式是強制性的,以便任何軟件包都被納入官方的ILNumerics發行版。它帶來了幾個優點:可以利用方便的ILNumerics語法,自動從高效的ILNumerics內存管理中獲益,並且代碼將在最終完全與平臺無關。此外,這爲您提供了關於算法所需功能的最大靈活性。
感謝如常。我想我正走向艱難的道路:編碼我自己的優化器。因此我想我還有一個問題:我可以使用並行化,即Parallel類,還是ILArrays?處理這個問題的最好方法是什麼?我應該把它們當作任何數據結構嗎?在此先感謝 –
ILNumerics中的所有內置函數在內部自動並行化。但是,ILArray不*線程安全。在多線程場景中處理ILArray時,您將不得不使用通用同步選項。如果您有其他疑慮,請打開一個新問題。 –