2017-09-02 15 views
0

私は1800の長さの4500個のベクトルを持つ行列を持っています。そのために、行列の2つのベクトルの間のDTW(動的時間ワーピング)距離を計算する必要があります。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行列を自動的に生成することができるinbuilt関数はありませんか?

+0

[dtwのドキュメント](http://mathworks.com/help/signal/ref/dtw.html?s_tid=doc_ta)は、 'x'と' y'の行列を入力できることを示唆しています。それを試し、それが何かをスピードアップするかどうかを見てください。 2番目と3番目の出力も行列を与えます。これは有用かもしれません – Adriaan

+0

@Adriaanこれは2つの行列を比較するためのものです。私は単一の行列の2つのベクトルを比較したいと思います。 – Polisetty

+2

サンプルマトリクスの例を提供 –

答えて

1

いいえ、Matlabでコードをベクトル化して高速化する方法はありません。あなたは多くの計算(〜4500^2/2 DTW計算)を求めており、あなたが何をしていてもおそらく時間がかかるでしょう。しかし、いくつかの選択肢があります:

  • この計算を一度だけ行う必要がある場合は、それを実行して4日間待ってください。あなたが学校や会社にいる場合は、あなたの個人的なコンピュータ以外のコンピュータでそれを実行することができます。
  • pdist2の呼び出しの中で、dtwをカスタム距離関数として使用して試すことができます。これは少し速いかもしれません。
  • Matlabで独自のDTWを作成し、そこで時間を節約しようとすることができます。明白なスピードアップの1つは、dtwへの各呼び出しで1800x1800の行列を割り当てる必要があることです。あなた自身のコードでは、これを一度割り当てて再利用することができます。
  • 独自のDTWを別の言語で作成することも、別の言語の他のDTWコードを使用することもできます。これらはMEXを介してMatlabから呼び出すことができ、言語と実装に応じてより高速になる可能性があります。
  • 近似で解決できます。たとえば、参照信号x0を選択し、4500ベクトルごとにdtw(x0, xi)を計算します。次に、近似をdtw(xi, xj) = dtw(x0, xi) + dtw(x0, xj)とする。これはあなたが提案したものより約4500倍高速です。
+0

ありがとう!これは私が探していた答えでした。私は一度だけそれを実行しなければならなかった。そこで私は信号を1800からほぼ600にトリムし、およそ6時間で終了しました。私は確かに次回はマトリックスのアイデアを試してみよう! – Polisetty

関連する問題