Как быстро выполнять матричные операции

Часто при работе с данными датчика (или сигналом) мы обнаруживаем, что данные часто не чистые и содержат значительное количество шума. Такой шум затрудняет выполнение дальнейших математических операций, таких как дифференцирование, интегрирование, свертка и т. Д. Кроме того, такой шум представляет собой большую проблему, если мы должны использовать такие сигналы для операций в реальном времени, таких как управление автономным транспортным средством, роботом рука или промышленное предприятие, поскольку шум имеет тенденцию усиливаться в любых последующих математических операциях.

В таком случае общий подход состоит в сглаживании данных для удаления шума. Мы стремимся к сглаживанию таких данных в режиме реального времени для приложений в области техники управления, таких как интеллектуальное управление автономными транспортными средствами или роботами. Уже разработан ряд методов для сглаживания сигналов в режиме реального времени, например Фильтр Калмана, Расширенный фильтр Калмана и их варианты. Однако проектирование фильтра Калмана требует знания динамики системы, которая может быть известна или неизвестна. В таких обстоятельствах более простой подход - выполнить подгонку полиномов методом наименьших квадратов последних n полученных точек данных.

Математика подбора полиномов методом наименьших квадратов очень проста. Рассмотрим набор из n точек данных

В таком случае полиномиальная аппроксимация порядка k может быть записана как:

Остаточная величина в этом случае определяется выражением

Целью подбора полиномов методом наименьших квадратов является минимизация . Обычный подход состоит в том, чтобы взять частную производную уравнения 2 по коэффициентам a и приравнять к нулю. Это приводит к системе уравнений k. Такая система уравнений представляет собой уравнения матрицы Вандермонда, которые можно упростить и записать следующим образом:

В матричных обозначениях уравнение 3 можно записать как

Уравнение 4 может быть решено путем предварительного умножения на транспонирование T, таким образом вектор решения оказывается следующим:

Реализация полиномиальной аппроксимации методом наименьших квадратов

Как было сказано в начале, приложение, вызывающее озабоченность, здесь представляет собой систему реального времени, которая может иметь дело с критически важными для безопасности системами, такими как автономные транспортные средства и роботизированные манипуляторы. Для таких систем скорость внедрения имеет значение, если целью обычно является встроенная система. Отсюда общий выбор языка программирования для реализации на C ++. В этой статье мы используем пакет Eigen, написанный на C ++, для решения уравнения 5.

Для примеров точек данных, полученных из профиля скорости легкового автомобиля, ниже приведен код реализации. Я просто подогнал кубический многочлен. Обратите внимание, что подгонка полинома более высокой степени требует больших затрат вычислений и может вообще не понадобиться.

Компиляция и запуск указанной выше программы

Приведенный выше код написан с учетом системы Linux. Предварительным условием для компиляции является наличие компилятора g ++, предпочтительно g ++ 8 или более поздней версии, со стандартом C ++ 11 или более поздней версии. Далее мы предполагаем, что в системе установлен пакет Eigen. Заинтересованный пользователь может скачать tar-архив Eigen с версией 3 с сайта https://eigen.tuxfamily.org/dox/ и распаковать его в нужную папку. В моем случае пакет Eigen находится в /usr/include/eigen3 со структурой каталогов, которая выглядит так, как показано на рисунке 1 и рисунке 2. Пакет Eigen позволяет выполнять матричную математику очень быстро, что желательно для систем реального времени.

После того, как вы настроили свой пакет Eigen, вы можете скомпилировать программу eigen_polyfit.cpp с помощью команды g ++ и выполнить ее как

g++ -I /usr/include/eigen3 eigen_polyfit.cpp && ./a.out

Для наглядности я создал диаграмму рассеяния, показанную ниже:

Как видите, подобранные точки данных более гладкие по сравнению с исходными точками данных, и мы можем ожидать, что их производная также будет более плавной.

Ссылки

  1. Https://web.archive.org/web/20180527223004/http://dovgalecs.com:80/blog/eigen-how-to-get-in-and-out-data-from-eigen-matrix/
  2. Https://stackoverflow.com/questions/8443102/convert-eigen-matrix-to-c-array/29865019
  3. Https://iamfaisalkhan.com/matrix-manipulations-using-eigen-cplusplus/
  4. Https://mathworld.wolfram.com/LeastSquaresFittingPolynomial.html
  5. Https://eigen.tuxfamily.org/dox/group__TutorialLinearAlgebra.html
  6. Https://stackoverflow.com/questions/40510135/map-two-dimensional-array-to-eigenmatrix