2014-01-22 81 views
3

我有一個很好的.net程序集的核心matlab函數,當然是用matlab編譯器創建的。對於接受數字或數組數組的函數,這沒問題;我可以在C#中編寫代碼,而無需恢復到matlab(嗯,RCM必須安裝;這很好)。將matlab函數集成到c#項目中

但是,對於那些必須引用其他函數的函數,我至今可以找到一個獲取c#程序的唯一方法就是將這兩個函數編譯到程序集中。爲了更好地解釋,假設我有一個庫,其中存儲了ode45例程。如果我想解決一個特定的公式,讓我們說一些簡單的像DY/DX = -y,然後我要創建可寫的MATLAB腳本文件,如下所示:

function dydx = diffeq(x, y) 
dydx = -y 

[明顯的解析解存在,但爲了這個例子,讓我們說我想要這樣解決]

現在爲了解決這個等式,我將不得不添加此函數作爲我的類中的一個方法來編譯到.net部件。這當然會破壞我的圖書館的普遍性;我需要將不同庫中的特定於應用程序的方程式與我的核心數學函數庫進行比較。也就是說,ODE45方法應該位於比「difffeq」方法所在的庫更「核心」的庫中。我更喜歡在c#類中創建「diffeq」方法,我可以直接在例如編輯器中編輯這些方法。 VS2012。我想直接編輯公式,而不是每次都輸入matlab並重新編譯程序集。

爲了解決這個問題,我已經到了包含ode45代碼和我的微分方程方法的程序集反編譯的程度;原來這個程序集只不過是與MCR的接口;在裝配diffeq方法返回類似以下的東西:

return mcr.EvaluateFunction(numArgsOut, 「diffeq」, new object[0]); 

我們注意到,函數/方法「diffeq」不是MCR的一部分; MCR不會改變。但是,我無法在程序集中的任何位置找到方程。

這引出了一個問題:「老兄,這裏是我的功能?」

還有就是組件的「資源」部分中,我們發現[類名] .ctf,並在我們會發現一些機器代碼。這看起來是加密的,但公式可能隱藏在那裏。如果是這樣,那將是我嘗試阻止的故意嘗試,並且對MathWorks的讚揚使我無法避免輸入matlab應用程序!

但是,似乎沒有任何許可證可以阻止我想要做的事情;我認爲,如果數學作品能夠讓人們接受這樣的方法,那將是非常棒的,但是在這個環節中,有沒有人知道如何做到這一點?

回答

1

「MATLAB編譯器」有一個有點誤導性的名字。它是一個部署解決方案比在實際意義上的編譯器(見下面的註釋)更多。它主要是將MATLAB應用程序分發給最終用戶,而不需要完全安裝MATLAB(僅需要安裝免版稅的MCR runtime)。

MCR實際上是一個精簡版的MATLAB引擎以及附帶的庫。

使用MATLAB編譯器生成二進制包時,結果是調用MCR運行時的特定於目標的包裝(無論是獨立應用程序,C/C++共享庫,Java包還是.NET程序集) 。生成的二進制文件包含一個嵌入的CTF存檔文件,其中包含所有原始的MATLAB內容(您的M文件和其他依賴項),但是以加密形式存在。首次執行時,CTF歸檔文件被提取到一個臨時文件夾,然後在運行時像典型的MATLAB代碼一樣,MCR文件(仍然是加密的)被MCR解釋。

有一個在deploytoolmcc -C)選項告訴編譯器不嵌入二進制作爲資源裏面的CTF存檔,而不是把它作爲一個單獨的文件旁邊生成的二進制(這CTF歸檔可以檢查作爲普通的ZIP文件,但裏面的源文件仍然是加密的)。

有關更多信息,請參見下面的文檔頁面:

Application Deployment Products and the Compiler Apps


PS:事實是MATLAB Compiler開始了作爲一個產品MATLAB代碼轉換成完整的C/C++代碼,它使用了現在已停用的「MATLAB C/C++數學庫」(無需運行時需求,只需編譯生成的C++代碼並鏈接到某些共享庫;結果是真正的編譯可執行文件不是包裝)。在MATLAB 7發佈的時候,這個功能完全是changed(原因是舊的方式只支持MATLAB語言的一個子集,而使用當前的MCR機制可以部署幾乎任何代碼)。多年以後,MATLAB增加了一款新產品來替代曾經刪除的代碼翻譯功能,即MATLAB Coder

+0

所以你說,正常的MATLAB代碼可以在程序運行時訪問臨時文件夾內? –

+0

對不起,我的措辭有點模棱兩可,提取的文件保持加密形式(AES加密)。我想MCR知道祕密的對稱密鑰,因此能夠解密然後照常執行代碼。有趣的是,只有M文件被加密了(還有其他的資源文件和來自你的''prefdir''的包含在CTF檔案中的未加密的首選項)。目錄結構使用相同的文件名進行復制,但M文件中的內容基本上是亂碼。 – Amro