dust3d/thirdparty/cgal/CGAL-5.1/include/CGAL/Eigen_matrix.h

92 lines
2.9 KiB
C++

// Copyright (c) 2012 INRIA Bordeaux Sud-Ouest (France), All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL: https://github.com/CGAL/cgal/blob/v5.1/Solver_interface/include/CGAL/Eigen_matrix.h $
// $Id: Eigen_matrix.h 9f2eafd 2020-03-26T19:17:02+01:00 Sébastien Loriot
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Gael Guennebaud
#ifndef CGAL_SOLVER_INTERFACE_EIGEN_MATRIX_H
#define CGAL_SOLVER_INTERFACE_EIGEN_MATRIX_H
#include <CGAL/basic.h> // include basic.h before testing #defines
#include <CGAL/Eigen_sparse_matrix.h> // for backward compatibility
#include <Eigen/Dense>
namespace CGAL {
/*!
\ingroup PkgSolverInterfaceRef
The class `Eigen_matrix` is a wrapper around `Eigen` matrix type
<a href="http://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html">`Eigen::Matrix`</a>.
\cgalModels `SvdTraits::Matrix`
\tparam T Number type.
\tparam D1 Number of rows, or Dynamic
\tparam D2 Number of columns, or Dynamic
\sa `CGAL::Eigen_vector<T>`
\sa `CGAL::Eigen_sparse_matrix<T>`
\sa `CGAL::Eigen_sparse_symmetric_matrix<T>`
*/
template <class FT, int D1 = ::Eigen::Dynamic, int D2 = ::Eigen::Dynamic>
struct Eigen_matrix
: public ::Eigen::Matrix<FT, D1, D2>
{
/// The internal matrix type from \ref thirdpartyEigen "Eigen".
typedef ::Eigen::Matrix<FT, D1, D2> EigenType;
/// Constructs a null matrix.
Eigen_matrix() { }
/// Constructs an uninitialized matrix with `nr` rows and `nc` columns.
/// This is useful for dynamic-size matrices.
/// For fixed-size matrices, it is redundant to pass these parameters.
Eigen_matrix(std::size_t nr, std::size_t nc) : EigenType(nr, nc) { }
/// Constructs a matrix from an Eigen matrix.
Eigen_matrix(const EigenType& b) : EigenType(b) { }
/// Returns the matrix number of rows.
std::size_t number_of_rows() const { return this->rows(); }
/// Returns the matrix number of columns.
std::size_t number_of_columns() const { return this->cols(); }
/// Returns the value of the matrix at position (i,j).
FT operator()( std::size_t i , std::size_t j ) const { return EigenType::operator()(i,j); }
/// Writes access to a matrix coefficient: `a_ij` <- `val`.
void set(std::size_t i, std::size_t j, FT value) { this->coeffRef(i,j) = value; }
/// Returns the internal matrix, with type `EigenType`.
const EigenType& eigen_object() const { return static_cast<const EigenType&>(*this); }
public:
/// \cond SKIP_IN_MANUAL
friend Eigen_matrix operator*(const FT c, const Eigen_matrix& M)
{
return Eigen_matrix(c * M.eigen_object());
}
friend Eigen_matrix operator*(const Eigen_matrix& M0, const Eigen_matrix& M1)
{
return Eigen_matrix(M0.eigen_object() * M1.eigen_object());
}
friend Eigen_matrix operator+(const Eigen_matrix& M0, const Eigen_matrix& M1)
{
return Eigen_matrix(M0.eigen_object() + M1.eigen_object());
}
/// \endcond
};
} //namespace CGAL
#endif // CGAL_SOLVER_INTERFACE_EIGEN_MATRIX_H