关于DTW算法的原理这篇博客写的很好https://blog.csdn.net/aa8568849/article/details/53841189?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase
作者对原文的c程序进行注释和改进如下:


#include "stdio.h"
#include "windows.h" struct pointOritation//保存当前节点方向,用来回溯每个W点
{int frontI,frontJ;
};/*求最小累计距离的二维数组g,
传入参数p为标准模板和测试模板各元素之间的欧氏距的二维数组的首地址
n,m为数组的行数和列数
g为所求最小累积距离数组的首地址
pr为保存g各个元素方向的结构体数组的首地址 */
void gArray(int *p,int n,int m,int *g,struct pointOritation *pr)
{//定义行标和列标变量i,jint i, j; *(g+(n-1)*m)=(*(p+(n-1)*m))*2;   //计算g起始点的值及其上个节点的行标和列标(最左下角的点)即g[5][0] (pr+(n-1)*m)->frontI = -1;(pr+(n-1)*m)->frontJ = -1;for (i=1; i<m; i++)//循环m-1次计算g最下面一横的值,(除g[5][0])(只有一个方向) {*(g+(n-1)*m+i)=*(g+(n-1)*m+i-1)+*(p+(n-1)*m+i);  //求值 (pr+(n-1)*m+i)->frontI=n-1;     // 求当前节点的最小累计距离的方向 (pr+(n-1)*m+i)->frontJ=i-1;     //保存方法为保存当前节点的上个节点的数组下标 // frontI为行标,frontJ为列标 }for (i=n-2; i>=0; i--)//循环n-1次最左边的一竖的值, (除g[5][0])(只有一个方向){*(g+i*m)=*(g+(i+1)*m)+*(p+i*m);(pr+i*m)->frontI=i+1;(pr+i*m)->frontJ=0;}//计算剩余网格的G值   i为行标,j为列标 for (i=n-2; i>=0; i--){for (j=1; j<m; j++){int left,under,incline;  //分别表示当前节点三个方向上的累计距离值 left=*(g+i*m+j-1)+*(p+i*m+j);under=*(g+(i+1)*m+j)+*(p+i*m+j);incline=*(g+(i+1)*m+j-1)+(*(p+i*m+j))*2;//从左、下、斜三个方向选出最小的int min=left;*(g+i*m+j)=min;(pr+i*m+j)->frontI=i;(pr+i*m+j)->frontJ=j-1;if (min>under){min=under;*(g+i*m+j)=min;(pr+i*m+j)->frontI=i+1;(pr+i*m+j)->frontJ=j;}if (min>incline){min=incline;*(g+i*m+j)=min;(pr+i*m+j)->frontI=i+1;(pr+i*m+j)->frontJ=j-1;}}}//输出G数组printf("g矩阵如下:\n"); for (i=0; i<n; i++){for (j=0; j<m; j++){printf("%d\t",*(g+i*m+j));}printf("\n");}//输出方向数组printf("方向矩阵如下:\n");for (i=0; i<n; i++){for (j=0; j<m; j++){printf("(%d,%d)\t",(pr+i*m+j)->frontI,(pr+i*m+j)->frontJ);}printf("\n");}
}void printPath(struct pointOritation *po,int n,int m,int *g)
{//由于最短路径是从终点回溯找到起点,所以这里利用一个结构体数组实现正序输出路径struct temp_save{int i, j, distance;};struct temp_save temp[10];int t = 0;printf("路径如下:\n");int i=0,j=m-1; while (1){  int ii=(po+i*m+j)->frontI,jj=(po+i*m+j)->frontJ;temp[t].i = i;temp[t].j = j;temp[t].distance = *(g+i*m+j);t++;i=ii;j=jj;if(i==-1 && j==-1)break;}t--;while(t>=0){printf("(%d, %d): 当前最小累积距离: %d\n", temp[t].i, temp[t].j, temp[t].distance);t--;}printf("标准模板与匹配模板的最小累积距离=%d\n", temp[t+1].distance);
}
int main()
{//标准模板和匹配模板各元素之间的欧氏距离矩阵 int  d[6][4]={{2,1,7,5},{1,5,1,6},{4,7,2,4},{5,2,4,3},{3,4,8,2},{2,1,5,1},};//存放累积最小距离的矩阵g int g[6][4];struct pointOritation pOritation[6][4];//用来存放g中当前节点的来源路径的结构体数组 //求出g和pOritation并打印 gArray(*d,6,4,*g,*pOritation);//打印路径即标准模板和匹配模板之间各元素的映射关系 printPath(*pOritation, 6, 4,*g);system("pause");return 0;
}

运行结果如下:

