2014-09-21 104 views
0

關於懶惰的複製:Matlab會不會複製傳遞給mexFunction的數據,這會修改它?Matlab有沒有複製傳遞給mex函數的數據?

例如在

myMex(input1(:,:,ii), input2(:,:,ii)) 

可以一個可以肯定的,即輸入矩陣不會被複制,這樣一方面可以傳遞的東西,並修改它,而不必返回一個參考?

+0

這是mex函數的一般方法。你是否試圖給一個變量作爲輸入,對它進行修改並查看函數後面的內容(沒有返回)。至少在我做的一些事情中,它會修改原來的一個。 – ASantosRibeiro 2014-09-21 12:07:24

+1

@ASantosRibeiro:你不應該修改輸入數組。 *(你可以這樣做,但是你必須告訴MATLAB「取消共享」它,這樣,父範圍中的其他變量也不會被意外修改,所以如果你有類似的東西:'y = x; myMexFcn (x);''而且你在MEX函數內部天真地修改'x','y'也會被修改!在其他情況下,可能會有更危險的後果,甚至會導致MATLAB崩潰。)* – Amro 2014-09-21 13:09:55

回答

3

在某些情況下,MATLAB執行一些優化以避免在calling functions時複製數據。

使用MEX函數,輸入爲const mxArray *prhs[]prhs是指向常數數據的指針數組)。儘管可以在不進行復制的情況下更改輸入變量(通過丟棄恆定性),但它是dangerous並且沒有官方支持,並且可能會產生意想不到的結果,甚至出現段錯誤(基於copy-on-write技術的帳戶)。官方回答是duplicate the input array,並返回修改後的數組。

如果您願意使用undocumented features,請參閱mxUnshareArray之類的。以下是article by Yair Altman更詳細的說明。

+0

因此,如果人們知道這些事實似乎沒有任何協議。在我的情況下,我想將3級4級循環移動到mex。這將節省相當數量的代碼,否則將不得不移植到C.我假設,如果mex函數是爲特定情況設計的,可能確實簡單地轉換了'const mxArray *',因爲該數組是爲由mex函數填充。 – embert 2014-10-02 11:18:08

+0

@embert:是的,我想是的(請閱讀我以前的評論以迴應ASantosRibeiro)。畢竟你可以在C/C++中做很多事情,只要你知道你在做什麼:)只要確保清楚地評論MEX調用的代碼就可以了,這表明這是一個潛在的危險操作,可能會在未來中斷版本。您還應該將MEX文件放在MATLAB函數旁邊的'private'文件夾中,這樣它不會被任何其他人調用,導致MATLAB崩潰。 – Amro 2014-10-02 16:56:41

相關問題