特征:评估A*S*A_transpose并将结果存储在对称矩阵中的最佳方法

arr*_*sea 8 c++ linear-algebra eigen

设S是对称nxn矩阵,A是amxn矩阵.

给定:B = A*S*A_transpose(其中"*"表示矩阵乘积运算)

B也将是对称矩阵.

使用tuxfamily Eigen库,版本3,什么是实现此计算的干净有效的方法?(通过有效,我主要是指在对称性不必要的情况下,不执行B元素的重复计算.)

我猜它会使用SelfAdjointView,但我搜索了高低,没有找到一个干净的例子.

该应用程序是一个卡尔曼滤波器,它严重依赖于涉及(对称)协方差矩阵的运算,因此我希望确保实现/设计正确.

谢谢!

Jak*_*kob 5

这应该很简单.正如您自己所说,您可以通过SelfAdjointView使Eigen意识到矩阵是对称矩阵.还有另一个视图,即TriangularView,您可以使用它来存储结果.根据参考文献,如果您指定TriangularView,则仅评估rhs的相关部分.所以

B.triangularView<Upper>() = A * S.selfadjointView<Upper>() * A.transpose();
Run Code Online (Sandbox Code Playgroud)

将结果存储在B的上三角形中.然后可以B.selfadjointView<Upper>在任何进一步的计算中使用.我不确定这在所需操作方面是否是最佳的,您可能需要进行一些基准测试来验证.

  • 顺便说一句,我的基准测试工作(在较旧的intel i5芯片上)表明,执行全矩阵乘法,而不是使用三角形和自耦合视图要高效得多.我用4x4到7x7的矩阵S和1到4行的矩阵A进行了测试.我猜测矢量化正在改变性能.如果A非常稀疏,则"手动"进行乘法会更快(并且使用稀疏矩阵表示会慢10倍). (5认同)