MEX是Matlab用來在Matlab中運行C/C 函式的框架(運行速度更快)。在檔案中,它說:
輸入引數(在prhs陣列中找到)是只讀的;不要在你的MEX檔案中修改它們。改變輸入引數中的資料會產生不希望看到的副作用。
這僅僅是一個警告,即改變作為指標傳遞的變數將改變該變數,甚至在函式之外(與Matlab的作業方式不同),還是有一種更微妙的方式,這可能會擾亂Matlab/MEX介面?
我問的原因是我特別想讓MEX函式為實數修改引數。
uj5u.com熱心網友回復:
MATLAB使用懶惰復制,這意味著當你做b = a時,變數b指向與變數a相同的資料,即使在語意上你做了一個拷貝。例如,當您現在做a(1) = 0時,您修改了變數a,而MATLAB首先做了一個拷貝,這樣變數b就不會受到賦值的影響。這顯然可以節省大量的記憶體,因為很多副本都是在沒有修改的情況下進行的。
例如,在呼叫變數a時,MATLAB會先做一個副本,這樣變數b就不會受到賦值的影響。
例如,當呼叫一個函式時,輸入變數的副本被放置在函式的作業區。sum(a)導致a的一個(懶惰的)副本在函式內可用。如果該函式不需要修改該變數,那么就可以避免復制。如果函式需要修改它,那么就會產生一個副本,這樣a就不會被呼叫者改變。
MEX檔案的作業方式與此相同,只是MATLAB無法檢測到您是否修改了輸入變數,所以它無法在您修改之前進行復制。因此出現了警告。你需要呼叫mxDuplicateAreay來復制陣列并對你的新副本進行修改。
檔案中警告的副作用是,呼叫者作業空間中的變數以及與之共享資料的所有變數都被修改。例如,設想你做了一個MEX-檔案函式modifyIn,修改了輸入,那么:
a = zeros(500)。
b = a;
% 在代碼的后面...
modifyIn(b); % 以我想要的方式更新b!。
會非常意外地同時修改a!
這篇關于Undocumented MATLAB的博文更詳細地談到了這個問題,并談到了mxUnshareArray(),這是一個無檔案的函式,只有當你真的對可能發生的崩潰和其他問題感到滿意時,你才能使用。未記錄的函式的保質期是有限的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/332636.html
標籤:
上一篇:如果API頁面無效,如何關閉websocket連接?
下一篇:Mongoose更新檔案
