2004-10-15 15:44:09 +02:00
|
|
|
|
/****************************************************************************
|
|
|
|
|
* VCGLib o o *
|
|
|
|
|
* Visual and Computer Graphics Library o o *
|
|
|
|
|
* _ O _ *
|
|
|
|
|
* Copyright(C) 2004 \/)\/ *
|
|
|
|
|
* Visual Computing Lab /\/| *
|
|
|
|
|
* ISTI - Italian National Research Council | *
|
|
|
|
|
* \ *
|
|
|
|
|
* All rights reserved. *
|
|
|
|
|
* *
|
2008-10-27 15:48:14 +01:00
|
|
|
|
* This program is free software; you can redistribute it and/or modify *
|
2004-10-15 15:44:09 +02:00
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
|
|
|
* (at your option) any later version. *
|
|
|
|
|
* *
|
|
|
|
|
* This program is distributed in the hope that it will be useful, *
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
|
|
|
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
|
|
|
|
|
* for more details. *
|
|
|
|
|
* *
|
|
|
|
|
****************************************************************************/
|
2006-09-21 20:09:34 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
#ifndef VCG_USE_EIGEN
|
|
|
|
|
#include "deprecated_matrix.h"
|
|
|
|
|
#endif
|
2006-04-11 10:09:35 +02:00
|
|
|
|
|
2005-12-12 12:25:00 +01:00
|
|
|
|
|
|
|
|
|
#ifndef MATRIX_VCGLIB
|
|
|
|
|
#define MATRIX_VCGLIB
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
#include "eigen.h"
|
2006-04-11 10:09:35 +02:00
|
|
|
|
#include <vcg/space/point.h>
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2005-12-12 12:25:00 +01:00
|
|
|
|
namespace vcg{
|
2008-10-27 15:48:14 +01:00
|
|
|
|
namespace ndim{
|
|
|
|
|
template<class Scalar> class Matrix;
|
|
|
|
|
}
|
|
|
|
|
}
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
namespace Eigen{
|
|
|
|
|
template<typename Scalar>
|
|
|
|
|
struct ei_traits<vcg::ndim::Matrix<Scalar> > : ei_traits<Eigen::Matrix<Scalar,Dynamic,Dynamic> > {};
|
|
|
|
|
}
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
namespace vcg{
|
|
|
|
|
namespace ndim{
|
|
|
|
|
|
|
|
|
|
/** \addtogroup math */
|
|
|
|
|
/* @{ */
|
2005-12-12 12:25:00 +01:00
|
|
|
|
|
2004-10-15 15:44:09 +02:00
|
|
|
|
/*!
|
2008-10-27 15:48:14 +01:00
|
|
|
|
* This class represent a diagonal <I>m</I><EFBFBD><I>m</I> matrix.
|
2004-10-15 15:44:09 +02:00
|
|
|
|
*/
|
2008-10-27 15:48:14 +01:00
|
|
|
|
class MatrixDiagBase{public:
|
|
|
|
|
virtual const int & Dimension()const =0;
|
|
|
|
|
virtual const float operator[](const int & i) const = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template<int N, class S>
|
|
|
|
|
class MatrixDiag: public Point<N,S>, public MatrixDiagBase{
|
|
|
|
|
public:
|
|
|
|
|
const int & Dimension() const {return N;}
|
|
|
|
|
MatrixDiag(const Point<N,S>&p):Point<N,S>(p){}
|
|
|
|
|
};
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* This class represent a generic <I>m</I><EFBFBD><I>n</I> matrix. The class is templated over the scalar type field.
|
|
|
|
|
* @param Scalar (Templete Parameter) Specifies the ScalarType field.
|
|
|
|
|
*/
|
|
|
|
|
template<class _Scalar>
|
|
|
|
|
class Matrix : public Eigen::Matrix<_Scalar,Eigen::Dynamic,Eigen::Dynamic> // FIXME col or row major ?
|
|
|
|
|
{
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
typedef Eigen::Matrix<_Scalar,Eigen::Dynamic,Eigen::Dynamic> _Base;
|
|
|
|
|
|
|
|
|
|
public:
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
_EIGEN_GENERIC_PUBLIC_INTERFACE(Matrix,_Base);
|
|
|
|
|
typedef _Scalar ScalarType;
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
VCG_EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Matrix)
|
2006-09-21 20:09:34 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* Default constructor
|
|
|
|
|
* All the elements are initialized to zero.
|
|
|
|
|
* \param m the number of matrix rows
|
|
|
|
|
* \param n the number of matrix columns
|
|
|
|
|
*/
|
|
|
|
|
Matrix(unsigned int m, unsigned int n)
|
|
|
|
|
: Base(m,n)
|
|
|
|
|
{
|
|
|
|
|
memset(Base::data(), 0, m*n*sizeof(Scalar));
|
|
|
|
|
}
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* Constructor
|
|
|
|
|
* The matrix elements are initialized with the values of the elements in \i values.
|
|
|
|
|
* \param m the number of matrix rows
|
|
|
|
|
* \param n the number of matrix columns
|
|
|
|
|
* \param values the values of the matrix elements
|
|
|
|
|
*/
|
|
|
|
|
Matrix(unsigned int m, unsigned int n, Scalar *values)
|
|
|
|
|
: Base(m.n)
|
|
|
|
|
{
|
|
|
|
|
*this = Eigen::Map<Eigen::Matrix<Scalar,Dynamic,Dynamic,RowMajor> >(values, m , n);
|
|
|
|
|
}
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* Empty constructor
|
|
|
|
|
* Just create the object
|
|
|
|
|
*/
|
|
|
|
|
Matrix() : Base() {}
|
2004-10-18 14:16:57 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* Copy constructor
|
|
|
|
|
* The matrix elements are initialized with the value of the corresponding element in \i m
|
|
|
|
|
* \param m the matrix to be copied
|
|
|
|
|
*/
|
|
|
|
|
Matrix(const Matrix<Scalar> &m) : Base(m) {}
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
template<typename OtherDerived>
|
|
|
|
|
Matrix(const Eigen::MatrixBase<OtherDerived> &m) : Base(m) {}
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* Default destructor
|
|
|
|
|
*/
|
|
|
|
|
~Matrix() {}
|
2005-02-16 12:11:12 +01:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* \deprecated use *this.row(i)
|
|
|
|
|
* Subscript operator:
|
|
|
|
|
* \param i the index of the row
|
|
|
|
|
* \return a reference to the <I>i</I>-th matrix row
|
|
|
|
|
*/
|
|
|
|
|
inline typename Base::RowXpr operator[](const unsigned int i)
|
|
|
|
|
{ return Base::row(i); }
|
2005-02-16 12:11:12 +01:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* \deprecated use *this.row(i)
|
|
|
|
|
* Const subscript operator
|
|
|
|
|
* \param i the index of the row
|
|
|
|
|
* \return a reference to the <I>i</I>-th matrix row
|
|
|
|
|
*/
|
|
|
|
|
inline const typename Base::RowXpr operator[](const unsigned int i) const
|
|
|
|
|
{ return Base::row(i); }
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* Matrix multiplication: calculates the cross product.
|
|
|
|
|
* \param reference to the matrix to multiply by
|
|
|
|
|
* \return the matrix product
|
|
|
|
|
*/
|
|
|
|
|
/*template <int N,int M>
|
|
|
|
|
void DotProduct(Point<N,Scalar> &m,Point<M,Scalar> &result)
|
|
|
|
|
{
|
|
|
|
|
unsigned int i, j, p, r;
|
|
|
|
|
for (i=0, p=0, r=0; i<M; i++)
|
|
|
|
|
{ result[i]=0;
|
|
|
|
|
for (j=0; j<N; j++)
|
|
|
|
|
result[i]+=(*this)[i][j]*m[j];
|
|
|
|
|
}
|
|
|
|
|
};*/
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*!
|
|
|
|
|
* \deprecated use *this.resize()
|
|
|
|
|
* Resize the current matrix.
|
|
|
|
|
* \param m the number of matrix rows.
|
|
|
|
|
* \param n the number of matrix columns.
|
|
|
|
|
*/
|
|
|
|
|
void Resize(const unsigned int m, const unsigned int n)
|
|
|
|
|
{
|
|
|
|
|
assert(m>=2);
|
|
|
|
|
assert(n>=2);
|
|
|
|
|
Base::resize(m,n);
|
|
|
|
|
memset(Base::data(), 0, m*n*sizeof(Scalar));
|
|
|
|
|
};
|
2004-10-15 15:44:09 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
// EIGEN_DEPRECATED void Transpose()
|
|
|
|
|
// {
|
|
|
|
|
// assert(0 && "dangerous use of deprecated Transpose function, please use: m = m.transpose();");
|
|
|
|
|
// }
|
|
|
|
|
};
|
2006-04-29 12:26:04 +02:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
typedef vcg::ndim::Matrix<double> MatrixMNd;
|
|
|
|
|
typedef vcg::ndim::Matrix<float> MatrixMNf;
|
2005-12-12 12:25:00 +01:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
/*! @} */
|
2005-12-12 12:25:00 +01:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
template <class MatrixType>
|
|
|
|
|
void Invert(MatrixType & m)
|
|
|
|
|
{
|
|
|
|
|
m = m.inverse();
|
|
|
|
|
}
|
2005-12-12 12:25:00 +01:00
|
|
|
|
|
2008-10-27 15:48:14 +01:00
|
|
|
|
}
|
|
|
|
|
} // end of namespace
|
2005-12-12 12:25:00 +01:00
|
|
|
|
|
2006-04-11 10:09:35 +02:00
|
|
|
|
#endif
|