2012-06-14 18 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