看到一篇介绍DTW算法的文章讲的比较好,但是算法是用C语言写的,所以把它翻译成JAVA语言版本供自己使用了~~
package main;
public class BB {
public static void main(String[] args) {
int max = 999;
int[] a = { 1, 1, 2, 1, 3 };
int[] b = { 1, 2, 1, 3, 3 };
int NUM1 = a.length + 1;// 加1是因为计算是有a[i-1]
int NUM2 = b.length + 1;// 加1是因为计算是有b[j-1]
int[][] distance = new int[NUM1][NUM2];
int[][] output = new int[NUM1][NUM2];
for (int i = 0; i < NUM1; i++) {
for (int j = 0; j < NUM2; j++) {
distance[i][j] = max;
output[i][j] = max;
}
}
distance[0][0] = 0;
output[0][0] = 0;
for (int i = 1; i < NUM1; i++) {
for (int j = 1; j < NUM2; j++) {
distance[i][j] = Math.abs(b[j - 1] - a[i - 1]); // 计算点与点之间的欧式距离
}
}
// 输出整个欧式距离的矩阵
for (int i = 1; i < NUM1; i++) {
for (int j = 1; j < NUM2; j++) {
System.out.print(distance[i][j] + " ");
}
System.out.println();
}
System.out.println("=================================");
// DP过程,计算DTW距离
for (int i = 1; i < NUM1; i++) {
for (int j = 1; j < NUM2; j++) {
output[i][j] = Math.min(Math.min(output[i - 1][j - 1], output[i][j - 1]), output[i - 1][j])
+ distance[i][j];
}
}
// 输出最后的DTW距离矩阵,其中output[NUM1][NUM2]为最终的DTW距离和
for (int i = 1; i < NUM1; i++) {
for (int j = 1; j < NUM2; j++)
System.out.print(output[i][j] + " ");
System.out.println();
}
}
}