3,423
社区成员
发帖
与我相关
我的任务
分享
function dist = dtw(test, ref)
global x y_min y_max
global t r
global D d
global m n
t = test;
r = ref;
n = size(t,1);%返回的时矩阵t的行数
m = size(r,1);%返回的时矩阵r的行数
d = zeros(m,1);%产生一个的m*1的全0矩阵
D = ones(m,1) * realmax;%realmax系统所能表示的最大数
D(1) = 0;
% 如果两个模板长度相差过多,匹配失败
if (2*m-n<3) | (2*n-m<2)
dist = realmax;
return
end
% 计算匹配区域
xa = round((2*m-n)/3);%round四舍五入取整
xb = round((2*n-m)*2/3);
if xb>xa
%xb>xa, 按下面三个区域匹配
% 1 :xa
% xa+1:xb
% xb+1:N
for x = 1:xa
y_max = 2*x;
y_min = round(0.5*x);
warp%由warp函数的纹理成图功能实现平面图像在空间三维曲面上的显示
end
for x = (xa+1):xb
y_max = round(0.5*(x-n)+m);
y_min = round(0.5*x);
warp
end
for x = (xb+1):n
y_max = round(0.5*(x-n)+m);
y_min = round(2*(x-n)+m);
warp
end
elseif xa>xb
%xa>xb, 按下面三个区域匹配
% 0 :xb
% xb+1:xa
% xa+1:N
for x = 1:xb
y_max = 2*x;
y_min = round(0.5*x);
warp
end
for x = (xb+1):xa
y_max = 2*x;
y_min = round(2*(x-n)+m);
warp
end
for x = (xa+1):n
y_max = round(0.5*(x-n)+m);
y_min = round(2*(x-n)+m);
warp
end
elseif xa==xb
%xa=xb, 按下面两个区域匹配
% 0 :xa
% xa+1:N
for x = 1:xa
y_max = 2*x;
y_min = round(0.5*x);
warp
end
for x = (xa+1):n
y_max = round(0.5*(x-n)+m);
y_min = round(2*(x-n)+m);
warp
end
end
%返回匹配分数
dist = D(m);
function warp
global x y_min y_max
global t r
global D d
global m n
d = D;
for y = y_min:y_max
D1 = D(y);
if y>1
D2 = D(y-1);
else
D2 = realmax;
end
if y>2
D3 = D(y-2);
else
D3 = realmax;
end
d(y) = sum((t(x,:)-r(y,:)).^2) + min([D1,D2,D3]);
end
D = d;