Eigen::Matrix<typename Derived::Scalar, NRows * NCols, QSubvectorSize == Eigen::Dynamic ? Derived::ColsAtCompileTime : QSubvectorSize> getSubMatrixGradient(const Eigen::MatrixBase<Derived>& dM, const std::array<int, NRows>& rows, const std::array<int, NCols>& cols, int M_rows, int q_start, int q_subvector_size) { if (q_subvector_size == Eigen::Dynamic) { q_subvector_size = dM.cols() - q_start; } Eigen::Matrix<typename Derived::Scalar, NRows * NCols, Derived::ColsAtCompileTime> dM_submatrix(NRows * NCols, q_subvector_size); int index = 0; for (int col : cols) { for (int row : rows) { dM_submatrix.row(index++) = dM.template block<1, QSubvectorSize> (row + col * M_rows, q_start, 1, q_subvector_size); } } return dM_submatrix; }
Eigen::Matrix<typename Derived::Scalar, Eigen::Dynamic, Eigen::Dynamic> getSubMatrixGradient( const Eigen::MatrixBase<Derived>& dM, const std::vector<int>& rows, const std::vector<int>& cols, int M_rows, int q_start, int q_subvector_size) { if (q_subvector_size < 0) { q_subvector_size = dM.cols() - q_start; } Eigen::MatrixXd dM_submatrix(rows.size() * cols.size(), q_subvector_size); int index = 0; for (int col : cols) { for (int row : rows) { dM_submatrix.row(index) = dM.block(row + col * M_rows, q_start, 1, q_subvector_size); index++; } } return dM_submatrix; }
Eigen::Matrix<typename Derived::Scalar, Eigen::Dynamic, Eigen::Dynamic> getSubMatrixGradient( const Eigen::MatrixBase<Derived>& dM, const std::vector<int>& rows, const std::vector<int>& cols, typename Derived::Index M_rows, int q_start, typename Derived::Index q_subvector_size) { if (q_subvector_size < 0) { q_subvector_size = dM.cols() - q_start; } Eigen::MatrixXd dM_submatrix(rows.size() * cols.size(), q_subvector_size); int index = 0; for (std::vector<int>::const_iterator col = cols.begin(); col != cols.end(); ++col) { for (std::vector<int>::const_iterator row = rows.begin(); row != rows.end(); ++row) { dM_submatrix.row(index) = dM.block(*row + *col * M_rows, q_start, 1, q_subvector_size); index++; } } return dM_submatrix; }
typename GetSubMatrixGradientArray<QSubvectorSize, Derived, NRows, NCols>::type getSubMatrixGradient(const Eigen::MatrixBase<Derived>& dM, const std::array<int, NRows>& rows, const std::array<int, NCols>& cols, typename Derived::Index M_rows, int q_start, typename Derived::Index q_subvector_size) { if (q_subvector_size == Eigen::Dynamic) { q_subvector_size = dM.cols() - q_start; } Eigen::Matrix<typename Derived::Scalar, NRows * NCols, Derived::ColsAtCompileTime> dM_submatrix(NRows * NCols, q_subvector_size); int index = 0; for (typename std::array<int, NCols>::const_iterator col = cols.begin(); col != cols.end(); ++col) { for (typename std::array<int, NRows>::const_iterator row = rows.begin(); row != rows.end(); ++row) { dM_submatrix.row(index++) = dM.template block<1, QSubvectorSize> ((*row) + (*col) * M_rows, q_start, 1, q_subvector_size); } } return dM_submatrix; }