如何让DTW运行得更快?

时间:2017-09-02 20:35:27

标签: matlab time-series signal-processing vectorization dtw

我有一个4500个矢量长度为1800的矩阵,我需要计算矩阵中每2个矢量之间的DTW(动态时间扭曲)距离。

我使用了一个嵌套循环来填充4500x4500矩阵的一半(看起来像一个三角形):

matr = zeros(4500,4500); %initializing empty matrix to fill dtw distance
for i=1:4500
    x = new(i,:); %new is where the data lies
    for j = i+1:4500
        y = new(j,:);
        matr(i,j) = dtw(x,y);
    end
end

问题是代码运行速度极慢。根据我的计算,在我的电脑上运行需要4天。

我不知道矢量化是如何工作的。但有没有一种方法可以将我的代码矢量化,以便它运行得更快?还有没有内置功能,我可以插入所有的矢量,并自动生成DTW dist矩阵?

1 个答案:

答案 0 :(得分:1)

不,没有明显的方法可以在Matlab中对代码进行矢量化以使其更快。您要求进行大量计算(~4500 ^ 2/2 DTW计算),无论您做什么,都可能需要时间。但是你有一些选择:

  • 如果您只需要执行一次此计算,只需运行它并等待四天。如果您在学校或公司,您可以在个人以外的计算机上运行它。
  • 您可以尝试在OrderedDict([('2012-01-01 01:01:55.000000', {'P1': ['1', '2', '3'], 'P2': ['4', '5', '6'], 'P3': ['6', '8', '9']}), ('2012-01-01 01:01:56.000000', {'P1': ['4', '9', '2'], 'P2': ['0', '2', '1'], 'P3': ['1', '6', '8']})]) 的调用中使用dtw作为自定义距离函数。这可能会稍快一些。
  • 您可以在Matlab中编写自己的DTW并尝试在那里节省时间。一个明显的加速是每次调用pdist2必须分配1800x1800矩阵。在您自己的代码中,您可以分配一次并重复使用它。
  • 您可以用其他语言编写自己的DTW,或者使用其他语言的其他DTW代码。这些可以通过MEX从Matlab调用,可能会更快,具体取决于语言和实现。
  • 你可以接近一个近似值。例如,为每个4500向量选择一个参考信号x0,并计算dtw。然后进行dtw(x0, xi) = dtw(xi, xj)的近似。这样做比你建议的快4500倍。