DTW算法
我已经实现了DTW算法对三维位置信息的计算,代码如下:
#include <stdlib.h> #include <iostream> #include <vector> #include "dtw.h" using namespace std; double distan[DTWMAXNUM][DTWMAXNUM]; /*保存距离*/ //double dtwpath[DTWMAXNUM][DTWMAXNUM]; /*保存路径*/ double Euclidean(vector<vector<double>>A, vector<vector<double>>B,int i,int j) { double E = sqrt(pow((A[i][0] - B[j][0]),2)+pow((A[i][1] - B[j][1]), 2)+ pow((A[i][2] - B[j][2]),2)); return E; } /* DTWDistance,求两个数组之间的匹配距离 /* A,B分别为第一第二个数组,I,J为其数组长度,r为匹配窗口的大小 /* r的大小一般取为数组长度的1/10到1/30 /* 返回两个数组之间的匹配距离,如果返回-1.0,表明数组长度太大了*/ double DTWDistance(vector<vector<double>>A, int I, vector<vector<double>> B, int J, int r) { int i, j; double dist; int istart, imax; int r2 = r + ABS(I - J);/*匹配距离*/ double g0,g1, g2, g3; //int pathsig = 1;/*路径的标志*/ /*检查参数的有效性*/ if (I>DTWMAXNUM || J>DTWMAXNUM) { //printf("Too big number\n"); return -1.0; } /*进行一些必要的初始化*/ for (i = 0; i<I; i++) { for (j = 0; j<J; j++) { //dtwpath[i][j] = 0; distan[i][j] = DTWVERYBIG; } } //动态规划求最小距离 distan[0][0] = (double)2 * Euclidean(A,B,0,0); for (i = 1; i <= r2; i++) { distan[i][0] = distan[i - 1][0] + Euclidean(A,B,i,0); } for (j = 1; j <= r2; j++) { distan[0][j] = distan[0][j - 1] + Euclidean(A,B,0,j); } for (j = 1; j<J; j++) { istart = j - r2; if (j <= r2) istart = 1; imax = j + r2; if (imax >= I) imax = I - 1; for (i = istart; i <= imax; i++) { g0 = Euclidean(A,B,i,j); g1 = distan[i - 1][j] + g0; g2 = distan[i - 1][j - 1] + 2 * g0; g3 = distan[i][j - 1] + g0; g2 = MIN(g1, g2); g3 = MIN(g2, g3); distan[i][j] = g3; } } dist = distan[I - 1][J - 1] / ((double)(I + J)); cout << dist; return dist; }/*end DTWDistance*/ int main(int argc, char * argv[]) { int norm_len = 6; int test_len = 10; int r = 1; /*输入数据*/ vector<vector<double>> norm(norm_len, vector<double>(3)); norm[0] = { 7.0, 6.0, 5.0 }; norm[1] = { 7.0, 8.0, 5.0 }; norm[2] = { 6.5, 9.0, 5.5 }; norm[3] = { 7.0, 10.0, 5.5 }; norm[4] = { 6.5, 11.5, 6.0 }; norm[5] = { 6.0, 11.0, 5.5 }; //norm.push_back(); vector<vector<double>> test(test_len, vector<double>(3)); test[0] = { 0.0, 0.0, 0.0 }; test[1] = { 0.0, 0.0, 0.0 }; test[2] = { 3.0, 4.0, 2.0 }; test[3] = { 6.0, 5.0, 4.5 }; test[4] = { 7.0, 6.0, 5.0 }; test[5] = { 7.0, 8.0, 5.0 }; test[6] = { 6.5, 9.0, 5.5 }; test[7] = { 7.0, 10.0, 5.5 }; test[8] = { 6.5, 11.5, 6.0 }; test[9] = { 6.0, 11.0, 5.5 }; double a = DTWDistance(norm, norm_len, test, test_len, r); system("pause"); }
可以说写的是非常“通俗易懂”了。
下一步就是把它移植到UE4中,还需要考虑数据读取的问题。目前我正在学习UR4的编程,现在只是刚刚入门的阶段,接下来的一周我会继续学习。在学习过程中还有一个小插曲,就是我按照教程创建一个C++项目时,总是报错:
我怀疑是我的UE4找不到我的VS,后来询问了学长,因为
我的VS是2017版的,相比于2015版进行了“瘦身”,所以有的东西得手动添加才可以。最后通过更新VS并下载UR4相关内容后得以解决。
诺亦腾修复
我现在可以确定之前的扭曲变形是地面磁场造成的了,我拿到我们学校机房去用,一点问题也没有。