在没有自动微分的分支语句的情况下反转特征矩阵的函数
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);
}
我需要反转一个特征矩阵(在我的特定情况下是 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);
}