9

令 S 为对称 nxn 矩阵,A 为 amxn 矩阵。

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

B 也将是一个对称矩阵。

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

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

该应用程序是一个卡尔曼滤波器,它在很大程度上取决于涉及(对称)协方差矩阵的操作,所以我想确保实现/设计正确。

谢谢!

4

1 回答 1

6

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

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

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

于 2012-11-04T20:14:40.907 回答