【问题标题】:Best way to delete first row from matrix in matlab在matlab中从矩阵中删除第一行的最佳方法
【发布时间】:2014-09-11 19:15:33
【问题描述】:

我计划多次删除矩阵的第一行,并且想知道最好/最有效的方法是什么。

我知道我可以做这样的事情

  M(1,:)=[]

M = M(2:end)

但我不确定哪种方法最好,或者是否有其他更好的方法。

【问题讨论】:

  • 您是否尝试过使用tic toc 自己检查一下?
  • 我在某处读到 MATLAB 以列为主的方式存储矩阵。如果您能够构建转置的数据,删除第一列应该会提高性能。

标签: matlab matrix row


【解决方案1】:

嘿刚刚用tictoc 测试了这两种方法 这是我使用的代码:

A=rand(100,100000);
tic
a=A(2:end,:);
t1=toc
tic
A(1,:)=[];
t2=toc

结果如下:

t1 =

    0.0603    

t2 =

    0.0744

如果你使用更长的列,它会变得更加明显:

A=rand(10000,100);
t1 =

    0.0083  

t2 =

    0.0124

所以保存要保留的列似乎更快。

编辑

有人评论tictoc在毫秒域中不“值得信赖”,因此建议使用循环多次运行代码。但结果不会改变

A=rand(100,100000);
size_A=size(A);
tic
for k=1:1:100
    A1=A;
    A1=A1(2:end,:);
end
t1=toc
tic
for k=1:1:100
    A1=A;
    A1(1,:)=[];
end
t2=toc 

这会导致:

t1 =

    7.5237

t2 =

   15.2234

【讨论】:

  • 你的时间太短了,我认为不可靠。试着把它放在一个循环中?我对您的矩阵的发现实际上与我认为的相反。
  • @EJG89 我真的不明白为什么时间应该太短,毕竟 matlabs 的优势是他快速简单的矩阵处理,我对这两种方法使用相同的数据集,即使重新运行多次编程结果(不是值,而是它们之间的关系)不会改变。如果您添加循环,您将彻底改变使用的方法。
  • 速度很快,这就是此类过程的时间问题。像这样的时间可能会包含初始化过程。我个人发现在毫秒范围内使用 tic toc 并不那么值得信赖,因为测试之间的偏差非常大。使用循环多次对单个事件进行计时可以有效地创建大量测试,从而提高可靠性。
  • @EJG89 我在tictoc 命令中使用了您的代码,结果没有改变。所以要么tic,toc 不起作用,要么你在某处有错误。我正在编辑我的帖子。
  • 下面的文档就是我的代码。当然不同的处理器、操作系统版本、matlab版本等都会影响性能。
【解决方案2】:

通常,保留您想要的内容可能会更快。根据矩阵的尺寸,结果可能会有所不同。考虑以下测试用例,其中生成两个矩阵 A1 和 B1,尺寸分别为 100x100000 和 100000x100。结果是从 Profile Viewer 中获得的,但 tic toc 测量证实了这些结果。

A1=rand(100,100000);

for ii=1:100
    A=A1;
    A=A(2:end,:);
end

for ii=1:100
    A=A1;
    A(1,:)=[];
end

B1=rand(100000,100);

for ii=1:100
    B=B1;
    B=B(2:end,:);
end

for ii=1:100
    B=B1;
    B(1,:)=[];
end

结果清楚地表明,第一种情况(在具有大量列的矩阵上保留您想要的内容)实际上非常慢。

目前尚不清楚这个或那个更快。你应该试着为你的情况计时!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多