设S是对称的n×n矩阵,A是m×n矩阵。
给定:B = A * S * A_transpose(其中“*”表示矩阵乘积运算)
B也将是一个对称矩阵。
使用tuxfamily Eigen库,版本3,什么是实现此计算的干净有效的方法? (通过有效,我主要是指在对称性不必要的情况下不执行B元素的重复计算。)
我猜它会使用SelfAdjointView,但我搜索了高低,并没有找到一个干净的例子。
该应用程序是一个卡尔曼滤波器,它严重依赖于涉及(对称)协方差矩阵的运算,因此我希望确保实现/设计正确。
谢谢!
答案 0 :(得分:5)
这应该很简单。正如您自己所说,您可以通过SelfAdjointView使Eigen意识到矩阵是对称矩阵。还有另一个视图,即TriangularView,您可以使用它来存储结果。根据{{3}},如果指定给TriangularView,则仅评估rhs的相关部分。所以
B.triangularView<Upper>() = A * S.selfadjointView<Upper>() * A.transpose();
会将结果存储在B的上三角形中。然后,您可以在任何进一步的计算中使用B.selfadjointView<Upper>
。我不确定这在所需操作方面是否是最佳的,您可能需要进行一些基准测试来验证。