c语言模拟实现DTW(动态时间规整算法)相关推荐

  1. DTW动态时间规整算法

    原文地址:https://blog.csdn.net/qcyfred/article/details/53824507 https://zhuanlan.zhihu.com/p/43247215 动态 ...

  2. 初识DTW(动态时间规整)算法及Python实现例

    目录 1. 概要 2. 时序列相似度度量 3. DTW基本算法 4. Python实现 5. Next Action 1. 概要 DTW( Dynamic Time Warping,动态时间规整)是基 ...

  3. java dtw,DTW动态时间规整算法

    [TOC] 1.基本介绍 DTW:Dynamic Time Warping,即动态时间归整.DTW算法基于DP动态规划思想,解决了发音长短不一的模板匹配问题,常用于语音识别(孤立词识别). HMM算法 ...

  4. 基于动态时间规整算法(DTW)的语音识别技术研究-含Matlab代码

    ⭕⭕ 目 录 ⭕⭕ ⏩ 一.引言 ⏩ 二.动态时间规整算法基本原理 ⏩ 三.语音识别实例分析 ⏩ 四.参考文献 ⏩ 五.Matlab代码获取 ⏩ 一.引言 在语音识别技术的发展过程中,动态时间规整算法 ...

  5. 动态时间规整算法(DTW)通俗易懂

    动态时间规整算法(Dynamic Time Warping ) 来源: -假定一个孤立词识别系统,利用模板匹配法进行识别.训练阶段,用户将词汇表种每一个词都念一遍,将其特征矢量的时间序列作为模板(te ...

  6. 动态时间规整算法: 从DTW到FastDTW

    目录 动态时间规整算法: 从DTW到FastDTW 总结: 简介[^1] DTW[^1] FastDTW:使用多级粗化的方法[^1] 结果 动态时间规整算法: 从DTW到FastDTW 总结: Fas ...

  7. 动态时间规整算法——DTW

    没有做过机器学习的小伙伴们对这个算法应该不是特别的了解,因为机器学习经常会用到这个算法.再将这个算法之前,我们先看一下初中的知识点. 欧几里得距离 在讲解动态时间规整算法(Dynamic Time W ...

  8. 动态时间规整算法DTW

    动态时间规整算法(dynamic time warping,DTW),最早由日本学者Itakura提出,用于衡量两个时间序列的相似度,也可用于将多个测试序列与标准序列对齐,从而实现序列长度的归一化. ...

  9. 动态时间规整算法(Dynamic Time Warping, DTW)之初探单词语音识别

    动态时间规整算法(DTW)是最近接触的一种提取时间序列模板方法.本文主要是一些自己的学习记录,并适当地加入自己的理解.若有见解不一致之处,欢迎交流. 1 动态时间规整(DTW)基本思想 先从单词语音时 ...

最新文章

  1. html input type=quot;filequot;,科技常识:关于type=quot;filequot;的input框样式修改小结...
  2. Django MTV模型思想
  3. 在eclipse使用git管理项目工程代码
  4. ActiveMQ_基础学习
  5. asp.net mvc批量删除的实现
  6. 安装Orchard错误
  7. P5732 【深基5.习7】杨辉三角(python3实现)
  8. layout文件夹中activity_main.xml与fragment_main.xml文件的处理记录
  9. 6.1bash编程入门值变量类型、for循环和算术运算
  10. 【实用技巧】下载音乐到本地电脑
  11. win7如何更改计算机管理员用户名和密码,Win7如何修改管理用户名
  12. 安卓音视频开发!为了跳槽强刷1000道Android真题,大厂直通车!
  13. Win10重装Win7后开机提示无法验证此文件的数字签名怎么办?
  14. 搭建最炫酷的 Windows Terminal 全新命令行更新以及美化指南 微软新版终端工具安装美化教程
  15. 06解决Anaconda3安装完成后在开始菜单找不到的问题
  16. c/c++ 编程软件(IDE)推荐
  17. Linux主机熵值不足导致SecureRandom线程阻塞问题
  18. Android系统system用户权限和root权限的获取
  19. there be句型
  20. html5 语音导航,诺基亚推出HTML5版导航地图

热门文章

  1. 从键盘中输入年、月、日,判断这一天为当年的第几天(考虑闰年和非法输入的情况)
  2. 管理台权限模块 - 完整路由权限及按钮权限
  3. ps之制作电影海报灵感网站
  4. 用python实现本地文件搜索
  5. Git实战(四)| Git分支管理实操,解决在线合并和本地合并
  6. 美国人发明电子计算机是哪一年,电子计算机是哪一年发明的_是谁发明的
  7. [渝粤教育] 中南大学 病理生理学 参考 资料
  8. S0-S5,G0-G3(附Intel图)
  9. Java 遍历 LocalDateTime 两个时间段中的每一天
  10. 智能教育深度学习推荐系统---1.1.概述