资源简介
DTW算法VC++实现 源代码非常好,注释非常清晰,希望对大家有用
代码片段和文件信息
/*dtwrecoge.cpp**************************************************************/
#include “dtwrecoge.h“
double distance[DTWMAXNUM][DTWMAXNUM]; /*保存距离*/
double dtwpath[DTWMAXNUM][DTWMAXNUM]; /*保存路径*/
/*****************************************************************************/
/* DTWDistance,求两个数组之间的匹配距离
/* AB分别为第一第二个数组,I,J为其数组长度,r为匹配窗口的大小
/* r的大小一般取为数组长度的1/10到1/30
/* 返回两个数组之间的匹配距离如果返回-1.0,表明数组长度太大了
/*****************************************************************************/
double DTWDistanceFun(double *Aint Idouble *Bint Jint r)
{
int ij;
double dist;
int istartimax;
int r2=r+ABS(I-J);/*匹配距离*/
double g1g2g3;
int pathsig=1;/*路径的标志*/
/*检查参数的有效性*/
if(I>DTWMAXNUM||J>DTWMAXNUM){
//printf(“Too big number\n“);
return -1.0;
}
/*进行一些必要的初始化*/
for(i=0;i for(j=0;j dtwpath[i][j]=0;
distance[i][j]=DTWVERYBIG;
}
}
/*动态规划求最小距离*/
/*这里我采用的路径是 -------
. |
. |
. |
. |
*/
distance[0][0]=(double)2*ABS(A[0]-B[0]);
for(i=1;i<=r2;i++){
distance[i][0]=distance[i-1][0]+ABS(A[i]-B[0]);
}
for(j=1;j<=r2;j++){
distance[0][j]=distance[0][j-1]+ABS(A[0]-B[j]);
}
for(j=1;j istart=j-r2;
if(j<=r2)
istart=1;
imax=j+r2;
if(imax>=I)
imax=I-1;
for(i=istart;i<=imax;i++){
g1=distance[i-1][j]+ABS(A[i]-B[j]);
g2=distance[i-1][j-1]+2*ABS(A[i]-B[j]);
g3=distance[i][j-1]+ABS(A[i]-B[j]);
g2=MIN(g1g2);
g3=MIN(g2g3);
distance[i][j]=g3;
}
}
dist=distance[I-1][J-1]/((double)(I+J));
return dist;
}/*end DTWDistance*/
/*****************************************************************************/
/* DTWTemplate,进行建立模板的工作
/* 其中A为已经建立好的模板,我们在以后加入训练样本的时候,
/* 以已建立好的模板作为第一个参数,I为模板的长度,在这个模板中不再改变
/* B为新加入的训练样本,J为B的长度,turn为训练的次数,在第一次
/* 用两个数组建立模板时,r为1,这是出于权值的考虑
/* temp保存匹配最新训练后的模板,建议temp[DTWMAXNUM],函数返回最新训练后模板的长度
/* 如果函数返回-1,表明训练样本之间距离过大,需要重新选择训练样本,
/* tt为样本之间距离的阀值,自行定义
/* rltdistance保存距离,第一次两个数组建立模板时可以随意赋予一个值,
/* 后面用前一次返回的值赋予该参数
/*****************************************************************************/
int DTWTemplate(double *Aint Idouble *Bint Jdouble *tempint turndouble ttdouble *rltdistance)
{
double dist;
int ij;
int pathsig=1;
dist=DTWDistanceFun(AIBJ(int)(I/30));
if(dist>tt){
printf(“\nSample doesn‘t match!\n“);
return -1;
}
if(turn==1)
*rltdistance=dist;
else{
*rltdistance=((*rltdistance)*(turn-1)+dist)/turn;
}
/*寻找路径这里我采用了逆向搜索法*/
i=I-1;
j=J-1;
while(j>=1||i>=1){
double m;
if(i>0&&j>0){
m=MIN(MIN(distance[i-1][j]distance[i-1][j-1])distance[i][j-1]);
if(m==distance[i-1][j]){
dtwpath[i-1][j]=pathsig;
i--;
}
else if(m==distance[i-1][j-1]){
dtwpath[i-1][j-1]=pathsig;
i--;
j--;
}
else{
dtwpath[i][j-1]=pathsig;
j--;
}
}
else if(i==0){
dtwpath[0]
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3853 2004-04-12 20:53 DTW算法\dtwrecoge.cpp
文件 1524 2004-04-12 20:53 DTW算法\dtwrecoge.h
文件 6168 2004-04-12 20:53 DTW算法\vdtwrecoge.cpp
文件 2793 2004-04-12 20:53 DTW算法\vdtwrecoge.h
..AD... 0 2008-09-18 23:32 DTW算法
----------- --------- ---------- ----- ----
14338 5
- 上一篇:机器人灭火比赛源程序C语言版本
- 下一篇:正则表达式转NFA
相关资源
- VC++ 中实现进制2进制,10进制,16进制
- crm vc++源代码
- 门禁系统源代码 VC++
- 基于神经网络的车牌识别系统//VC++毕
- 操作系统实验--电梯调度 VC++实现
- vc++6.0实现的学生成绩管理系统代码
- 用vc++6.0做 的RSA的加密与解密程序
- VC++ 四种进程间通信的完整
- MFC小学生速算练习系统VS2017
- 分数计算器课程设计
- VC使用CStringArray类创建和使用字符串数
- VC++使用Webbrowser开发浏览器
- 人事管理系统(使用MFC单文档程序,
- MFC 实现的坦克大战
- C语言大作业 菜单驱动的学生成绩管理
- VC++源码字识别系统
- STK与VC++ 6.0联合编程
- VC++MFC串口调试助手完整编辑过程介绍
- VC++端口转发程序源码
- VC++操作WPS表格的类(VC6.0编译通过)
- RSA加解密源码VC++
- 在VC++6.0中编写的音乐播放器源代码
- vc++ mfc 基于udp协议在不同ip地址之间
- VC++2005测试版运行库 Microsoft.VC80.Debu
- 猎豹网校C++ Primer初中高全套无密版
- VC++基于mfc 实现对话框打开读取txt文件
- Visual C++ Build Tools 2015 离线包.part1/7
- vc++ 2005 express 完整安装包
- VC++之MFC类库中文手册一怀去意---
- MFC视频播放器(带播放列表VC++6.0源代
评论
共有 条评论