我计划多次删除矩阵的第一行,并想知道这样做的最佳/最有效方法是什么。
我知道我可以做这样的事情
M(1,:)=[]
或
M = M(2:end)
但我不确定哪种方式最好,或者有更好的方法。
答案 0 :(得分:3)
嘿刚用tic
和toc
测试了这两种方法
这是我使用的代码:
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
因此,保存要保留的列似乎更快。
修改强>
有人评论说,tic
和toc
在毫秒域中不“值得信赖”,因此建议使用循环多次运行代码。但结果不会改变。
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
答案 1 :(得分:2)
一般来说,保持你想要的东西可能会更快。根据矩阵的尺寸,结果可能会有所不同。考虑以下测试用例,其中生成两个矩阵,A1和B1,尺寸为100x100000和100000x100。结果从轮廓查看器获得,但是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
结果清楚地表明,第一种情况(在具有大量列的矩阵上保留您想要的内容)实际上非常慢。
虽然没有明确的这个或那个更快。您应该尝试适合您的情况!