示例#1
0
        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;
        }
示例#2
0
        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;
        }
示例#3
0
        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];
        }