📄 wirecoge.cpp
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title></title>
</head>
<body>
<pre>/*******************************************************************/
/* wirecoge.cpp 笔迹鉴别源文件
/* 笔迹鉴别程序
/* 功能:根据人手写特定字的压力曲线和位置曲线识别写字人
/* 作者:闾海荣 高秋彬
/* 单位:清华大学自动化系自81班
/* 时间:2001年8月29日
/*******************************************************************/
#include"wirecoge.h"
/*dtw()
x=[0 1.25 3 4 5 6.5 7.5 8.3 8.9 9.3 9.8 10 10
9.9 9.5 8.75 7.8 7.5 3.5 2.5 1.0 0.2 0 0.3 2.0 3.0 5.5
7 8 9 9.5 9.4 9 7 4 2 1 0];
y=[0 2 4.6 6 7.4 8.6 9.6 10 9.6 9 7.6 6 3.8 2 0 0 0 0.4
2 5 9 10 7 3 1 1 0];
*/
float wirecoge::DTWCompute(float A[],int I,float B[],int J)
{
int W=0;
int i,j;
int pathsign=1; /*路径标志*/
float notcomputed=-1.0; /*还没有计算的标志*/
float dist,m;
int istart,imax;
int r=AbsInt(I-J)+10;
for(i=0;i<I;i++){
for(j=0;j<J;j++){
DTWDistance[i][j]=notcomputed;
DTWPath[i][j]=0;
}
}
for(j=1;j<J;j++){
istart=j-r+2;
if(j<r)
istart=1;
imax=r+j-1;
if(imax>=I)
imax=I-1;
for(i=istart;i<=imax;i++)
DTWDistance[i][j]=0;
}
DTWDistance[0][0]=AbsFloat(A[0]-B[0]);
for(i=1;i<r;i++)
DTWDistance[i][0]=DTWDistance[i-1][0]+AbsFloat(A[i]-B[0]);
for(j=1;j<r;j++)
DTWDistance[0][j]=DTWDistance[0][j-1]+AbsFloat(A[0]-B[j]);
for(j=1;j<J;j++){
istart=j-r+1;
if(j<r)
istart=1;
imax=r+j-1;
if(imax>=I)
imax=I-1;
for(i=istart;i<=imax;i++){
if(DTWDistance[i][j-1]==notcomputed)
DTWDistance[i][j]=MinFloat(DTWDistance[i-1][j]+AbsFloat(A[i]-B[j]),
DTWDistance[i-1][j-1]+2*AbsFloat(A[i]-B[j]));
else if(DTWDistance[i-1][j]==notcomputed)
DTWDistance[i][j]=MinFloat(DTWDistance[i-1][j-1]+2*AbsFloat(A[i]-B[i]),
DTWDistance[i][j-1]+AbsFloat(A[i]-B[i]));
else
DTWDistance[i][j]=MinFloat(MinFloat(DTWDistance[i-1][j]+AbsFloat(A[i]-B[j]),
DTWDistance[i-1][j-1]+2*AbsFloat(A[i]-B[j])),
DTWDistance[i][j-1]+AbsFloat(A[i]-B[j]));
if(DTWDistance[i][j]==DTWDistance[i-1][j-1]+2*AbsFloat(A[i]-B[j]))
W+=2;
else
W+=1;
}
}
i=I-1;
j=J-1;
while(j>=1){
m=MinFloat(MinFloat(DTWDistance[i-1][j],DTWDistance[i-1][j-1]),DTWDistance[i][
j-1]);
if(m==DTWDistance[i-1][j]){
DTWPath[i-1][j]=pathsign;
i--;
}
else if(m==DTWDistance[i-1][j-1]){
DTWPath[i-1][j-1]=pathsign;
i--;
j--;
}
else{
DTWPath[i][j-1]=pathsign;
j--;
}
}
dist=DTWDistance[I-1][J-1]/W;
return dist;
}
float wirecoge::MinFloat(float a,float b)
{
if(a<=b)
return a;
else
return b;
}
float wirecoge::AbsFloat(float a)
{
if(a<0)
return -a;
else
return a;
}
int wirecoge::AbsInt(int a)
{
if(a<0)
return -a;
else
return a;
}
</pre>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -