Eigen matrix inverse¶
This is an example of how to use the Symbol class to see what is going on
inside the Eigen Library Eigen is a
templated matrix library which takes an arbitrary scalar type. Through
the include <codegenvar/Eigen> we can access the following typedefs:
namespace codegenvar
{
typedef Eigen::Matrix<Symbol, -1, 1> Vec;
typedef Eigen::Matrix<Symbol, -1, -1> Mat;
typedef Eigen::Matrix<Symbol, 2, 2> Mat2;
typedef Eigen::Matrix<Symbol, 2, 3> Mat23;
typedef Eigen::Matrix<Symbol, 3, 3> Mat3;
typedef Eigen::Matrix<Symbol, 2, 1> Vec2;
typedef Eigen::Matrix<Symbol, 3, 1> Vec3;
First we will test Eigen’s 2x2 fixed size implementation of the inverse function.
int main()
{
Mat2 m2 = namedMatrix("m", 2, 2);
std::cout << "m' = " << std::endl << m2.inverse() << std::endl << std::endl;
m' =
m_22/(-m_21*m_12 + m_22*m_11) -m_12/(-m_21*m_12 + m_22*m_11)
-m_21/(-m_21*m_12 + m_22*m_11) m_11/(-m_21*m_12 + m_22*m_11)
We can also test the inverse function for dynamically sized matrices. This gets a little bit more involved since the code contains several Conditional statements.
BooleanEvaluator evaluator;
Mat m = namedMatrix("m", 2, 2);
Mat inv(2, 2);
do
{
inv |= m.inverse();
} while (!evaluator.isFullyEvaluated());
std::cout << "m11' = " << std::endl << inv(0,0) << std::endl;
m11' =
abs(m_11) + abs(m_21) < abs(m_12) + abs(m_22) && 0 == abs(m_21) && abs(m_11) < abs(m_21) && 0 == abs(m_22 - m_21*m_12) ?
-m_12/(m_11*(m_22 - m_21*m_12)) :
abs(m_11) + abs(m_21) < abs(m_12) + abs(m_22) && 0 == abs(m_21) && abs(m_11) < abs(m_21) && 0 != abs(m_22 - m_21*m_12) ?
-m_12/(m_11*(m_22 - m_21*m_12)) :
abs(m_11) + abs(m_21) < abs(m_12) + abs(m_22) && 0 != abs(m_21) && abs(m_11) < abs(m_21) && 0 == abs(m_12 - m_22*m_11/m_21) ?
-m_22/(m_21*(m_12 - m_22*m_11/m_21)) :
abs(m_11) + abs(m_21) < abs(m_12) + abs(m_22) && 0 != abs(m_21) && abs(m_11) < abs(m_21) && 0 != abs(m_12 - m_22*m_11/m_21) ?
-m_22/(m_21*(m_12 - m_22*m_11/m_21)) :
abs(m_11) + abs(m_21) < abs(m_12) + abs(m_22) && 0 == abs(m_11) && abs(m_21) <= abs(m_11) && 0 == abs(m_22 - m_21*m_12) ?
(1 + m_21*m_12/(m_22 - m_21*m_12))/m_11 :
abs(m_11) + abs(m_21) < abs(m_12) + abs(m_22) && 0 == abs(m_11) && abs(m_21) <= abs(m_11) && 0 != abs(m_22 - m_21*m_12) ?
(1 + m_21*m_12/(m_22 - m_21*m_12))/m_11 :
abs(m_11) + abs(m_21) < abs(m_12) + abs(m_22) && 0 != abs(m_11) && abs(m_21) <= abs(m_11) && 0 == abs(m_22 - m_21*m_12/m_11) ?
(1 + m_21*m_12/(m_11*(m_22 - m_21*m_12/m_11)))/m_11 :
abs(m_11) + abs(m_21) < abs(m_12) + abs(m_22) && 0 != abs(m_11) && abs(m_21) <= abs(m_11) && 0 != abs(m_22 - m_21*m_12/m_11) ?
(1 + m_21*m_12/(m_11*(m_22 - m_21*m_12/m_11)))/m_11 :
abs(m_12) + abs(m_22) <= abs(m_11) + abs(m_21) && 0 == abs(m_21) && abs(m_11) < abs(m_21) && 0 == abs(m_22 - m_21*m_12) ?
-m_12/(m_11*(m_22 - m_21*m_12)) :
abs(m_12) + abs(m_22) <= abs(m_11) + abs(m_21) && 0 == abs(m_21) && abs(m_11) < abs(m_21) && 0 != abs(m_22 - m_21*m_12) ?
-m_12/(m_11*(m_22 - m_21*m_12)) :
abs(m_12) + abs(m_22) <= abs(m_11) + abs(m_21) && 0 != abs(m_21) && abs(m_11) < abs(m_21) && 0 == abs(m_12 - m_22*m_11/m_21) ?
-m_22/(m_21*(m_12 - m_22*m_11/m_21)) :
abs(m_12) + abs(m_22) <= abs(m_11) + abs(m_21) && 0 != abs(m_21) && abs(m_11) < abs(m_21) && 0 != abs(m_12 - m_22*m_11/m_21) ?
-m_22/(m_21*(m_12 - m_22*m_11/m_21)) :
abs(m_12) + abs(m_22) <= abs(m_11) + abs(m_21) && 0 == abs(m_11) && abs(m_21) <= abs(m_11) && 0 == abs(m_22 - m_21*m_12) ?
(1 + m_21*m_12/(m_22 - m_21*m_12))/m_11 :
abs(m_12) + abs(m_22) <= abs(m_11) + abs(m_21) && 0 == abs(m_11) && abs(m_21) <= abs(m_11) && 0 != abs(m_22 - m_21*m_12) ?
(1 + m_21*m_12/(m_22 - m_21*m_12))/m_11 :
abs(m_12) + abs(m_22) <= abs(m_11) + abs(m_21) && 0 != abs(m_11) && abs(m_21) <= abs(m_11) && 0 == abs(m_22 - m_21*m_12/m_11) ?
(1 + m_21*m_12/(m_11*(m_22 - m_21*m_12/m_11)))/m_11 :
(1 + m_21*m_12/(m_11*(m_22 - m_21*m_12/m_11)))/m_11
You can find the full source code of this example here.