我一直坚持在MATLAB中随后匹配时间序列(我不熟悉它)。
我有两个时间序列:A(长度为a)和B(长度为b)。假设a比b大得多。任务是找到从A到B的最近窗口(根据欧几里德度量)。
为了做到这一点,我构建了额外的矩阵C,它存储了来自A的长度b的所有子序列,然后使用pdist2(C,B)。显然它运作缓慢,需要太多记忆。
所以我有几个问题:
如何获得没有循环的C(实际上是重塑A)?
解决此问题的常用方法有哪些? (最好是在MATLAB中,但也可以使用其他环境)
感谢您的帮助!
答案 0 :(得分:1)
对于问题的第2部分,比较序列的典型方法是Dynamic Time Warping(DTW)。您几乎肯定能够通过Google进行Matlab实施。
DTW算法的基本版本具有复杂度O(nm),但通常具有可比性能的近似版本具有更接近O(max(n,m))的复杂度。
答案 1 :(得分:1)
对于第一个问题,您可以尝试
tmp = repmat(A,1,b);
C = reshape([tmp zeros(1,b)],a,b);
C = C(1:(a-b+1),:);
此外,pdist2
与这个非常好的解决方案相比非常慢:Efficiently compute pairwise squared Euclidean distance in Matlab
答案 2 :(得分:0)
我想建议cross-correlation(xcorr
)作为解决此问题的方法。关于互相关和欧几里德距离的关系,请参考the introduction of this article。它在时间或幅度上的缩放并不是不变的,并且可能对噪声很敏感,但这个问题并不意味着任何这样的失真。
互相关的一个优点是它在变换域中的有效实现。不幸的是,我只有一个没有pdist2
的旧Matlab版本,所以我无法计时。但请考虑
%// Parameters
a = 1e4;
b = 1e2;
noise = 0.1;
%// Create sample signals with some distortion
A = rand(1, a);
Offset_actual = 321
B = A(Offset_actual + [1:b]) + noise*rand(1, b);
%// Computation
CC = xcorr(A, B);
[m, i] = max(CC);
Offset_estimated = i - a
plot(CC)
应该恢复Offset_estimated == Offset_actual
。