mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-27 14:33:34 +08:00
Analytic inverse implementation (#122)
* Add analytic 2x2 matrix inverse * Add analytical 3x3 matrix inverse
This commit is contained in:
@@ -435,6 +435,47 @@ bool inv(const SquareMatrix<Type, M> & A, SquareMatrix<Type, M> & inv)
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename Type>
|
||||
bool inv(const SquareMatrix<Type, 2> & A, SquareMatrix<Type, 2> & inv)
|
||||
{
|
||||
Type det = A(0, 0) * A(1, 1) - A(1, 0) * A(0, 1);
|
||||
|
||||
if(fabs(static_cast<float>(det)) < FLT_EPSILON || !is_finite(det)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
inv(0, 0) = A(1, 1);
|
||||
inv(1, 0) = -A(1, 0);
|
||||
inv(0, 1) = -A(0, 1);
|
||||
inv(1, 1) = A(0, 0);
|
||||
inv /= det;
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename Type>
|
||||
bool inv(const SquareMatrix<Type, 3> & A, SquareMatrix<Type, 3> & inv)
|
||||
{
|
||||
Type det = A(0, 0) * (A(1, 1) * A(2, 2) - A(2, 1) * A(1, 2)) -
|
||||
A(0, 1) * (A(1, 0) * A(2, 2) - A(1, 2) * A(2, 0)) +
|
||||
A(0, 2) * (A(1, 0) * A(2, 1) - A(1, 1) * A(2, 0));
|
||||
|
||||
if(fabs(static_cast<float>(det)) < FLT_EPSILON || !is_finite(det)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
inv(0, 0) = A(1, 1) * A(2, 2) - A(2, 1) * A(1, 2);
|
||||
inv(0, 1) = A(0, 2) * A(2, 1) - A(0, 1) * A(2, 2);
|
||||
inv(0, 2) = A(0, 1) * A(1, 2) - A(0, 2) * A(1, 1);
|
||||
inv(1, 0) = A(1, 2) * A(2, 0) - A(1, 0) * A(2, 2);
|
||||
inv(1, 1) = A(0, 0) * A(2, 2) - A(0, 2) * A(2, 0);
|
||||
inv(1, 2) = A(1, 0) * A(0, 2) - A(0, 0) * A(1, 2);
|
||||
inv(2, 0) = A(1, 0) * A(2, 1) - A(2, 0) * A(1, 1);
|
||||
inv(2, 1) = A(2, 0) * A(0, 1) - A(0, 0) * A(2, 1);
|
||||
inv(2, 2) = A(0, 0) * A(1, 1) - A(1, 0) * A(0, 1);
|
||||
inv /= det;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* inverse based on LU factorization with partial pivotting
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user