2012-06-14 19 views
1

我寫了一個Matlab腳本進行分類。當我執行這個我得到內存不足的錯誤。高效的MATLAB代碼找到分類錯誤

for i =1:size(Y) 
    if(predictions(i) ~= clasL(find(ismember(mydata,X(i)),'rows'))) 
     error = error+1; 
    end 
end 

在上面的代碼Ypredictions是維的矢量19928.而mydataX是19928 * 62061和12819點* 62061矩陣。當我執行以下代碼時,出現以下錯誤

Error using == 
Out of memory. Type HELP MEMORY for your options. 

Error in ismember (line 62) 
      tf = (a == s); 

Error in myinit (line 105) 
if(predictions(i) ~= clasL(find(ismember(mydata,X(i)),1))) 

如何克服此問題?請幫幫我。 謝謝

+0

'clasL'是你自己的自定義函數嗎?修改和修復代碼以解決內存問題是困難的或不可能的,而無需知道'clasL'的功能。你可以編輯你的問題,並在其中包含'clasL'函數的代碼? – nrz

+0

對不起。 clasL是維度19928的另一個向量。基本上,clasL包含原始類別標籤,並且預測包含預測的類別標籤。 –

回答

1

首先嚐試在MATLAB過程中運行ulimit,以便它可以使用盡可能多的內存。

其次,我想你想的參數的順序切換到ismember

ismember(X(i, :), mydata, 'rows') 

第三,你不要,如果你更改參數的順序需要額外find功能。那麼只需做到這一點(內循環):

[~, idx] = ismember(X(i, :), mydata, 'rows') 
if (idx > 0 && predictions(i) ~= clasL(idx)) 
    error = error+1; 
end 

四,以節省時間,可以爲所有行的X(無循環)運行ismember只是一次,然後找到錯誤的數量一個矢量化的方式:

[~, idxs] = ismember(X, mydata, 'rows') 
error = sum(predictions(idxs > 0) ~= clasL(idxs > 0)) 
+0

謝謝。我做了建議的更改並運行算法。即使現在我也遇到了同樣的錯誤。 '錯誤使用==內存不足。爲您的選項鍵入HELP MEMORY。 ismember中的錯誤(第225行) d = c(1:end-1,:)== c(2:end,:); %d表示2-D中的匹配條目 myinit中的錯誤(行104) [〜,idxs] = ismember(X,mydata,'rows')' –

+0

運行ulimit沒有幫助?然後嘗試循環版本。如果這樣也行不通,你需要在具有更多內存的機器上運行它,或者對mydata進行排序,然後搜索或者更復雜的東西。 – Ansari

+1

如果仍然不起作用,請將'mydata'拆分,在部件上運行ismember命令並連接結果。 – Ansari