0

我目前正在尝试调整 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 = rows not required)矩阵和不同维度的similarityTransformation 上调用它。我的问题是返回矩阵不是其中任何一个的类型,但它可以派生:

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

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

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

1 回答 1

1

首先,你应该注意到你不能创建 type 的对象MatrixBase<...>MatrixBase只是一个抽象基类。在您的情况下,t返回类型similarity应该是一个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将其更改为更复杂的东西以进行类型提升......)

于 2013-11-05T12:27:34.930 回答