function distance = tnp_dtw2(a_ref, a_test) % Calcul le chemin optimum selon l'algo de la DTW entre deux tableaux de vecteurs % [dist] = distdtw(a_test,a_ref) [long_ref, pole] = size(a_ref); [long_test, pole] = size(a_test); dist_local = zeros(long_ref,1); dist_acc = zeros(long_ref,2); % Initialisation : Calcul de la 1ère colonne dist_local(1,1) = sqrt((a_ref(1,:) - a_test(1,:)) * (a_ref(1,:) - a_test(1,:))'); dist_acc(1,2) = dist_local(1,1); for i=2:long_ref dist_acc(i,2) = 1e12; end % Calcul pour l'ensemble de la matrice for k=2:long_test % Copie de la colonne de droite dans la colonne de gauche dist_acc(:,1) = dist_acc(:,2); % Calcul des nouvelles distances uniquement dans la zone autorisée a = round(2 * k + long_ref - 2 * long_test); b = round(-1 + 2 * k); for l = max([a 1]): min([b long_ref]) dist_local(l,1) = sqrt((a_ref(l,:) - a_test(k,:)) * (a_ref(l,:) - a_test(k,:))'); end % Calcul des distances accumulées uniquement dans la zone autorisée if a < 2 dist_acc(1,2) = dist_local(1,1) + dist_acc(1,1); else dist_acc(1,2) = 1e12; end for l = 2:(a-1) dist_acc(l,2) = 1e12; end for l = max([2,a]): min([long_ref,b]) dist_acc(l,2) = dist_local(l,1) + min([dist_acc(l - 1, 2) dist_acc(l,1) dist_acc(l - 1,1)]); end for l = (b+1):long_ref dist_acc(l,2) = 1e12; end end distance = dist_acc(long_ref,2);