C++ 特征:计算A*S*A_转置并将结果存储在对称矩阵中的最佳方法

C++ 特征:计算A*S*A_转置并将结果存储在对称矩阵中的最佳方法,c++,linear-algebra,eigen,C++,Linear Algebra,Eigen,设S为对称nxn矩阵,a为mxn矩阵 给定:B=A*S*A_转置(其中“*”表示矩阵乘积运算) B也是一个对称矩阵 使用tuxfamily Eigen库版本3,实现此计算的干净高效的方法是什么?(所谓高效,我的主要意思是,在对称性使B元素变得不必要的情况下,不会执行B元素的重复计算。) 我猜它会利用SelfAdjointView,但我已经到处搜索,没有找到一个清晰的例子 该应用程序是一个卡尔曼滤波器,它严重依赖于涉及(对称)协方差矩阵的操作,因此我希望确保实现/设计正确 谢谢大家! 这应该很简单

设S为对称nxn矩阵,a为mxn矩阵

给定:B=A*S*A_转置(其中“*”表示矩阵乘积运算)

B也是一个对称矩阵

使用tuxfamily Eigen库版本3,实现此计算的干净高效的方法是什么?(所谓高效,我的主要意思是,在对称性使B元素变得不必要的情况下,不会执行B元素的重复计算。)

我猜它会利用SelfAdjointView,但我已经到处搜索,没有找到一个清晰的例子

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


谢谢大家!

这应该很简单。正如你自己所说,你可以通过自伴视图让艾根意识到你的矩阵是对称矩阵。还有另一个视图,即TriangularView,可用于存储结果。根据指定给三角形视图的if,仅计算rhs的相关部分。所以

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

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

谢谢!这是有道理的。我有一种感觉,事情就这么简单,但我很难把这些东西拼凑起来。看看参考资料,我觉得B.selfAdjointView也能做到这一点。对于lhs,自共轭视图和三角形视图的行为似乎完全相同。。。但是我在猜测,因为我仍然在思考这个问题。顺便说一句,我的基准测试工作(在旧的intel i5芯片上)表明,执行全矩阵乘法比使用三角形和自伴随视图要有效得多。我使用4x4到7x7的矩阵S进行测试,矩阵A有1到4行。我猜矢量化是造成性能差异的原因。如果A非常稀疏,则“手动”执行乘法的速度更快(使用稀疏矩阵表示的速度慢10倍)。