使用EIGEN_MATRIXBASE_PLUGIN访问Eigen中的模板值

时间:2013-11-05 09:31:07

标签: c++ templates eigen

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

matrix.similarity(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 =行不需要)矩阵和不同维度的similarityTransformation上调用它。我的问题是返回矩阵不属于任何一种类型,但它可以派生出来:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

第三,你的similarity()方法必须模仿接受任何其他Eigen的表达式。

以下是提案:

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

这个例子可以进一步扩展到支持混合实数与复合体......(只有Scalar必须更改为更复杂的类型促销..)