我有調用從C++代碼生成的MEX的Matlab代碼。 C++代碼在初始化時需要大量的內存分配和計算。 使用靜態指針,初始化僅在第一次調用時完成,並且在隨後的調用中讀取指針。如何避免重複初始化.mex(matlab編譯代碼)?
一切正常,直到這個Matlab代碼使用Matlab編譯器編譯。現在隨後調用MEX(現在發生在matlab編譯代碼中)最終會崩潰,因爲靜態指針顯然引用了無效內存。
在這種情況下可以做些什麼來避免重複初始化?
感謝, 利奧
我有調用從C++代碼生成的MEX的Matlab代碼。 C++代碼在初始化時需要大量的內存分配和計算。 使用靜態指針,初始化僅在第一次調用時完成,並且在隨後的調用中讀取指針。如何避免重複初始化.mex(matlab編譯代碼)?
一切正常,直到這個Matlab代碼使用Matlab編譯器編譯。現在隨後調用MEX(現在發生在matlab編譯代碼中)最終會崩潰,因爲靜態指針顯然引用了無效內存。
在這種情況下可以做些什麼來避免重複初始化?
感謝, 利奧
非常好的問題。你可能不得不把它分解成兩個不同的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。這樣,當你創建靜態時,它可能應該保留在內存之間的調用。但我沒有證實這一點。
我不確定您是否已經解決了您的問題,但這裏有一些相關信息對我有幫助。
這似乎與我遇到的問題類似。當編譯同一個函數的新版本(其中一個存在內存訪問問題)時,我發現舊版本的mex函數實際上並沒有離開內存。我嘗試了很多東西,包括(據說)使用清除mex-file-name來清除matlab內存中的mex函數。防止重複訪問我發現的同樣有缺陷的mex函數的唯一成功方法是重新啓動matlab。這每次都解決了內存問題。雖然這種情況下和解決方案確切匹配您的問題,我的建議是嘗試重新啓動matlab。希望有所幫助。
你知道你的問題了嗎?如果你還沒有能夠提出一個簡短的示例代碼來重複你的問題嗎? – jmlopez
相關問題:[MATLAB MEX接口具有多個函數的類對象](http://stackoverflow.com/questions/1182183/matlab-mex-interface-to-a-class-object-with-multiple-functions)(檢查接受的答案) – Amro