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.