罗兰谈MATLAB的艺术

将想法转化为MATLAB

阵列部分的定时提取

莎拉的博客, 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并将这些值赋给所需的数组。

    您是否发现自己处于计算或指定想要保留的值是不自然的情况?如果有,请发帖在这里因为我对这些情况很好奇。




    使用MATLAB®7.6发布

    |
    • 打印
    • 发送电子邮件

    评论

    如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。