Наследование от Matrix
Перед наследованием от Matrix, убедитесь, что использование EIGEN_MATRIX_PLUGIN не является более подходящим решением (см. предыдущий раздел). Если вам нужно добавить несколько членов к Matrix, это правильный способ.
Пример, когда вам действительно нужно унаследовать от Matrix, — это когда у вас несколько уровней наследования, таких как MyVerySpecificVector1, MyVerySpecificVector2 -> MyVector1 -> Matrix и MyVerySpecificVector3, MyVerySpecificVector4 -> MyVector2 -> Matrix.
Для работы вашего объекта в рамках фреймворка Eigen вам необходимо определить несколько членов в унаследованном классе.
Вот минимальный пример:
#include <Eigen/Core> #include <iostream> class MyVectorType : public Eigen::VectorXd { public: MyVectorType(void):Eigen::VectorXd() {} // This constructor allows you to construct MyVectorType from Eigen expressions template<typename OtherDerived> MyVectorType(const Eigen::MatrixBase<OtherDerived>& other) : Eigen::VectorXd(other) { } // This method allows you to assign Eigen expressions to MyVectorType template<typename OtherDerived> MyVectorType& operator=(const Eigen::MatrixBase <OtherDerived>& other) { this->Eigen::VectorXd::operator=(other); return *this; } }; int main() { MyVectorType v = MyVectorType::Ones(4); v(2) += 10; v = 2 * v; std::cout << v.transpose() << std::endl; }
Вывод:
2 2 22 2
Вот какой вид ошибки вы можете получить, если не предоставите эти методы
error: no match for ‘operator=’ in ‘v = Eigen::operator*( const Eigen::MatrixBase<Eigen::Matrix<double, -0x000000001, 1, 0, -0x000000001, 1> >::Scalar&, const Eigen::MatrixBase<Eigen::Matrix<double, -0x000000001, 1> >::StorageBaseType&) (((const Eigen::MatrixBase<Eigen::Matrix<double, -0x000000001, 1> >::StorageBaseType&) ((const Eigen::MatrixBase<Eigen::Matrix<double, -0x000000001, 1> >::StorageBaseType*)(& v))))’
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/TopicCustomizing_InheritingMatrix.html