2011-09-11 61 views
4

我有調用從C++代碼生成的MEX的Matlab代碼。 C++代碼在初始化時需要大量的內存分配和計算。 使用靜態指針,初始化僅在第一次調用時完成,並且在隨後的調用中讀取指針。如何避免重複初始化.mex(matlab編譯代碼)?

一切正常,直到這個Matlab代碼使用Matlab編譯器編譯。現在隨後調用MEX(現在發生在matlab編譯代碼中)最終會崩潰,因爲靜態指針顯然引用了無效內存。

在這種情況下可以做些什麼來避免重複初始化?

感謝, 利奧

+1

你知道你的問題了嗎?如果你還沒有能夠提出一個簡短的示例代碼來重複你的問題嗎? – jmlopez

+0

相關問題:[MATLAB MEX接口具有多個函數的類對象](http://stackoverflow.com/questions/1182183/matlab-mex-interface-to-a-class-object-with-multiple-functions)(檢查接受的答案) – Amro

回答

1

非常好的問題。你可能不得不把它分解成兩個不同的mex函數,一個計算初始化並返回結果,另一個函數執行你的函數。

[heavyCompResults,otherHeavyResults] = initComputation(initParams); 

然後:

performComputation(compParams,heavyCompResults,otherHeavyResults); 

或者,你可以在一個文件中寫出來的東西,而不是將其通過Matlab的的。

initComputation(initParams,initResultsFname); %writes initResultsFname 

然後:

performComputation(compParams,initResultsFname); %reads initResultsFname 

一個比較另類:

讓你的代碼放到一個DLL,並使用loadLibrary function in Matlab。這樣,當你創建靜態時,它可能應該保留在內存之間的調用。但我沒有證實這一點。

0

我不確定您是否已經解決了您的問題,但這裏有一些相關信息對我有幫助。

這似乎與我遇到的問題類似。當編譯同一個函數的新版本(其中一個存在內存訪問問題)時,我發現舊版本的mex函數實際上並沒有離開內存。我嘗試了很多東西,包括(據說)使用清除mex-file-name來清除matlab內存中的mex函數。防止重複訪問我發現的同樣有缺陷的mex函數的唯一成功方法是重新啓動matlab。這每次都解決了內存問題。雖然這種情況下和解決方案確切匹配您的問題,我的建議是嘗試重新啓動matlab。希望有所幫助。