在您询问有关该histc
方法的评论后,我将其发布在这里。尽管如果您只想对数据执行此操作,这不是最快的方法,但如果您稍后需要重用 bin 信息(数据分类),它可能会很有用。
以下代码:
%% // prepare
clear all
t=1:10;
tnew=2:2:8;
data=1:10;
t(3)=[];
data(3)=[];
nLoop = 50000 ;
%% // initial method
tic ;
for iLoop = 1:nLoop
clear datanew
dt=1;
for i=1:length(tnew)
datanew(i)=mean( data( find(t>=(tnew(i)-dt) & t<(tnew(i)+dt)) ));
end
end
toc
%% // initial method optimized
tic ;
for iLoop = 1:nLoop
clear datanew
dt=1;
datanew = zeros( size(tnew) ) ;
for i=1:length(tnew)
datanew(i)=mean( data( t>=(tnew(i)-dt) & t<(tnew(i)+dt) ));
end
end
toc
%% // histc method
xedges = [tnew(1)-dt tnew+dt] ; %// => xedges = [1:2:9] ;
tic
for iLoop = 1:nLoop
clear newdata
newdata = zeros( size(tnew)) ;
[n,bins] = histc( data , xedges ) ;
for iBin=1:length(n)-1
newdata(iBin) = mean( data(bins==iBin) );
end
end
toc
产生以下输出:
Elapsed time is 3.177801 seconds.
Elapsed time is 2.910844 seconds.
Elapsed time is 2.948526 seconds.
我用不同的循环迭代次数多次运行它,结果总是一致的。优化的初始方法总是比histc方法快。我不是 histc 方法的忠实拥护者,因为在我们已经对所有数据进行分箱后,它仍然涉及循环和比较 ( data(bins==iBin)
),而不是直接索引。
虽然比较略有不同。一个是类型>
并且对浮点数进行操作,而另一个是=
比较索引(理论上是整数,但我不确定Matlab如何在内部表示它们,所以它可能没有好处)。
无论如何,这可能会导致与我使用更大和更复杂的数据集获得的执行时间不同,因此欢迎您在真实数据上尝试这些方法,并随时让我们知道它是如何为您工作的。
ps:我稍微修改了您的初始示例,因此平均时间窗口中不再有重叠(更改为dt=1
1 )。这样,所有方法都返回相同的结果。>
>=