【问题标题】:Efficiently Deleting Matrix Rows/Columns in MATLAB在 MATLAB 中有效地删除矩阵行/列
【发布时间】:2016-06-15 02:11:26
【问题描述】:

关于从矩阵中高效快速地删除给定行/列的任何提示?

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

谢谢!

【问题讨论】:

    标签: c matlab matrix mex


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 是的,我希望使用 mxSetN 获得的性能是它会简单地忽略最后一列并有效地删除它;这似乎是作者的意思。不幸的是,这对我来说并没有成功。归根结底,我认为最好的方法可能是发送java.util.ArrayList
    • 嗯,您可以使用 mxSetN 采用这种方法,它会做到这一点。在真正清理 mxArray 之前,它不会删除它,但 MATLAB 会将数组视为少一列。有什么不好的?你说你不能让它运行——问题是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2011-05-09
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多