vcglib/vcg/math/eigen_matrixbase_addons.h

303 lines
11 KiB
C
Raw Normal View History

/****************************************************************************
* VCGLib o o *
* Visual and Computer Graphics Library o o *
* _ O _ *
* Copyright(C) 2004-2016 \/)\/ *
* Visual Computing Lab /\/| *
* ISTI - Italian National Research Council | *
* \ *
* All rights reserved. *
* *
* This program is free software; you can redistribute it and/or modify *
* 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. *
* *
****************************************************************************/
2008-10-29 14:17:32 +01:00
#ifdef __GNUC__
#warning You are including deprecated math stuff
2008-10-29 14:17:32 +01:00
#endif
typedef Scalar ScalarType;
/*! \deprecated use cols() */
2008-10-28 11:16:43 +01:00
EIGEN_DEPRECATED inline unsigned int ColumnsNumber() const { return cols(); };
/*! \deprecated use rows() */
2008-10-28 11:16:43 +01:00
EIGEN_DEPRECATED inline unsigned int RowsNumber() const { return rows(); };
/*!
* \deprecated use *this(i,j) (or *this.coeff(i,j))
* Return the element stored in the <I>i</I>-th rows at the <I>j</I>-th column
* \param i the row index
* \param j the column index
* \return the element
*/
EIGEN_DEPRECATED inline Scalar ElementAt(unsigned int i, unsigned int j) const { return (*this)(i,j); };
EIGEN_DEPRECATED inline Scalar& ElementAt(unsigned int i, unsigned int j) { return (*this)(i,j); };
EIGEN_DEPRECATED inline Scalar V(int i) const { return (*this)[i]; };
EIGEN_DEPRECATED inline Scalar& V(int i) { return (*this)[i]; };
/*!
* \deprecated use *this.determinant() (or *this.lu().determinant() for large matrices)
* Calculate and return the matrix determinant (Laplace)
* \return the matrix determinant
*/
2008-10-28 11:16:43 +01:00
EIGEN_DEPRECATED Scalar Determinant() const { return determinant(); };
/*!
* Return the cofactor <I>A<SUB>i,j</SUB></I> of the <I>a<SUB>i,j</SUB></I> element
* \return ...
*/
EIGEN_DEPRECATED Scalar Cofactor(unsigned int i, unsigned int j) const
{
assert(rows() == cols());
assert(rows()>2);
return (((i+j)%2==0) ? 1. : -1.) * minor(i,j).determinant();
};
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this.col(j) */
EIGEN_DEPRECATED ColXpr GetColumn(const unsigned int j) { return col(j); };
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this.row(i) */
EIGEN_DEPRECATED RowXpr GetRow(const unsigned int i) { return row(i); };
2008-10-28 11:16:43 +01:00
/*! \deprecated use m1.col(i).swap(m1.col(j)); */
EIGEN_DEPRECATED void SwapColumns(const unsigned int i, const unsigned int j)
{
2008-10-28 11:16:43 +01:00
if (i==j) return;
col(i).swap(col(j));
};
2008-10-28 11:16:43 +01:00
/*! \deprecated use m1.col(i).swap(m1.col(j)) */
EIGEN_DEPRECATED void SwapRows(const unsigned int i, const unsigned int j)
{
2008-10-28 11:16:43 +01:00
if (i==j) return;
row(i).swap(row(j));
};
/*!
* \deprecated use *this.cwise() += k
* (Modifier) Add to each element of this matrix the scalar constant <I>k</I>.
* \param k the scalar constant
* \return the modified matrix
*/
EIGEN_DEPRECATED Derived& operator+=(const Scalar k)
{
cwise() += k;
return *this;
};
/*!
* \deprecated use *this.cwise() -= k
* (Modifier) Subtract from each element of this matrix the scalar constant <I>k</I>.
* \param k the scalar constant
* \return the modified matrix
*/
EIGEN_DEPRECATED Derived& operator-=(const Scalar k)
{
cwise() -= k;
return *this;
};
/*!
* \deprecated use *this.dot
* Matrix multiplication: calculates the cross product.
* \param reference to the matrix to multiply by
* \return the matrix product
*/
// template <int N,int M>
// EIGEN_DEPRECATED void DotProduct(Point<N,Scalar> &m,Point<M,Scalar> &result)
// {
// unsigned int i, j;
// for (i=0; i<M; i++)
// { result[i]=0;
// for (j=0; j<N; j++)
// result[i]+=(*this)[i][j]*m[j];
// }
// };
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this = a * b.transpose() (or *this = a * b.adjoint() for complexes) */
template <typename OtherDerived1, typename OtherDerived2>
EIGEN_DEPRECATED void OuterProduct(const MatrixBase<OtherDerived1>& a, const MatrixBase<OtherDerived2>& b)
2008-10-28 11:16:43 +01:00
{ *this = a * b.adjoint(); }
typedef CwiseUnaryOp<ei_scalar_add_op<Scalar>, Derived> ScalarAddReturnType;
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this.cwise() + k */
EIGEN_DEPRECATED const ScalarAddReturnType operator+(const Scalar k) { return cwise() + k; }
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this.cwise() - k */
EIGEN_DEPRECATED const ScalarAddReturnType operator-(const Scalar k) { return cwise() - k; }
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this.setZero() or *this = MatrixType::Zero(rows,cols), etc. */
EIGEN_DEPRECATED void SetZero() { setZero(); };
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this.setIdentity() or *this = MatrixType::Identity(rows,cols), etc. */
EIGEN_DEPRECATED void SetIdentity() { setIdentity(); };
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this.col(j) = expression */
EIGEN_DEPRECATED void SetColumn(unsigned int j, Scalar* v)
2008-10-28 11:16:43 +01:00
{ col(j) = Map<Matrix<Scalar,RowsAtCompileTime,1> >(v,cols(),1); };
/** \deprecated use *this.col(i) = other */
template<typename OtherDerived>
EIGEN_DEPRECATED void SetColumn(unsigned int j, const MatrixBase<OtherDerived>& other)
2008-10-28 11:16:43 +01:00
{ col(j) = other; };
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this.row(i) = expression */
EIGEN_DEPRECATED void SetRow(unsigned int i, Scalar* v)
2008-10-28 11:16:43 +01:00
{ row(i) = Map<Matrix<Scalar,1,ColsAtCompileTime> >(v,1,rows()); };
/** \deprecated use *this.row(i) = other */
template<typename OtherDerived>
EIGEN_DEPRECATED void SetRow(unsigned int j, const MatrixBase<OtherDerived>& other)
2008-10-28 11:16:43 +01:00
{ row(j) = other; };
2008-10-28 11:16:43 +01:00
/*! \deprecated use *this.diagonal() = expression */
EIGEN_DEPRECATED void SetDiagonal(Scalar *v)
{
assert(rows() == cols());
diagonal() = Map<Matrix<Scalar,RowsAtCompileTime,1> >(v,cols(),1);
}
/** \deprecated use trace() */
EIGEN_DEPRECATED Scalar Trace() const { return trace(); }
2008-10-28 11:16:43 +01:00
/*! \deprecated use ostream << *this or even ostream << *this.withFormat(...) */
EIGEN_DEPRECATED void Dump()
{
unsigned int i, j;
for (i=0; i<rows(); ++i)
{
printf("[\t");
for (j=0; j<cols(); j++)
printf("%f\t", coeff(i,j));
printf("]\n");
}
printf("\n");
}
/** \deprecated use norm() */
EIGEN_DEPRECATED inline Scalar Norm() const { return norm(); };
/** \deprecated use squaredNorm() */
EIGEN_DEPRECATED inline Scalar SquaredNorm() const { return squaredNorm(); };
/** \deprecated use normalize() or normalized() */
EIGEN_DEPRECATED inline Derived& Normalize() { normalize(); return derived(); };
/** \deprecated use normalized() */
2009-01-23 00:10:24 +01:00
EIGEN_DEPRECATED inline const PlainMatrixType Normalize() const { return normalized(); };
/** \deprecated use transposeInPlace() or transpose() */
EIGEN_DEPRECATED inline Derived& Transpose() { transposeInPlace(); return derived(); };
/** \deprecated use transpose() */
EIGEN_DEPRECATED inline const Eigen::Transpose<Derived> Transpose() const { return transpose(); };
/** \deprecated use .cross(p) */
2009-01-23 00:10:24 +01:00
EIGEN_DEPRECATED inline PlainMatrixType operator ^ (const Derived& p ) const { return this->cross(p); }
/// Homogeneous normalization (division by W)
inline Derived& HomoNormalize()
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
enum {
SubRows = (int(Flags)&RowMajorBit) ? 1 : (RowsAtCompileTime==Dynamic ? Dynamic : RowsAtCompileTime-1),
SubCols = (int(Flags)&RowMajorBit) ? (ColsAtCompileTime==Dynamic ? Dynamic : ColsAtCompileTime-1) : 1,
};
Scalar& last = coeffRef(size()-2);
if (last!=Scalar(0))
{
Block<Derived,SubRows,SubCols>(derived(),0,0,
(int(Flags)&RowMajorBit) ? size()-1 : 1,
(int(Flags)&RowMajorBit) ? 1 : (size()-1)) / last;
last = Scalar(1.0);
}
return *this;
}
2009-01-23 00:10:24 +01:00
inline const PlainMatrixType HomoNormalize() const
{
2009-01-23 00:10:24 +01:00
PlainMatrixType res = derived();
return res.HomoNormalize();
}
/// norm infinity: largest absolute value of compoenet
EIGEN_DEPRECATED inline Scalar NormInfinity() const { return derived().cwise().abs().maxCoeff(); }
/// norm 1: sum of absolute values of components
EIGEN_DEPRECATED inline Scalar NormOne() const { return derived().cwise().abs().sum(); }
/// the sum of the components
EIGEN_DEPRECATED inline Scalar Sum() const { return sum(); }
/// returns the biggest component
EIGEN_DEPRECATED inline Scalar Max() const { return maxCoeff(); }
/// returns the smallest component
EIGEN_DEPRECATED inline Scalar Min() const { return minCoeff(); }
/// returns the index of the biggest component
EIGEN_DEPRECATED inline int MaxI() const { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); int i; maxCoeff(&i,0); return i; }
/// returns the index of the smallest component
EIGEN_DEPRECATED inline int MinI() const { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); int i; minCoeff(&i,0); return i; }
/// Padding function: give a default 0 value to all the elements that are not in the [0..2] range.
/// Useful for managing in a consistent way object that could have point2 / point3 / point4
inline Scalar Ext( const int i ) const
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived);
if(i>=0 && i<SizeAtCompileTime)
return coeff(i);
else
return Scalar(0);
}
/// Per component scaling
template<typename OtherDerived>
EIGEN_DEPRECATED inline Derived& Scale(const MatrixBase<OtherDerived>& other)
{ this->cwise() *= other; return derived; }
template<typename OtherDerived>
EIGEN_DEPRECATED inline
CwiseBinaryOp<ei_scalar_product_op<Scalar>, Derived, OtherDerived>
Scale(const MatrixBase<OtherDerived>& other) const
{ return this->cwise() * other; }
template<typename OtherDerived>
EIGEN_DEPRECATED inline bool operator < (const MatrixBase<OtherDerived>& other) const {
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived);
return ei_lexi_comparison<Derived,OtherDerived,SizeAtCompileTime>::less(derived(),other.derived());
}
template<typename OtherDerived>
EIGEN_DEPRECATED inline bool operator > (const MatrixBase<OtherDerived>& other) const {
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived);
return ei_lexi_comparison<Derived,OtherDerived,SizeAtCompileTime>::geater(derived(),other.derived());
}
template<typename OtherDerived>
EIGEN_DEPRECATED inline bool operator <= (const MatrixBase<OtherDerived>& other) const {
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived);
return ei_lexi_comparison<Derived,OtherDerived,SizeAtCompileTime>::lessEqual(derived(),other.derived());
}
template<typename OtherDerived>
EIGEN_DEPRECATED inline bool operator >= (const MatrixBase<OtherDerived>& other) const {
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived);
return ei_lexi_comparison<Derived,OtherDerived,SizeAtCompileTime>::greaterEqual(derived(),other.derived());
}