/* * @file JacobianSchurFactor.h * @brief Jacobianfactor that combines and eliminates points * @date Oct 27, 2013 * @uthor Frank Dellaert */ #pragma once #include #include #include #include #include #include namespace gtsam { /** * JacobianFactor for Schur complement that uses Q noise model */ template class JacobianSchurFactor: public JacobianFactor { public: typedef Eigen::Matrix Matrix2D; typedef std::pair KeyMatrix2D; // Use eigen magic to access raw memory typedef Eigen::Matrix DVector; typedef Eigen::Map DMap; typedef Eigen::Map ConstDMap; /** * @brief double* Matrix-vector multiply, i.e. y = A*x * RAW memory access! Assumes keys start at 0 and go to M-1, and x is laid out that way */ Vector operator*(const double* x) const { Vector Ax = zero(Ab_.rows()); if (empty()) return Ax; // Just iterate over all A matrices and multiply in correct config part for(size_t pos=0; poswhiten(Ax) : Ax; } /** * @brief double* Transpose Matrix-vector multiply, i.e. x += A'*e * RAW memory access! Assumes keys start at 0 and go to M-1, and y is laid out that way */ void transposeMultiplyAdd(double alpha, const Vector& e, double* x) const { Vector E = alpha * (model_ ? model_->whiten(e) : e); // Just iterate over all A matrices and insert Ai^e into y for(size_t pos=0; postransposeMultiplyAdd(alpha,Ax,y); if (empty()) return; Vector Ax = zero(Ab_.rows()); // Just iterate over all A matrices and multiply in correct config part for(size_t pos=0; poswhitenInPlace(Ax); model_->whitenInPlace(Ax); } // multiply with alpha Ax *= alpha; // Again iterate over all A matrices and insert Ai^e into y for(size_t pos=0; pos