【问题标题】:Fastest way to pick out data提取数据的最快方法
【发布时间】:2016-08-03 04:30:32
【问题描述】:

我正在编写一个函数,它应该能够在 a 和 b 之间集成一个函数。问题是该功能仅由具有相应时间点的数据数组提供。

问题是,当一个下限和上限时,我必须剪掉这个时间范围内的数据向量部分——我的问题是,如何做到最有效?

我现在正在做的事情如下:

llim = find(time==lima); 
ulim = find(time==limb);

data = data(llim:ulim); 
int1 = h/2*(data(1) + data(end) + 2*sum(data(2:end))); 

但是根据分析器,前 3 行使用了 50-something %,所以如果可以减少它会很棒。

我也尝试过使用

data = data(time>=lima & time<=limb);

但这并不快。有什么建议吗?

【问题讨论】:

  • 你不是说data = data(time&gt;=lima &amp; time&lt;=limb)吗? lima 小于 limb 对吗?
  • 也许拆分您尝试的选项?应该没什么区别,但谁知道呢? data = data(time &gt;= lima); data = data(time &lt;= limb);
  • @Dan 你是完全正确的。我只是快速重新输入它说我已经尝试过。
  • @Swier 所以问题是,如果我这样做,那么检查向量中的每个点是否首先大于利马然后小于肢体。但是我的时间向量是排序的,所以一旦我知道了 llim 和 ulim 点,我就知​​道我想要中间的每个点。
  • @bla 我的数据集很小~1000 个条目,但该函数被调用了很多次~5e6

标签: performance matlab indexing


【解决方案1】:

底线,逻辑条件行获胜。下面是对具有随机时间差的 1e3 长度向量的分析:

N=1e3;
data=rand(1,N);

time=1:N;
for n=1:100

    li=sort(randi(N,2,1)) ;

    llim = find(time==li(1));
    ulim = find(time==li(2));

    f1 = @() data( find(time==li(1)): find(time==li(2)));
    f2 = @() data(time>=li(1) & time<=li(2));
    d(n)=diff(li);
    t1(n)=timeit(f1);
    t2(n)=timeit(f2);
end

%%
plot(d,t1,'s',d,t2,'o');
xlabel('llim-ulim');
ylabel('time (sec)');
legend('find method','logical cond method');

【讨论】:

    猜你喜欢
    • 2018-06-25
    • 2012-02-16
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2020-04-19
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多