public Gesture SampleSignal(Gesture signal) { var sampledValues = new List<double[]>(); var sampledSignal = new Gesture(sampledValues, signal.Label); for (var j = 0; j < SampleSteps; ++j) { sampledValues.Add(new double[3]); for (var i = 0; i < 3; ++i) { var findex = 1.0 * (signal.Length - 1) * j / (SampleSteps - 1); var res = findex - (int) findex; sampledSignal.SetValue(j, i, (1-res) * signal.GetValue((int)findex, i) + ((int)findex + 1 < signal.Length - 1 ? res * signal.GetValue((int)findex + 1, i) : 0)); } } return sampledSignal; }
public Gesture SampleSignal(Gesture signal) { var sampledValues = new List<double[]>(); var sampledSignal = new Gesture(sampledValues, signal.Label); var min = double.MaxValue; var max = double.MinValue; for (var i = 0; i < signal.Length; ++i) { for (var j = 0; j < 3; ++j) { if (signal.GetValue(i, j) > max) max = signal.GetValue(i, j); if (signal.GetValue(i, j) < min) min = signal.GetValue(i, j); } } for (var i = 0; i < signal.Length; ++i) { sampledValues.Add(new double[3]); for (var j = 0; j < 3; ++j) { sampledSignal.SetValue(i, j, (signal.GetValue(i, j) - min) / (max - min)); } } return sampledSignal; }
public static double CalcDistance(Gesture a, Gesture b) { int signalDimensions = a.Values[0].Length; int signal1Length = a.Length; int signal2Length = b.Length; var distMatrix = new double[signal1Length, signal2Length]; var costMatrix = new double[signal1Length, signal2Length]; for (var i = 0; i < signal1Length; ++i) { for (var j = 0; j < signal2Length; ++j) { var vec = new List<double>(); for (var k = 0; k < signalDimensions; ++k) { vec.Add(a.GetValue(i, k) - b.GetValue(j, k)); } distMatrix[i, j] = PNorm(vec, 2); } } for (var i = 0; i < signal1Length; ++i) { costMatrix[i, 0] = distMatrix[i, 0]; } for (var j = 1; j < signal2Length; ++j) { for (var i = 0; i < signal1Length; ++i) { if (i == 0) { costMatrix[i, j] = costMatrix[i, j - 1] + distMatrix[i, j]; } else { double cost; var minCost = costMatrix[i - 1, j - 1] + distMatrix[i, j]; if ((cost = costMatrix[i - 1, j] + distMatrix[i, j]) < minCost) { minCost = cost + OffsetPenalty; } if ((cost = costMatrix[i, j - 1] + distMatrix[i, j]) < minCost) { minCost = cost + OffsetPenalty; } costMatrix[i, j] = minCost; } } } return costMatrix[signal1Length - 1, signal2Length - 1]; }