阵列部分的定时提取
在莎拉的博客, Dan询问了移除元素的速度。在MATLAB中有许多删除元素的方法。那么,什么是“最好”的方法呢?
内容
矢量数据
在这个博客中,我只使用矢量或1-D数据。我用线性索引(即,索引只有1个数字)。首先让我生成一些点,然后执行fft.
nPts = 1e7;cutoff = round(nPts/2);A = rand(nPts,1);B = fft(A);
我想保留一份B放到一边,这样我以后可以在上面做更多的实验。我希望确保副本不会与稍后使用的数组共享内存,因此我修改了第一个元素(保持其相同的值)。
无聊= B;Borig(1) = Borig(1) + sin(0);
想到的方法
让我列出我能很快想到的缩减数组的方法。
测试各种方法
T1 = tic;B = B(1:截止);toc(t1) B = Borig;Borig(1) = Borig(1) + sin(0);T2 = tic;B(截止+ 1:结束)= [];toc(t2) B = Borig;Borig(1) = Borig(1) + sin(0);T3 = tic;B(截止+ 1:《不扩散核武器条约》)= []; toc(t3) B = Borig; Borig(1) = Borig(1) + sin(0); t4 = tic; C = B(1:cutoff); toc(t4)
运行时间为0.131063秒。运行时间为0.322803秒。运行时间为0.327507秒。运行时间为0.125420秒。
这看起来不像吸毒结束与索引的实际数字的区别,几乎与我是否复制元素以保留或删除元素以删除一样大。
保留大部分元素
让我们重复分析,但这次保留大部分元素。
B =无聊;Borig(1) = Borig(1) + sin(0);cutoff = round(0.95*nPts)
截止日期= 9500000
测试各种方法。
T1 = tic;B = B(1:截止);toc(t1) B = Borig;Borig(1) = Borig(1) + sin(0);T2 = tic;B(截止+ 1:结束)= [];toc(t2) B = Borig;Borig(1) = Borig(1) + sin(0);T3 = tic;B(截止+ 1:《不扩散核武器条约》)= []; toc(t3) B = Borig; Borig(1) = Borig(1) + sin(0); t4 = tic; C = B(1:cutoff); toc(t4)
运行时间为0.240744秒。运行时间为0.510874秒。运行时间为0.440639秒。运行时间为0.243518秒。
的新奇。我看到大致相同的时间模式,当我保存一半的元素。
保留少量元素
最后,还是以向量为例,这次只保留很少的元素。
B =无聊;Borig(1) = Borig(1) + sin(0);截断值=四舍五入(0.05*nPts)
截止日期= 500000
测试各种方法。
T1 = tic;B = B(1:截止);toc(t1) B = Borig;Borig(1) = Borig(1) + sin(0);T2 = tic;B(截止+ 1:结束)= [];toc(t2) B = Borig;Borig(1) = Borig(1) + sin(0);T3 = tic;B(截止+ 1:《不扩散核武器条约》)= []; toc(t3) B = Borig; Borig(1) = Borig(1) + sin(0); t4 = tic; C = B(1:cutoff); toc(t4)
运行时间为0.026702秒。运行时间为0.194346秒。运行时间为0.195731秒。运行时间为0.026779秒。
评论与提问
我用1000万个数据元素做了这个实验。如果我用更少数量级的点来计算,结果虽然相似,但差异不会太大。我的结论是,保留你想要的元素比删除你不想要的元素更快。然而,这取决于您如何达到筛选数据的状态。
假设我拿到了不需要的元素的下标。我是使用这些来删除值更好,还是使用这些来识别需要的值并使用这些来保留元素更好?以下是我的想法。如果我得到了不想要的下标,为了创建想要的下标,我需要将所有下标组成一个数组,然后从这个更大的数组中删除不想要的下标以获得keepers。然后我要对值进行实际索引。因此,如果已经出现了索引,无论是保留还是删除,都要使用它们。如果不是,计算keepers并将这些值赋给所需的数组。
您是否发现自己处于计算或指定想要保留的值是不自然的情况?如果有,请发帖在这里因为我对这些情况很好奇。
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。