有效快速地从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代码的性能?
谢谢!
是的,我希望用mxSetN得到的性能是它会简单地忽略最后一列,并有效地删除它;这似乎是作者所说的。不幸的是,它并没有解决我的问题。最终,我认为这样做的最好方法可能只是一个'java.util.ArrayList'。 – genap
那么,你可以采用mxSetN的方法,它会这样做。它不会删除它,直到mxArray实际得到清理,但MATLAB会将该数组视为它有一个较少的列。什么没有解决这个问题?你说你不能让它运行 - 问题是什么? – CKT