在没有自动微分的分支语句的情况下反转特征矩阵的函数

Function to invert Eigen matrix without branching statements for auto differentiation

我需要反转一个特征矩阵(在我的特定情况下是 9x9)作为我想使用 CppAD 自动区分的代码的一部分。为了成功,执行反转的代码不能包含任何分支,例如 if 或 switch 语句。不幸的是,Eigen 的反函数包含分支,使得 CppAD 的算法微分失败。

从数学上讲,应该可以提出一个公式,该公式不需要对保证可逆的固定矩阵大小进行分支。对吗?

你知道有哪个库可以在没有分支的情况下实现这种逆运算吗?

一般来说,可以在没有分支的情况下对任意大(可逆)矩阵进行求逆,但是对于更大的矩阵,这会变得效率低下。 Eigen 仅对大小不超过 4x4 的矩阵执行此操作。

如果要逆推导,就用恒等式

deriv (inv(A)) = - inv(A) * deriv(A) * inv(A)

即计算普通矩阵的逆矩阵,然后计算上面的表达式。

算术函数有从分支到无分支的机械转换。

复制你在每个分支中使用的所有变量,并计算两半。在块的末尾,将 if 分支乘以 condition,将 else 分支乘以 !condition,然后将它们相加。

同理一个switch,计算所有情况,乘以value == case

例如

Mat frob_branch(Mat a, Mat b) {
    if (a.baz()) {
        return a * b;
    } else {
        return b * a;
    }
}

变成

Mat frob_no_branch(Mat a, Mat b) {
    auto if_true = a * b;
    auto if_false = b * a;
    bool condition = a.baz();
    return (if_true * condition) + (if_false * !condition);
}