Performance 挑选数据的最快方法

Performance 挑选数据的最快方法,performance,matlab,indexing,Performance,Matlab,Indexing,我正在编写一个函数,它应该能够集成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))); 但是根据分析器,

我正在编写一个函数,它应该能够集成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%左右,所以如果可以减少,那就太好了

我也尝试过使用

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

data=data(time>=lima&time底线,逻辑条件行获胜。下面是对带有随机时间差的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');
N=1e3;
数据=兰特(1,N);
时间=1:N;
对于n=1:100
li=排序(randi(N,2,1));
llim=find(time==li(1));
ulim=find(time==li(2));
f1=@()数据(find(time==li(1)):find(time==li(2));

f2=@()数据(时间>=li(1)&time底线,逻辑条件行获胜。下面是对具有随机时间差的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');
N=1e3;
数据=兰特(1,N);
时间=1:N;
对于n=1:100
li=排序(randi(N,2,1));
llim=find(time==li(1));
ulim=find(time==li(2));
f1=@()数据(find(time==li(1)):find(time==li(2));

f2=@()数据(时间>=li(1)&time你不是说
data=data(时间>=lima&time)可能会分割你尝试的选项吗?这不会有什么区别,但谁知道呢?
data=data(时间>=lima);data=data(time@Dan You完全正确。我只是快速地重新键入它,说我已经尝试过了。@斯维尔,所以问题是如果我这样做,那么向量中的每个点都会检查它是否先大于lima,然后小于limb。然而,我的时间向量是排序的,所以一旦我知道了点llim和ulim,那么我就知道我想要向量中的每个点-介于之间。@bla我的数据集很小~1000个条目,但函数调用了很多次~5e6你的意思是不是说
data=data(time>=lima&time)可能会分割你尝试过的选项?这不会有什么区别,但谁知道呢?
data=data(time>=lima);data=data(time@Dan You完全正确。我只是快速地重新键入它,说我已经尝试过了。@斯维尔,所以问题是如果我这样做,那么向量中的每个点都会检查它是否先大于lima,然后小于limb。然而,我的时间向量是排序的,所以一旦我知道了点llim和ulim,那么我就知道我想要向量中的每个点-@bla我的数据集很小~1000个条目,但函数调用了很多次~5e6