mer*_*erv 10 matlab time-series vectorization
我有一堆时间序列,每个时间序列由两个组件描述,一个时间戳向量(以秒为单位),以及一个测量值向量.时间向量是不均匀的(即以非常规间隔采样)
我试图计算每个1分钟间隔值的平均值/ SD(采用X分钟间隔,计算其平均值,采用下一个间隔,......).
我当前的实现使用循环.这是我到目前为止的样本:
t = (100:999)' + rand(900,1); %' non-uniform time
x = 5*rand(900,1) + 10; % x(i) is the value at time t(i)
interval = 1; % 1-min interval
tt = ( floor(t(1)):interval*60:ceil(t(end)) )'; %' stopping points of each interval
N = length(tt)-1;
mu = zeros(N,1);
sd = zeros(N,1);
for i=1:N
indices = ( tt(i) <= t & t < tt(i+1) ); % find t between tt(i) and tt(i+1)
mu(i) = mean( x(indices) );
sd(i) = std( x(indices) );
end
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更快的矢量化解决方案.这很重要,因为我有大量的时间序列来处理每个时间序列比上面显示的样本长得多.
欢迎任何帮助.
谢谢大家的反馈.
我纠正了t
生成的方式总是单调增加(排序),这不是一个真正的问题..
此外,我可能没有明确说明这一点,但我的意图是在几分钟内找到任何间隔长度的解决方案(1分钟只是一个例子)
小智 11
唯一合乎逻辑的解决方案似乎是......
好.我觉得有趣的是,对我来说,只有一个逻辑解决方案,但许多其他人找到其他解决方案.无论如何,解决方案似乎很简单.给定向量x和t,以及一组等间隔的断点tt,
t = sort((100:999)' + 3*rand(900,1)); % non-uniform time
x = 5*rand(900,1) + 10; % x(i) is the value at time t(i)
tt = ( floor(t(1)):1*60:ceil(t(end)) )';
Run Code Online (Sandbox Code Playgroud)
(注意我在上面排序了.)
我会在三个完全矢量化的代码行中执行此操作.首先,如果间断是任意的并且间距可能不相等,我会使用histc来确定数据序列所处的间隔.如果它们是统一的,只需执行以下操作:
int = 1 + floor((t - t(1))/60);
Run Code Online (Sandbox Code Playgroud)
同样,如果不知道t的元素是否已被排序,我将使用min(t)而不是t(1).完成后,使用accumarray将结果降低到平均值和标准偏差.
mu = accumarray(int,x,[],@mean);
sd = accumarray(int,x,[],@std);
Run Code Online (Sandbox Code Playgroud)