2016-06-15 137 views
0

有效快速地从Matrix中删除给定行/列的任何提示?有效删除MATLAB中的矩阵行/列

我最初认为删除给定矩阵的最后一列会比第一列更有效率,并且所有列操作比行操作(给出MATLAB的基于列的内存)更有效率,我能够通过测试确认。然而,我所获得的表现相当不幸。

someB = rand(4,50000); 
someC = someB.'; 

tic 
while size(someB,2) > 2 
    someB(:,size(someB,2)) = []; 
end 
toc 

tic 
while size(someC,1) > 2 
    someC(size(someC,1),:) = []; 
end 
toc 

%Elapsed time is 13.869280 seconds. 
%Elapsed time is 10.198270 seconds. 

我做了快速搜索,并在this MATLAB newsgroup discussion我发现,希望通过外部C MEX功能有可能确实是一种有效地快速删除矩阵的最后一列。代码附在下面。

#include "mex.h" 

// You may need to uncomment the next line 
//#define mwSize int 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
    mwSize n; 
    if(n = mxGetN(prhs[0])) 
     mxSetN(prhs[0], n - 1); 
} 

但是,我无法让自己的代码运行。如果您快速浏览作者发现的结果,您会发现相当出色的表现。我自己对MEX不太擅长;任何人都知道如何修正上面的代码,以便它运行,或者,有一个同样/几乎同样好的MEX代码/ MATLAB代码的性能?

谢谢!

回答

0

嗯,其中之一,您发布的MEX解决方案实际上并不是删除的列,所以这不是一个真正公平的比较。使用“mxSetN”的解决方案只是将mxArray的内部头设置为认为它具有N列。从文档:

您通常使用mxSetN来更改现有的mxArray的形状。 mxSetN函数不会为pr,pi,ir或jc数组分配或取消分配任何空间。

关于你看到的时间结果,如果你多次运行这个,会发生什么?我第一次跑这个时,我的结果与你的结果相似,但在第二次运行时,两种方法的时间都相似。

请记住,在任何情况下,您都必须重新分配大量内存,因为您一次只能删除4个元素。这意味着较早的循环迭代将比以后的迭代花费更多。

这里最大的问题就是你最终想做什么。也许你可以避免删除,只使用你需要的矩阵部分,或者有一些方法可以避免在每次迭代时删除单个列(而是多列)。

+0

是的,我希望用mxSetN得到的性能是它会简单地忽略最后一列,并有效地删除它;这似乎是作者所说的。不幸的是,它并没有解决我的问题。最终,我认为这样做的最好方法可能只是一个'java.util.ArrayList'。 – genap

+0

那么,你可以采用mxSetN的方法,它会这样做。它不会删除它,直到mxArray实际得到清理,但MATLAB会将该数组视为它有一个较少的列。什么没有解决这个问题?你说你不能让它运行 - 问题是什么? – CKT