在MATLAB中有效删除矩阵行/列

时间:2016-06-15 02:11:26

标签: c matlab matrix mex

有关从Matrix快速有效地删除指定行/列的提示吗?

我最初认为删除给定矩阵的最后一列比第一列更有效,并且所有列操作都比行操作(给定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代码性能?

谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,首先,你发布的MEX解决方案实际上并没有删除列,所以这不是一个公平的比较。使用“mxSetN”的解决方案只是将mxArray的内部头设置为认为它有N列。来自文档:

  

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

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

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

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