https://github.com/cran/dtw
Tip revision: e5274988af4af0e65de75ac6ae8092578d89f1b4 authored by Toni Giorgino on 22 August 2012, 00:00:00 UTC
version 1.15
version 1.15
Tip revision: e527498
backtrack.R
###############################################################
# #
# (c) Toni Giorgino <toni.giorgino,gmail.com> #
# Istituto di Ingegneria Biomedica (ISIB-CNR) #
# Consiglio Nazionale delle Ricerche #
# www.isib.cnr.it #
# #
# $Id: backtrack.R 267 2012-08-12 14:37:26Z tonig $
# #
###############################################################
########################################
## Backtrack the steps taken - internal
`backtrack` <-
function(gcm) {
dir<-gcm$stepPattern;
npat <- attr(dir,"npat");
n <- nrow(gcm$costMatrix);
m <- ncol(gcm$costMatrix);
i <- n;
j <- gcm$jmin;
## drop rows with (0,0) deltas
nullrows <- dir[,2]==0 & dir[,3] ==0 ;
tmp <- dir[!nullrows,];
## Pre-compute steps
stepsCache <- list();
for(k in 1:npat) {
stepsCache[[k]] <- .extractpattern(tmp,k);
}
## mapping lists
ii<-c(i);
jj<-c(j);
repeat {
## cross fingers for termination
if(i==1 && j==1) {
break;
}
## direction taken
s<-gcm$directionMatrix[i,j];
if(is.na(s)) {
break;
}
## undo the steps
steps<-stepsCache[[s]];
ns<-nrow(steps);
## In some rare cases (eg symmetricP0), ns will be 1
## R indexing rules make k==0 a no-op anyway
for(k in 1:ns) {
## take note of current cell, prepending to mapping lists
ii <- c(i-steps[k,1],ii);
jj <- c(j-steps[k,2],jj);
## All sub-steps are visited & appended; we have dropped (0,0) deltas
}
## And don't forget where we arrived to
i<-i-steps[ns,1];
j<-j-steps[ns,2];
}
out<-list();
out$index1<-ii;
out$index2<-jj;
return(out);
}