使用 EIGEN_MATRIXBASE_PLUGIN 访问特征中的模板值

Accessing Template values in Eigen using EIGEN_MATRIXBASE_PLUGIN

本文关键字:访问 EIGEN MATRIXBASE PLUGIN 使用 特征      更新时间:2023-10-16

我目前正在尝试调整Eigen API以支持以下功能:

矩阵相似性(similarityTransformationMatrix);

它只是执行以下操作:

similarityTransformationMatrix * matrix * similarityTransformationMatrix.transpose();

我之前的实现只允许对两者采用平方矩阵:

inline MatrixBase< Derived > similarity( const MatrixBase< Derived >& m) const {
  MatrixBase< Derived > t = m;
  t.transposeInPlace();
  return m*(*this)*t;
}

相反,我需要能够在(正方形,但检查 cols = 不需要行)矩阵上调用它,以及相似性不同维度的转换。我的问题是返回矩阵不属于其中任何一个的类型,但它可以导出:

Matrix< double, similarityTransformation.rows(), similarityTransformation.rows()>

你能给我一些如何实现这一点的指示吗?我没有尝试将其实现为Eigen::Matrix,但如果可能的话,我宁愿坚持使用MatrixBase,但是MatrixBase不想接受表单返回类型的多个参数

MatrixBase< OtherDerived::Scalar, OtherDerived::RowsAtCompileTime, OtherDerived::RowsAtCompileTime>

首先,您应该注意,您无法创建类型为 MatrixBase<...> 的对象。 MatrixBase只是一个抽象的基类。在您的情况下,tsimilarity的返回类型应该是Matrix<...>对象。

其次,Matrix<...>的模板参数必须在编译时知道。这意味着您不能将similarityTransformation.rows()用于该目的,而可以使用 TYPEOF_similarityTransformation::RowsAtCompileTime

第三,您的similarity()方法必须模板化以接受任何其他特征表达式。

这里有一个建议:

template<typename OtherDerived>
Matrix<Scalar, OtherDerived::RowsAtCompileTime, OtherDerived::RowsAtCompileTime>
similarity(const MatrixBase<OtherDerived>& S) const
{
  return S * ( this->derived() * S.adjoint() );
}

这个例子可以进一步扩展,以支持将实数与复合物混合......(只有Scalar必须更改为更复杂的类型升级..)