我目前正在尝试调整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>
答案 0 :(得分:1)
首先,您应该注意到您无法创建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
必须更改为更复杂的类型促销..)