Eigen: лучший способ оценить A * S * A_transpose и сохранить результат в симметричной матрице

Пусть S — симметричная матрица n x n, а A — матрица m x n.

Дано: B = A * S * A_transpose (где «*» представляет операцию продукта матрицы)

B также будет симметричной матрицей.

Используя библиотеку tuxfamily Eigen, версия 3, что является чистым и эффективным способом реализации этого вычисления? (Под эффективностью я в основном имею в виду, что дублирующие вычисления элементов B не выполняются там, где симметрия делает их ненужными.)

Я предполагаю, что он будет использовать SelfAdjointView, но я искал высоко и низко и не нашел чистый пример этого.

Приложение представляет собой фильтр Калмана, который сильно зависит от операций с (симметричными) ковариационными матрицами, поэтому я хочу быть уверенным в правильности реализации / дизайна.

Спасибо!

8

Решение

Это должно быть довольно просто. Как вы говорите сами, вы можете заставить Eigen осознать тот факт, что ваша матрица является симметричной матрицей через SelfAdjointView. Существует также другое представление, которое представляет собой TriangularView, которое можно использовать для хранения результатов. Согласно ссылка если вы присваиваете TriangularView, оцениваются только соответствующие части rhs. Так

B.triangularView<Upper>() = A * S.selfadjointView<Upper>() * A.transpose();

сохранит результат в верхнем треугольнике B. Затем вы можете использовать B.selfadjointView<Upper> в любых дальнейших расчетах. Я не уверен, является ли это оптимальным с точки зрения требуемых операций, и вы могли бы провести сравнительный анализ для проверки.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]