【问题标题】:How to get DTW to run faster?如何让 DTW 运行得更快?
【发布时间】:2018-02-11 13:31:52
【问题描述】:

我有一个包含 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 矩阵?

【问题讨论】:

  • documentation on dtw 建议您可以为xy 输入矩阵,试试看它是否能加快速度。第二个和第三个输出也给出了矩阵,这可能很有用
  • @Adriaan 用于比较两个矩阵。我想比较单个矩阵中的每两个向量。
  • 提供一个带有样本矩阵的例子
  • 这个项目的文档可以帮助你:github.com/talcs/simpledtw

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


【解决方案1】:

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

  • 如果您只需要执行一次此计算,只需运行它并等待四天。如果您在学校或公司,您可以在个人计算机以外的计算机上运行它。
  • 您可以尝试在对pdist2 的调用中使用dtw 作为自定义距离函数。这可能会稍微快一些。
  • 您可以在 Matlab 中编写自己的 DTW 并尝试在那里节省时间。一个明显的加速是每次调用dtw 必须分配一个1800x1800 矩阵。在您自己的代码中,您可以分配一次并重复使用它。
  • 您可以用另一种语言编写自己的 DTW,或使用其他人的另一种语言的 DTW 代码。这些可以通过 MEX 从 Matlab 调用,并且可能更快,具体取决于语言和实现。
  • 您可以接受一个近似值。例如,选择一个参考信号 x0,然后为 4500 个向量中的每一个计算 dtw(x0, xi)。然后做出dtw(xi, xj) = dtw(x0, xi) + dtw(x0, xj) 的近似值。这样做比您建议的速度快 4500 倍左右。

【讨论】:

  • 谢谢!这就是我一直在寻找的答案。我只需要运行一次。因此,我将信号从 1800 调整到近 600,并在大约 6 小时内完成。下次我一定会尝试矩阵的想法!
猜你喜欢
  • 2010-11-06
  • 2023-03-26
  • 1970-01-01
  • 2011-05-10
  • 2017-07-10
  • 2013-03-14
  • 2016-12-26
  • 2020-01-10
相关资源
最近更新 更多