11#ifndef EIGEN_INVERSE_IMPL_H
12#define EIGEN_INVERSE_IMPL_H
22template<
typename MatrixType,
typename ResultType,
int Size = MatrixType::RowsAtCompileTime>
26 static inline void run(
const MatrixType& matrix, ResultType& result)
28 result = matrix.partialPivLu().inverse();
32template<
typename MatrixType,
typename ResultType,
int Size = MatrixType::RowsAtCompileTime>
39template<
typename MatrixType,
typename ResultType>
43 static inline void run(
const MatrixType& matrix, ResultType& result)
45 typedef typename MatrixType::Scalar Scalar;
47 result.coeffRef(0,0) = Scalar(1) /
matrixEval.coeff(0,0);
51template<
typename MatrixType,
typename ResultType>
55 static inline void run(
56 const MatrixType& matrix,
59 typename ResultType::Scalar& determinant,
64 determinant = matrix.coeff(0,0);
66 if(
invertible) result.coeffRef(0,0) =
typename ResultType::Scalar(1) / determinant;
74template<
typename MatrixType,
typename ResultType>
76inline void compute_inverse_size2_helper(
77 const MatrixType& matrix,
const typename ResultType::Scalar&
invdet,
80 typename ResultType::Scalar temp = matrix.coeff(0,0);
81 result.coeffRef(0,0) = matrix.coeff(1,1) *
invdet;
82 result.coeffRef(1,0) = -matrix.coeff(1,0) *
invdet;
83 result.coeffRef(0,1) = -matrix.coeff(0,1) *
invdet;
84 result.coeffRef(1,1) = temp *
invdet;
87template<
typename MatrixType,
typename ResultType>
91 static inline void run(
const MatrixType& matrix, ResultType& result)
93 typedef typename ResultType::Scalar Scalar;
94 const Scalar
invdet =
typename MatrixType::Scalar(1) / matrix.determinant();
95 compute_inverse_size2_helper(matrix,
invdet, result);
99template<
typename MatrixType,
typename ResultType>
103 static inline void run(
104 const MatrixType& matrix,
107 typename ResultType::Scalar& determinant,
112 typedef typename ResultType::Scalar Scalar;
113 determinant = matrix.determinant();
116 const Scalar
invdet = Scalar(1) / determinant;
117 compute_inverse_size2_helper(matrix,
invdet, inverse);
125template<
typename MatrixType,
int i,
int j>
127inline typename MatrixType::Scalar cofactor_3x3(
const MatrixType& m)
135 return m.coeff(
i1,
j1) * m.coeff(
i2,
j2)
136 - m.coeff(
i1,
j2) * m.coeff(
i2,
j1);
139template<
typename MatrixType,
typename ResultType>
141inline void compute_inverse_size3_helper(
142 const MatrixType& matrix,
143 const typename ResultType::Scalar& invdet,
148 typedef typename ResultType::Scalar Scalar;
149 const Scalar c01 = cofactor_3x3<MatrixType,0,1>(matrix) * invdet;
150 const Scalar c11 = cofactor_3x3<MatrixType,1,1>(matrix) * invdet;
151 const Scalar c02 = cofactor_3x3<MatrixType,0,2>(matrix) * invdet;
152 result.coeffRef(1,2) = cofactor_3x3<MatrixType,2,1>(matrix) * invdet;
153 result.coeffRef(2,1) = cofactor_3x3<MatrixType,1,2>(matrix) * invdet;
154 result.coeffRef(2,2) = cofactor_3x3<MatrixType,2,2>(matrix) * invdet;
155 result.coeffRef(1,0) = c01;
156 result.coeffRef(1,1) = c11;
157 result.coeffRef(2,0) = c02;
158 result.row(0) = cofactors_col0 * invdet;
161template<
typename MatrixType,
typename ResultType>
165 static inline void run(
const MatrixType& matrix, ResultType& result)
167 typedef typename ResultType::Scalar Scalar;
178template<
typename MatrixType,
typename ResultType>
182 static inline void run(
183 const MatrixType& matrix,
186 typename ResultType::Scalar& determinant,
190 typedef typename ResultType::Scalar Scalar;
198 const Scalar
invdet = Scalar(1) / determinant;
207template<
typename Derived>
209inline const typename Derived::Scalar general_det3_helper
212 return matrix.coeff(
i1,
j1)
213 * (matrix.coeff(
i2,
j2) * matrix.coeff(
i3,
j3) - matrix.coeff(
i2,
j3) * matrix.coeff(
i3,
j2));
216template<
typename MatrixType,
int i,
int j>
218inline typename MatrixType::Scalar cofactor_4x4(
const MatrixType& matrix)
228 return general_det3_helper(matrix, i1, i2, i3, j1, j2, j3)
229 + general_det3_helper(matrix, i2, i3, i1, j1, j2, j3)
230 + general_det3_helper(matrix, i3, i1, i2, j1, j2, j3);
233template<
int Arch,
typename Scalar,
typename MatrixType,
typename ResultType>
237 static void run(
const MatrixType& matrix, ResultType& result)
255 result /= (matrix.col(0).cwiseProduct(result.row(0).transpose())).sum();
259template<
typename MatrixType,
typename ResultType>
262 MatrixType, ResultType>
266template<
typename MatrixType,
typename ResultType>
270 static inline void run(
271 const MatrixType& matrix,
274 typename ResultType::Scalar& determinant,
279 determinant = matrix.determinant();
281 if(
invertible && extract_data(matrix) != extract_data(inverse)) {
300template<
typename DstXprType,
typename XprType>
312 const int Size = EIGEN_PLAIN_ENUM_MIN(XprType::ColsAtCompileTime,DstXprType::ColsAtCompileTime);
313 EIGEN_ONLY_USED_FOR_DEBUG(Size);
314 eigen_assert(( (Size<=1) || (Size>4) || (extract_data(
src.nestedExpression())!=extract_data(
dst)))
315 &&
"Aliasing problem detected in inverse(), you need to do inverse().eval() here.");
346template<
typename Derived>
351 eigen_assert(rows() == cols());
375template<
typename Derived>
376template<
typename ResultType>
379 typename ResultType::Scalar& determinant,
385 eigen_assert(rows() == cols());
416template<
typename Derived>
417template<
typename ResultType>
426 eigen_assert(rows() == cols());
EIGEN_DEVICE_FUNC void resize(Index newSize)
Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods...
Definition DenseBase.h:246
Expression of the inverse of another expression.
Definition Inverse.h:44
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
void computeInverseAndDetWithCheck(ResultType &inverse, typename ResultType::Scalar &determinant, bool &invertible, const RealScalar &absDeterminantThreshold=NumTraits< Scalar >::dummy_precision()) const
\lu_module
Definition InverseImpl.h:377
@ RowsAtCompileTime
The number of rows at compile-time.
Definition DenseBase.h:100
EIGEN_DEVICE_FUNC Scalar determinant() const
\lu_module
Definition Determinant.h:108
EIGEN_DEVICE_FUNC const Inverse< Derived > inverse() const
\lu_module
Definition InverseImpl.h:348
Namespace containing all symbols from the Eigen library.
Definition LDLT.h:16
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
Holds information about the various numeric (i.e.
Definition NumTraits.h:236
Definition AssignEvaluator.h:824
Definition AssignEvaluator.h:814
Definition AssignmentFunctors.h:21
Definition InverseImpl.h:33
Definition InverseImpl.h:235
Definition InverseImpl.h:24
Definition CoreEvaluators.h:91
Definition inference.c:32