Missing operators for SkewSymmetricMatrix3

Summary

Working with SkewSymmetricMatrix3 shows that some operators are not implemented yet.

Environment

  • Operating System : Linux
  • Architecture : x64
  • Eigen Version : master
  • Compiler Version : Gcc11.4

Minimal Example

The following code (godbolt) works as expected but requires the usage of .toDenseMatrix() in many places due to missing implementation of operations.

#include <Eigen/Dense>
using namespace Eigen;

int main()
{
    Matrix3d A = Matrix3d::Random();
    Vector3d b = Vector3d::Random();
    
    // error: no match for ‘operator-’ (operand types are ‘Eigen::Matrix3d’ {aka ‘Eigen::Matrix<double, 3, 3>’} and ‘Eigen::SkewSymmetricMatrix3<double>’)
    // Matrix3d c1 = A - SkewSymmetricMatrix3<double>(A * b);
    Matrix3d c1 = A - SkewSymmetricMatrix3<double>(A * b).toDenseMatrix();

    // error: no match for ‘operator-’ (operand types are ‘const Eigen::Product<Eigen::Matrix<double, 3, 3>, Eigen::SkewSymmetricMatrix3<double>, 1>’ and ‘Eigen::SkewSymmetricMatrix3<double>’)
    // Matrix3d c2 = A * SkewSymmetricMatrix3<double>(b)
    //              - SkewSymmetricMatrix3<double>(A * b);
    Matrix3d c2 = A * SkewSymmetricMatrix3<double>(b)
                 - SkewSymmetricMatrix3<double>(A * b).toDenseMatrix();

    // error: no match for ‘operator-’ (operand types are ‘Eigen::Product<Eigen::SkewSymmetricMatrix3<double>, Eigen::Matrix<double, 3, 3>, 1>’ and ‘Eigen::SkewSymmetricMatrix3<double>’)
    // Matrix3d c3 = SkewSymmetricMatrix3<double>(b) * A
    //              - SkewSymmetricMatrix3<double>(A * b);
    Matrix3d c3 = SkewSymmetricMatrix3<double>(b) * A
                 - SkewSymmetricMatrix3<double>(A * b).toDenseMatrix();
}

Steps to reproduce

Trying to compile the expressions without .toDenseMatrix() leads to a compilation error.

What is the current bug behavior?

Important operators are not implemented:

  • error: no match for ‘operator-’ (operand types are ‘Eigen::Matrix3d’ {aka ‘Eigen::Matrix<double, 3, 3>’} and ‘Eigen::SkewSymmetricMatrix3’)
  • error: no match for ‘operator-’ (operand types are ‘const Eigen::Product<Eigen::Matrix<double, 3, 3>, Eigen::SkewSymmetricMatrix3, 1>’ and ‘Eigen::SkewSymmetricMatrix3’)
  • error: no match for ‘operator-’ (operand types are ‘Eigen::Product<Eigen::SkewSymmetricMatrix3, Eigen::Matrix<double, 3, 3>, 1>’ and ‘Eigen::SkewSymmetricMatrix3’)

What is the expected correct behavior?

The simple expressions should compile without using .toDenseMatrix().