【发布时间】:2021-12-24 06:27:47
【问题描述】:
我需要反转一个特征矩阵(在我的特定情况下为 9x9)作为我想使用 CppAD 自动区分的代码的一部分。为此,执行反转的代码不能包含任何分支,例如 if 或 switch 语句。不幸的是,Eigen 的反函数包含分支,使得 CppAD 的算法微分失败。
从数学上讲,应该可以提出一个公式,该公式不需要为保证可逆的固定矩阵大小进行分支。对吗?
你知道有什么库可以在没有分支的情况下实现这种逆运算吗?
【问题讨论】:
-
我使用了块矩阵求逆和 Eigen 的固定大小矢量化求逆例程(4 x 4 或更小)来计算 10 x 10 的逆。您需要知道对角线上的特定子块(比如左上角)在编译时是否可逆。在我的例子中,它实际上比 LU 分解要快得多,而且和 LU 分解一样准确。 en.wikipedia.org/wiki/Block_matrix#Block_matrix_inversion
-
感谢您的宝贵意见!我有一个特殊情况,右下角矩阵 D 实际上为零,因此可以显着加快速度。不幸的是,我的左上角矩阵 A 已经是 7x7 维数。但我想我可以使用相同的块逆技术来获得 A 的逆。非常感谢!
-
完全正确 - 您可以混合和匹配块大小以满足您的特定标准(例如,对角线上的 4 x 4 和 3 x 3 块用于 7 x 7)。
标签: c++ matrix eigen matrix-inverse differentiation