Мы используем AspectJ и аннотации Java с этой целью. Если мы должны знать ко времени выполнения для метода, мы простой аннотируем его. Больше усовершенствованной версии могло использовать собственный уровень журнала, который может, включил и отключил во времени выполнения.
public @interface Trace {
boolean showParameters();
}
@Aspect
public class TraceAspect {
[...]
@Around("tracePointcut() && @annotation(trace) && !within(TraceAspect)")
public Object traceAdvice ( ProceedingJintPoint jP, Trace trace ) {
Object result;
// initilize timer
try {
result = jp.procced();
} finally {
// calculate execution time
}
return result;
}
[...]
}
То, что вы ищете, называется Фильтром Калмана . Он часто используется для сглаживания навигационных данных . Это не обязательно тривиально, и вы можете многое настроить, но это очень стандартный подход, который хорошо работает. Доступна библиотека KFilter , которая является реализацией C ++.
Мой следующий запасной вариант - метод наименьших квадратов . Фильтр Калмана сглаживает данные, принимая во внимание скорости, тогда как подход наименьших квадратов будет использовать только позиционную информацию. Тем не менее, это определенно проще реализовать и понять. Похоже, что в Научной библиотеке GNU может быть реализация этого.
Один из методов, который требует меньше математики / теории, - это выборка 2, 5, 7 или 10 точек данных за раз и определение тех, которые являются выбросами. Менее точная мера выброса, чем фильтр Калмана, заключается в использовании следующего алгоритма для определения всех попарных расстояний между точками и исключения той, которая наиболее удалена от других. Обычно эти значения заменяются значением, наиболее близким к выпадающему значению, которое вы заменяете
Например,
Сглаживание в пяти точках выборки A, B, C, D, E
ATOTAL = СУММА расстояний AB AC AD AE
BTOTAL = СУММА расстояний AB BC BD BE
CTOTAL = СУММА расстояний AC BC CD CE
DTOTAL = СУММА расстояний DA DB DC DE
ETOTAL = СУММА расстояний EA EB EC DE
Если BTOTAL наибольшее, вы замените точку B на D, если BD = min {AB, BC, BD, BE}
Это сглаживание определяет выбросы и может быть увеличено за счет использования средней точки BD вместо точки D для сглаживания позиционной линии. Ваш опыт может отличаться, и существуют более математически строгие решения.
Что касается аппроксимации методом наименьших квадратов, вот еще пара вещей, с которыми можно поэкспериментировать:
То, что аппроксимация методом наименьших квадратов, не означает, что она должна быть линейной. Вы можете подобрать квадратичную кривую к данным методом наименьших квадратов, тогда это будет соответствовать сценарию, в котором пользователь ускоряется. (Обратите внимание, что под методом наименьших квадратов я подразумеваю использование координат в качестве зависимой переменной и времени в качестве независимой переменной.)
Вы также можете попробовать взвесить точки данных на основе заявленной точности. Когда точность низкая, вес этих точек данных ниже.
Еще одна вещь, которую вы, возможно, захотите попробовать, - это не отображать одну точку, если точность низкая, отобразите кружок или что-то, указывающее диапазон, в котором пользователь может основываться на заявленная точность. (Это то, что делает встроенное в iPhone приложение Google Maps. )
Вы также можете использовать сплайн. Введите имеющиеся у вас значения и интерполируйте точки между известными точками. Связывая это с методом наименьших квадратов, скользящее среднее или фильтр Калмана (как упоминалось в других ответах) дает вам возможность вычислять точки между вашими «известными» точками.
Возможность интерполировать значения между вашими известными точками дает вам приятный плавный переход и / разумный / приближение того, какие данные были бы представлены, если бы у вас была более высокая точность. http://en.wikipedia.org/wiki/Spline_interpolation
У разных сплайнов разные характеристики. Чаще всего используются сплайны Акима и Кубик.
Другой алгоритм, который следует рассмотреть, - это алгоритм упрощения линий Рамера-Дугласа-Пекера, он довольно часто используется для упрощения данных GPS. ( http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm )
Возможность интерполировать значения между вашими известными значениями дает вам приятный плавный переход и / разумное / приближение того, какие данные были бы представлены, если бы у вас была более высокая точность. http://en.wikipedia.org/wiki/Spline_interpolation
У разных сплайнов разные характеристики. Чаще всего используются сплайны Акима и Кубик.
Другой алгоритм, который следует рассмотреть, - это алгоритм упрощения линий Рамера-Дугласа-Пекера, он довольно часто используется для упрощения данных GPS. ( http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm )
Возможность интерполировать значения между вашими известными значениями дает вам приятный плавный переход и / разумное / приближение того, какие данные были бы представлены, если бы у вас была более высокая точность. http://en.wikipedia.org/wiki/Spline_interpolation
У разных сплайнов разные характеристики. Чаще всего используются сплайны Акима и Кубик.
Другой алгоритм, который следует рассмотреть, - это алгоритм упрощения линий Рамера-Дугласа-Пекера, он довольно часто используется для упрощения данных GPS. ( http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm )
org / wiki / Spline_interpolationУ разных сплайнов разные характеристики. Чаще всего используются сплайны Акима и Кубик.
Другой алгоритм, который следует рассмотреть, - это алгоритм упрощения линий Рамера-Дугласа-Пекера, он довольно часто используется для упрощения данных GPS. ( http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm )
org / wiki / Spline_interpolationУ разных сплайнов разные характеристики. Чаще всего используются сплайны Акима и Кубик.
Другой алгоритм, который следует рассмотреть, - это алгоритм упрощения линий Рамера-Дугласа-Пекера, он довольно часто используется для упрощения данных GPS. ( http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm )