aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Eigen/src/Array/Array.h3
-rw-r--r--Eigen/src/Array/ArrayWrapper.h2
-rw-r--r--Eigen/src/Array/Replicate.h27
-rw-r--r--Eigen/src/Array/VectorwiseOp.h4
-rw-r--r--Eigen/src/Core/CwiseBinaryOp.h16
-rw-r--r--Eigen/src/Core/DenseBase.h8
-rw-r--r--Eigen/src/Core/MatrixBase.h10
-rw-r--r--Eigen/src/Core/util/ForwardDeclarations.h26
-rw-r--r--Eigen/src/Sparse/SparseMatrixBase.h2
-rw-r--r--Eigen/src/Sparse/SparseProduct.h4
-rw-r--r--Eigen/src/plugins/CommonCwiseUnaryOps.h22
-rw-r--r--unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h11
-rw-r--r--unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h61
-rw-r--r--unsupported/Eigen/src/MatrixFunctions/StemFunction.h7
-rw-r--r--unsupported/doc/examples/MatrixExponential.cpp4
-rw-r--r--unsupported/doc/examples/MatrixFunction.cpp2
-rw-r--r--unsupported/doc/examples/MatrixSine.cpp4
-rw-r--r--unsupported/doc/examples/MatrixSinh.cpp4
-rw-r--r--unsupported/test/matrix_exponential.cpp16
-rw-r--r--unsupported/test/matrix_function.cpp19
20 files changed, 150 insertions, 102 deletions
diff --git a/Eigen/src/Array/Array.h b/Eigen/src/Array/Array.h
index 91a091152..8a53b8c3e 100644
--- a/Eigen/src/Array/Array.h
+++ b/Eigen/src/Array/Array.h
@@ -44,6 +44,9 @@ class Array
typedef typename Base::PlainObject PlainObject;
protected:
+ template <typename Derived, typename OtherDerived, bool IsVector>
+ friend struct ei_conservative_resize_like_impl;
+
using Base::m_storage;
public:
enum { NeedsToAlign = (!(Options&DontAlign))
diff --git a/Eigen/src/Array/ArrayWrapper.h b/Eigen/src/Array/ArrayWrapper.h
index 0075dd537..4ac240899 100644
--- a/Eigen/src/Array/ArrayWrapper.h
+++ b/Eigen/src/Array/ArrayWrapper.h
@@ -188,7 +188,7 @@ class MatrixWrapper : public MatrixBase<MatrixWrapper<ExpressionType> >
}
protected:
- const NestedExpressionType& m_expression;
+ const NestedExpressionType m_expression;
};
#endif // EIGEN_ARRAYWRAPPER_H
diff --git a/Eigen/src/Array/Replicate.h b/Eigen/src/Array/Replicate.h
index cd23e0d6f..46a06a61c 100644
--- a/Eigen/src/Array/Replicate.h
+++ b/Eigen/src/Array/Replicate.h
@@ -90,8 +90,29 @@ template<typename MatrixType,int RowFactor,int ColFactor> class Replicate
inline Scalar coeff(int row, int col) const
{
- return m_matrix.coeff(row%m_matrix.rows(), col%m_matrix.cols());
+ // try to avoid using modulo; this is a pure optimization strategy
+ const int actual_row = ei_traits<MatrixType>::RowsAtCompileTime==1 ? 0
+ : RowFactor==1 ? row
+ : row%m_matrix.rows();
+ const int actual_col = ei_traits<MatrixType>::ColsAtCompileTime==1 ? 0
+ : ColFactor==1 ? col
+ : col%m_matrix.cols();
+
+ return m_matrix.coeff(actual_row, actual_col);
}
+ template<int LoadMode>
+ inline PacketScalar packet(int row, int col) const
+ {
+ const int actual_row = ei_traits<MatrixType>::RowsAtCompileTime==1 ? 0
+ : RowFactor==1 ? row
+ : row%m_matrix.rows();
+ const int actual_col = ei_traits<MatrixType>::ColsAtCompileTime==1 ? 0
+ : ColFactor==1 ? col
+ : col%m_matrix.cols();
+
+ return m_matrix.template packet<LoadMode>(actual_row, actual_col);
+ }
+
protected:
const typename MatrixType::Nested m_matrix;
@@ -139,10 +160,10 @@ DenseBase<Derived>::replicate(int rowFactor,int colFactor) const
* \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate
*/
template<typename ExpressionType, int Direction>
-const Replicate<ExpressionType,(Direction==Vertical?Dynamic:1),(Direction==Horizontal?Dynamic:1)>
+const typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
VectorwiseOp<ExpressionType,Direction>::replicate(int factor) const
{
- return Replicate<ExpressionType,Direction==Vertical?Dynamic:1,Direction==Horizontal?Dynamic:1>
+ return typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
(_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);
}
diff --git a/Eigen/src/Array/VectorwiseOp.h b/Eigen/src/Array/VectorwiseOp.h
index 06d999b14..50cfa7a5e 100644
--- a/Eigen/src/Array/VectorwiseOp.h
+++ b/Eigen/src/Array/VectorwiseOp.h
@@ -384,8 +384,8 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
const Reverse<ExpressionType, Direction> reverse() const
{ return Reverse<ExpressionType, Direction>( _expression() ); }
- const Replicate<ExpressionType,(Direction==Vertical?Dynamic:1),(Direction==Horizontal?Dynamic:1)>
- replicate(int factor) const;
+ typedef Replicate<ExpressionType,Direction==Vertical?Dynamic:1,Direction==Horizontal?Dynamic:1> ReplicateReturnType;
+ const ReplicateReturnType replicate(int factor) const;
/** \nonstableyet
* \return an expression of the replication of each column (or row) of \c *this
diff --git a/Eigen/src/Core/CwiseBinaryOp.h b/Eigen/src/Core/CwiseBinaryOp.h
index 9ed005dce..df13d3aad 100644
--- a/Eigen/src/Core/CwiseBinaryOp.h
+++ b/Eigen/src/Core/CwiseBinaryOp.h
@@ -121,8 +121,20 @@ class CwiseBinaryOp : ei_no_assignment_operator,
ei_assert(lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols());
}
- EIGEN_STRONG_INLINE int rows() const { return m_lhs.rows(); }
- EIGEN_STRONG_INLINE int cols() const { return m_lhs.cols(); }
+ EIGEN_STRONG_INLINE int rows() const {
+ // return the fixed size type if available to enable compile time optimizations
+ if (ei_traits<typename ei_cleantype<LhsNested>::type>::RowsAtCompileTime==Dynamic)
+ return m_rhs.rows();
+ else
+ return m_lhs.rows();
+ }
+ EIGEN_STRONG_INLINE int cols() const {
+ // return the fixed size type if available to enable compile time optimizations
+ if (ei_traits<typename ei_cleantype<LhsNested>::type>::ColsAtCompileTime==Dynamic)
+ return m_rhs.cols();
+ else
+ return m_lhs.cols();
+ }
/** \returns the left hand side nested expression */
const _LhsNested& lhs() const { return m_lhs; }
diff --git a/Eigen/src/Core/DenseBase.h b/Eigen/src/Core/DenseBase.h
index ecce3ad05..74945fc79 100644
--- a/Eigen/src/Core/DenseBase.h
+++ b/Eigen/src/Core/DenseBase.h
@@ -491,8 +491,12 @@ template<typename Derived> class DenseBase
* Notice that in the case of a plain matrix or vector (not an expression) this function just returns
* a const reference, in order to avoid a useless copy.
*/
- EIGEN_STRONG_INLINE const typename ei_eval<Derived>::type eval() const
- { return typename ei_eval<Derived>::type(derived()); }
+ inline const typename ei_eval<Derived>::type eval() const
+ {
+ // MSVC cannot honor strong inlining when the return type
+ // is a dynamic matrix
+ return typename ei_eval<Derived>::type(derived());
+ }
template<typename OtherDerived>
void swap(DenseBase<OtherDerived> EIGEN_REF_TO_TEMPORARY other);
diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h
index ac79de66d..fd9577ca4 100644
--- a/Eigen/src/Core/MatrixBase.h
+++ b/Eigen/src/Core/MatrixBase.h
@@ -372,6 +372,16 @@ template<typename Derived> class MatrixBase
template<typename OtherScalar>
void applyOnTheRight(int p, int q, const PlanarRotation<OtherScalar>& j);
+///////// MatrixFunctions module /////////
+
+ typedef typename ei_stem_function<Scalar>::type StemFunction;
+ const MatrixExponentialReturnValue<Derived> exp() const;
+ const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const;
+ const MatrixFunctionReturnValue<Derived> cosh() const;
+ const MatrixFunctionReturnValue<Derived> sinh() const;
+ const MatrixFunctionReturnValue<Derived> cos() const;
+ const MatrixFunctionReturnValue<Derived> sin() const;
+
#ifdef EIGEN2_SUPPORT
template<typename ProductDerived, typename Lhs, typename Rhs>
Derived& operator+=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,
diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h
index d0ba7328f..eb7e93b91 100644
--- a/Eigen/src/Core/util/ForwardDeclarations.h
+++ b/Eigen/src/Core/util/ForwardDeclarations.h
@@ -46,10 +46,19 @@ template<typename ExpressionType> class NestByValue;
template<typename ExpressionType> class ForceAlignedAccess;
template<typename ExpressionType> class SwapWrapper;
template<typename MatrixType> class Minor;
-// MSVC will not compile when the expression ei_traits<MatrixType>::Flags&DirectAccessBit
-// is put into brackets like (ei_traits<MatrixType>::Flags&DirectAccessBit)!
+
+// MSVC has a big bug: when the expression ei_traits<MatrixType>::Flags&DirectAccessBit ? HasDirectAccess : NoDirectAccess
+// is used as default template parameter value here, it gets mis-evaluated as just ei_traits<MatrixType>::Flags
+// Moreover, adding brackets tends to give compilation errors with MSVC.
+// Solution: defer that to a helper struct.
+template<typename MatrixType>
+struct ei_block_direct_access_status
+{
+ enum { ret = ei_traits<MatrixType>::Flags&DirectAccessBit ? HasDirectAccess : NoDirectAccess };
+};
template<typename MatrixType, int BlockRows=Dynamic, int BlockCols=Dynamic,
- int _DirectAccessStatus = ei_traits<MatrixType>::Flags&DirectAccessBit ? HasDirectAccess : NoDirectAccess> class Block;
+ int _DirectAccessStatus = ei_block_direct_access_status<MatrixType>::ret> class Block;
+
template<typename MatrixType, int Size=Dynamic> class VectorBlock;
template<typename MatrixType> class Transpose;
template<typename MatrixType> class Conjugate;
@@ -163,6 +172,17 @@ template<typename Scalar,int Dim> class Translation;
template<typename Scalar> class UniformScaling;
template<typename MatrixType,int Direction> class Homogeneous;
+// MatrixFunctions module
+template<typename Derived> struct MatrixExponentialReturnValue;
+template<typename Derived> struct MatrixFunctionReturnValue;
+template <typename Scalar>
+struct ei_stem_function
+{
+ typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
+ typedef ComplexScalar type(ComplexScalar, int);
+};
+
+
#ifdef EIGEN2_SUPPORT
template<typename ExpressionType> class Cwise;
#endif
diff --git a/Eigen/src/Sparse/SparseMatrixBase.h b/Eigen/src/Sparse/SparseMatrixBase.h
index cf1a5d7bf..d269ce604 100644
--- a/Eigen/src/Sparse/SparseMatrixBase.h
+++ b/Eigen/src/Sparse/SparseMatrixBase.h
@@ -557,7 +557,7 @@ template<typename Derived> class SparseMatrixBase : public EigenBase<Derived>
* Notice that in the case of a plain matrix or vector (not an expression) this function just returns
* a const reference, in order to avoid a useless copy.
*/
- EIGEN_STRONG_INLINE const typename ei_eval<Derived>::type eval() const
+ inline const typename ei_eval<Derived>::type eval() const
{ return typename ei_eval<Derived>::type(derived()); }
// template<typename OtherDerived>
diff --git a/Eigen/src/Sparse/SparseProduct.h b/Eigen/src/Sparse/SparseProduct.h
index a56bc7601..efc676a69 100644
--- a/Eigen/src/Sparse/SparseProduct.h
+++ b/Eigen/src/Sparse/SparseProduct.h
@@ -562,7 +562,7 @@ class DenseTimeSparseProduct
// sparse * sparse
template<typename Derived>
template<typename OtherDerived>
-EIGEN_STRONG_INLINE const typename SparseProductReturnType<Derived,OtherDerived>::Type
+inline const typename SparseProductReturnType<Derived,OtherDerived>::Type
SparseMatrixBase<Derived>::operator*(const SparseMatrixBase<OtherDerived> &other) const
{
return typename SparseProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived());
@@ -571,7 +571,7 @@ SparseMatrixBase<Derived>::operator*(const SparseMatrixBase<OtherDerived> &other
// sparse * dense
template<typename Derived>
template<typename OtherDerived>
-EIGEN_STRONG_INLINE const SparseTimeDenseProduct<Derived,OtherDerived>
+inline const SparseTimeDenseProduct<Derived,OtherDerived>
SparseMatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const
{
return SparseTimeDenseProduct<Derived,OtherDerived>(derived(), other.derived());
diff --git a/Eigen/src/plugins/CommonCwiseUnaryOps.h b/Eigen/src/plugins/CommonCwiseUnaryOps.h
index 6360ddf7c..ec76ca38f 100644
--- a/Eigen/src/plugins/CommonCwiseUnaryOps.h
+++ b/Eigen/src/plugins/CommonCwiseUnaryOps.h
@@ -55,12 +55,12 @@ typedef CwiseUnaryView<ei_scalar_imag_op<Scalar>, Derived> NonConstImagReturnTyp
/** \returns an expression of the opposite of \c *this
*/
-EIGEN_STRONG_INLINE const CwiseUnaryOp<ei_scalar_opposite_op<typename ei_traits<Derived>::Scalar>,Derived>
+inline const CwiseUnaryOp<ei_scalar_opposite_op<typename ei_traits<Derived>::Scalar>,Derived>
operator-() const { return derived(); }
/** \returns an expression of \c *this scaled by the scalar factor \a scalar */
-EIGEN_STRONG_INLINE const ScalarMultipleReturnType
+inline const ScalarMultipleReturnType
operator*(const Scalar& scalar) const
{
return CwiseUnaryOp<ei_scalar_multiple_op<Scalar>, Derived>
@@ -72,7 +72,7 @@ const ScalarMultipleReturnType operator*(const RealScalar& scalar) const;
#endif
/** \returns an expression of \c *this divided by the scalar value \a scalar */
-EIGEN_STRONG_INLINE const CwiseUnaryOp<ei_scalar_quotient1_op<typename ei_traits<Derived>::Scalar>, Derived>
+inline const CwiseUnaryOp<ei_scalar_quotient1_op<typename ei_traits<Derived>::Scalar>, Derived>
operator/(const Scalar& scalar) const
{
return CwiseUnaryOp<ei_scalar_quotient1_op<Scalar>, Derived>
@@ -80,7 +80,7 @@ operator/(const Scalar& scalar) const
}
/** Overloaded for efficient real matrix times complex scalar value */
-EIGEN_STRONG_INLINE const CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >, Derived>
+inline const CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >, Derived>
operator*(const std::complex<Scalar>& scalar) const
{
return CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >, Derived>
@@ -112,7 +112,7 @@ cast() const
/** \returns an expression of the complex conjugate of \c *this.
*
* \sa adjoint() */
-EIGEN_STRONG_INLINE ConjugateReturnType
+inline ConjugateReturnType
conjugate() const
{
return ConjugateReturnType(derived());
@@ -121,13 +121,13 @@ conjugate() const
/** \returns a read-only expression of the real part of \c *this.
*
* \sa imag() */
-EIGEN_STRONG_INLINE RealReturnType
+inline RealReturnType
real() const { return derived(); }
/** \returns an read-only expression of the imaginary part of \c *this.
*
* \sa real() */
-EIGEN_STRONG_INLINE const ImagReturnType
+inline const ImagReturnType
imag() const { return derived(); }
/** \returns an expression of a custom coefficient-wise unary operator \a func of *this
@@ -142,7 +142,7 @@ imag() const { return derived(); }
* \sa class CwiseUnaryOp, class CwiseBinarOp, MatrixBase::operator-, Cwise::abs
*/
template<typename CustomUnaryOp>
-EIGEN_STRONG_INLINE const CwiseUnaryOp<CustomUnaryOp, Derived>
+inline const CwiseUnaryOp<CustomUnaryOp, Derived>
unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const
{
return CwiseUnaryOp<CustomUnaryOp, Derived>(derived(), func);
@@ -160,7 +160,7 @@ unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const
* \sa class CwiseUnaryOp, class CwiseBinarOp, MatrixBase::operator-, Cwise::abs
*/
template<typename CustomViewOp>
-EIGEN_STRONG_INLINE const CwiseUnaryView<CustomViewOp, Derived>
+inline const CwiseUnaryView<CustomViewOp, Derived>
unaryViewExpr(const CustomViewOp& func = CustomViewOp()) const
{
return CwiseUnaryView<CustomViewOp, Derived>(derived(), func);
@@ -169,11 +169,11 @@ unaryViewExpr(const CustomViewOp& func = CustomViewOp()) const
/** \returns a non const expression of the real part of \c *this.
*
* \sa imag() */
-EIGEN_STRONG_INLINE NonConstRealReturnType
+inline NonConstRealReturnType
real() { return derived(); }
/** \returns a non const expression of the imaginary part of \c *this.
*
* \sa real() */
-EIGEN_STRONG_INLINE NonConstImagReturnType
+inline NonConstImagReturnType
imag() { return derived(); }
diff --git a/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h b/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h
index 2c761e648..3ef91a7b2 100644
--- a/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h
+++ b/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h
@@ -290,8 +290,8 @@ void MatrixExponential<MatrixType>::computeUV(double)
* This class holds the argument to the matrix exponential until it
* is assigned or evaluated for some other reason (so the argument
* should not be changed in the meantime). It is the return type of
- * ei_matrix_exponential() and most of the time this is the only way
- * it is used.
+ * MatrixBase::exp() and most of the time this is the only way it is
+ * used.
*/
template<typename Derived> struct MatrixExponentialReturnValue
: public ReturnByValue<MatrixExponentialReturnValue<Derived> >
@@ -381,11 +381,10 @@ struct ei_traits<MatrixExponentialReturnValue<Derived> >
* \c complex<float> or \c complex<double> .
*/
template <typename Derived>
-MatrixExponentialReturnValue<Derived>
-ei_matrix_exponential(const MatrixBase<Derived> &M)
+const MatrixExponentialReturnValue<Derived> MatrixBase<Derived>::exp() const
{
- ei_assert(M.rows() == M.cols());
- return MatrixExponentialReturnValue<Derived>(M.derived());
+ ei_assert(rows() == cols());
+ return MatrixExponentialReturnValue<Derived>(derived());
}
#endif // EIGEN_MATRIX_EXPONENTIAL
diff --git a/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h b/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h
index e8069154c..72e42aa7c 100644
--- a/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h
+++ b/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h
@@ -59,7 +59,7 @@ class MatrixFunction
* \param[out] result the function \p f applied to \p A, as
* specified in the constructor.
*
- * See ei_matrix_function() for details on how this computation
+ * See MatrixBase::matrixFunction() for details on how this computation
* is implemented.
*/
template <typename ResultType>
@@ -486,8 +486,8 @@ typename MatrixFunction<MatrixType,1>::DynMatrixType MatrixFunction<MatrixType,1
* This class holds the argument to the matrix function until it is
* assigned or evaluated for some other reason (so the argument
* should not be changed in the meantime). It is the return type of
- * ei_matrix_function() and related functions and most of the time
- * this is the only way it is used.
+ * matrixBase::matrixFunction() and related functions and most of the
+ * time this is the only way it is used.
*/
template<typename Derived> class MatrixFunctionReturnValue
: public ReturnByValue<MatrixFunctionReturnValue<Derived> >
@@ -533,6 +533,9 @@ struct ei_traits<MatrixFunctionReturnValue<Derived> >
};
+/********** MatrixBase methods **********/
+
+
/** \ingroup MatrixFunctions_Module
*
* \brief Compute a matrix function.
@@ -571,7 +574,7 @@ struct ei_traits<MatrixFunctionReturnValue<Derived> >
* \end{array} \right]. \f]
* This corresponds to a rotation of \f$ \frac14\pi \f$ radians around
* the z-axis. This is the same example as used in the documentation
- * of ei_matrix_exponential().
+ * of MatrixBase::exp().
*
* \include MatrixFunction.cpp
* Output: \verbinclude MatrixFunction.out
@@ -580,16 +583,14 @@ struct ei_traits<MatrixFunctionReturnValue<Derived> >
* \c x, even though the matrix \c A is over the reals. Instead of
* \c expfn, we could also have used StdStemFunctions::exp:
* \code
- * ei_matrix_function(A, StdStemFunctions<std::complex<double> >::exp, &B);
+ * A.matrixFunction(StdStemFunctions<std::complex<double> >::exp, &B);
* \endcode
*/
template <typename Derived>
-MatrixFunctionReturnValue<Derived>
-ei_matrix_function(const MatrixBase<Derived> &M,
- typename ei_stem_function<typename ei_traits<Derived>::Scalar>::type f)
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::matrixFunction(typename ei_stem_function<typename ei_traits<Derived>::Scalar>::type f) const
{
- ei_assert(M.rows() == M.cols());
- return MatrixFunctionReturnValue<Derived>(M.derived(), f);
+ ei_assert(rows() == cols());
+ return MatrixFunctionReturnValue<Derived>(derived(), f);
}
/** \ingroup MatrixFunctions_Module
@@ -599,19 +600,17 @@ ei_matrix_function(const MatrixBase<Derived> &M,
* \param[in] M a square matrix.
* \returns expression representing \f$ \sin(M) \f$.
*
- * This function calls ei_matrix_function() with StdStemFunctions::sin().
+ * This function calls matrixFunction() with StdStemFunctions::sin().
*
* \include MatrixSine.cpp
* Output: \verbinclude MatrixSine.out
*/
template <typename Derived>
-MatrixFunctionReturnValue<Derived>
-ei_matrix_sin(const MatrixBase<Derived>& M)
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sin() const
{
- ei_assert(M.rows() == M.cols());
- typedef typename ei_traits<Derived>::Scalar Scalar;
+ ei_assert(rows() == cols());
typedef typename ei_stem_function<Scalar>::ComplexScalar ComplexScalar;
- return MatrixFunctionReturnValue<Derived>(M.derived(), StdStemFunctions<ComplexScalar>::sin);
+ return MatrixFunctionReturnValue<Derived>(derived(), StdStemFunctions<ComplexScalar>::sin);
}
/** \ingroup MatrixFunctions_Module
@@ -621,18 +620,16 @@ ei_matrix_sin(const MatrixBase<Derived>& M)
* \param[in] M a square matrix.
* \returns expression representing \f$ \cos(M) \f$.
*
- * This function calls ei_matrix_function() with StdStemFunctions::cos().
+ * This function calls matrixFunction() with StdStemFunctions::cos().
*
* \sa ei_matrix_sin() for an example.
*/
template <typename Derived>
-MatrixFunctionReturnValue<Derived>
-ei_matrix_cos(const MatrixBase<Derived>& M)
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cos() const
{
- ei_assert(M.rows() == M.cols());
- typedef typename ei_traits<Derived>::Scalar Scalar;
+ ei_assert(rows() == cols());
typedef typename ei_stem_function<Scalar>::ComplexScalar ComplexScalar;
- return MatrixFunctionReturnValue<Derived>(M.derived(), StdStemFunctions<ComplexScalar>::cos);
+ return MatrixFunctionReturnValue<Derived>(derived(), StdStemFunctions<ComplexScalar>::cos);
}
/** \ingroup MatrixFunctions_Module
@@ -642,19 +639,17 @@ ei_matrix_cos(const MatrixBase<Derived>& M)
* \param[in] M a square matrix.
* \returns expression representing \f$ \sinh(M) \f$
*
- * This function calls ei_matrix_function() with StdStemFunctions::sinh().
+ * This function calls matrixFunction() with StdStemFunctions::sinh().
*
* \include MatrixSinh.cpp
* Output: \verbinclude MatrixSinh.out
*/
template <typename Derived>
-MatrixFunctionReturnValue<Derived>
-ei_matrix_sinh(const MatrixBase<Derived>& M)
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sinh() const
{
- ei_assert(M.rows() == M.cols());
- typedef typename ei_traits<Derived>::Scalar Scalar;
+ ei_assert(rows() == cols());
typedef typename ei_stem_function<Scalar>::ComplexScalar ComplexScalar;
- return MatrixFunctionReturnValue<Derived>(M.derived(), StdStemFunctions<ComplexScalar>::sinh);
+ return MatrixFunctionReturnValue<Derived>(derived(), StdStemFunctions<ComplexScalar>::sinh);
}
/** \ingroup MatrixFunctions_Module
@@ -664,18 +659,16 @@ ei_matrix_sinh(const MatrixBase<Derived>& M)
* \param[in] M a square matrix.
* \returns expression representing \f$ \cosh(M) \f$
*
- * This function calls ei_matrix_function() with StdStemFunctions::cosh().
+ * This function calls matrixFunction() with StdStemFunctions::cosh().
*
* \sa ei_matrix_sinh() for an example.
*/
template <typename Derived>
-MatrixFunctionReturnValue<Derived>
-ei_matrix_cosh(const MatrixBase<Derived>& M)
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cosh() const
{
- ei_assert(M.rows() == M.cols());
- typedef typename ei_traits<Derived>::Scalar Scalar;
+ ei_assert(rows() == cols());
typedef typename ei_stem_function<Scalar>::ComplexScalar ComplexScalar;
- return MatrixFunctionReturnValue<Derived>(M.derived(), StdStemFunctions<ComplexScalar>::cosh);
+ return MatrixFunctionReturnValue<Derived>(derived(), StdStemFunctions<ComplexScalar>::cosh);
}
#endif // EIGEN_MATRIX_FUNCTION
diff --git a/unsupported/Eigen/src/MatrixFunctions/StemFunction.h b/unsupported/Eigen/src/MatrixFunctions/StemFunction.h
index 90965c7dd..260690b63 100644
--- a/unsupported/Eigen/src/MatrixFunctions/StemFunction.h
+++ b/unsupported/Eigen/src/MatrixFunctions/StemFunction.h
@@ -25,13 +25,6 @@
#ifndef EIGEN_STEM_FUNCTION
#define EIGEN_STEM_FUNCTION
-template <typename Scalar>
-struct ei_stem_function
-{
- typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
- typedef ComplexScalar type(ComplexScalar, int);
-};
-
/** \ingroup MatrixFunctions_Module
* \brief Stem functions corresponding to standard mathematical functions.
*/
diff --git a/unsupported/doc/examples/MatrixExponential.cpp b/unsupported/doc/examples/MatrixExponential.cpp
index 60ef315d7..ebd3b9675 100644
--- a/unsupported/doc/examples/MatrixExponential.cpp
+++ b/unsupported/doc/examples/MatrixExponential.cpp
@@ -12,7 +12,5 @@ int main()
pi/4, 0, 0,
0, 0, 0;
std::cout << "The matrix A is:\n" << A << "\n\n";
-
- MatrixXd B = ei_matrix_exponential(A);
- std::cout << "The matrix exponential of A is:\n" << B << "\n\n";
+ std::cout << "The matrix exponential of A is:\n" << A.exp() << "\n\n";
}
diff --git a/unsupported/doc/examples/MatrixFunction.cpp b/unsupported/doc/examples/MatrixFunction.cpp
index ccef85cef..a4172e4ae 100644
--- a/unsupported/doc/examples/MatrixFunction.cpp
+++ b/unsupported/doc/examples/MatrixFunction.cpp
@@ -19,5 +19,5 @@ int main()
std::cout << "The matrix A is:\n" << A << "\n\n";
std::cout << "The matrix exponential of A is:\n"
- << ei_matrix_function(A, expfn) << "\n\n";
+ << A.matrixFunction(expfn) << "\n\n";
}
diff --git a/unsupported/doc/examples/MatrixSine.cpp b/unsupported/doc/examples/MatrixSine.cpp
index e85e6a754..9eea9a081 100644
--- a/unsupported/doc/examples/MatrixSine.cpp
+++ b/unsupported/doc/examples/MatrixSine.cpp
@@ -8,10 +8,10 @@ int main()
MatrixXd A = MatrixXd::Random(3,3);
std::cout << "A = \n" << A << "\n\n";
- MatrixXd sinA = ei_matrix_sin(A);
+ MatrixXd sinA = A.sin();
std::cout << "sin(A) = \n" << sinA << "\n\n";
- MatrixXd cosA = ei_matrix_cos(A);
+ MatrixXd cosA = A.cos();
std::cout << "cos(A) = \n" << cosA << "\n\n";
// The matrix functions satisfy sin^2(A) + cos^2(A) = I,
diff --git a/unsupported/doc/examples/MatrixSinh.cpp b/unsupported/doc/examples/MatrixSinh.cpp
index 89566d87a..f77186724 100644
--- a/unsupported/doc/examples/MatrixSinh.cpp
+++ b/unsupported/doc/examples/MatrixSinh.cpp
@@ -8,10 +8,10 @@ int main()
MatrixXf A = MatrixXf::Random(3,3);
std::cout << "A = \n" << A << "\n\n";
- MatrixXf sinhA = ei_matrix_sinh(A);
+ MatrixXf sinhA = A.sinh();
std::cout << "sinh(A) = \n" << sinhA << "\n\n";
- MatrixXf coshA = ei_matrix_cosh(A);
+ MatrixXf coshA = A.cosh();
std::cout << "cosh(A) = \n" << coshA << "\n\n";
// The matrix functions satisfy cosh^2(A) - sinh^2(A) = I,
diff --git a/unsupported/test/matrix_exponential.cpp b/unsupported/test/matrix_exponential.cpp
index 61f30334d..66e52e100 100644
--- a/unsupported/test/matrix_exponential.cpp
+++ b/unsupported/test/matrix_exponential.cpp
@@ -57,11 +57,11 @@ void test2dRotation(double tol)
angle = static_cast<T>(pow(10, i / 5. - 2));
B << cos(angle), sin(angle), -sin(angle), cos(angle);
- C = ei_matrix_function(angle*A, expfn);
+ C = (angle*A).matrixFunction(expfn);
std::cout << "test2dRotation: i = " << i << " error funm = " << relerr(C, B);
VERIFY(C.isApprox(B, static_cast<T>(tol)));
- C = ei_matrix_exponential(angle*A);
+ C = (angle*A).exp();
std::cout << " error expm = " << relerr(C, B) << "\n";
VERIFY(C.isApprox(B, static_cast<T>(tol)));
}
@@ -82,11 +82,11 @@ void test2dHyperbolicRotation(double tol)
A << 0, angle*imagUnit, -angle*imagUnit, 0;
B << ch, sh*imagUnit, -sh*imagUnit, ch;
- C = ei_matrix_function(A, expfn);
+ C = A.matrixFunction(expfn);
std::cout << "test2dHyperbolicRotation: i = " << i << " error funm = " << relerr(C, B);
VERIFY(C.isApprox(B, static_cast<T>(tol)));
- C = ei_matrix_exponential(A);
+ C = A.exp();
std::cout << " error expm = " << relerr(C, B) << "\n";
VERIFY(C.isApprox(B, static_cast<T>(tol)));
}
@@ -106,11 +106,11 @@ void testPascal(double tol)
for (int j=0; j<=i; j++)
B(i,j) = static_cast<T>(binom(i,j));
- C = ei_matrix_function(A, expfn);
+ C = A.matrixFunction(expfn);
std::cout << "testPascal: size = " << size << " error funm = " << relerr(C, B);
VERIFY(C.isApprox(B, static_cast<T>(tol)));
- C = ei_matrix_exponential(A);
+ C = A.exp();
std::cout << " error expm = " << relerr(C, B) << "\n";
VERIFY(C.isApprox(B, static_cast<T>(tol)));
}
@@ -132,11 +132,11 @@ void randomTest(const MatrixType& m, double tol)
for(int i = 0; i < g_repeat; i++) {
m1 = MatrixType::Random(rows, cols);
- m2 = ei_matrix_function(m1, expfn) * ei_matrix_function(-m1, expfn);
+ m2 = m1.matrixFunction(expfn) * (-m1).matrixFunction(expfn);
std::cout << "randomTest: error funm = " << relerr(identity, m2);
VERIFY(identity.isApprox(m2, static_cast<RealScalar>(tol)));
- m2 = ei_matrix_exponential(m1) * ei_matrix_exponential(-m1);
+ m2 = m1.exp() * (-m1).exp();
std::cout << " error expm = " << relerr(identity, m2) << "\n";
VERIFY(identity.isApprox(m2, static_cast<RealScalar>(tol)));
}
diff --git a/unsupported/test/matrix_function.cpp b/unsupported/test/matrix_function.cpp
index e40af7b4e..16995d836 100644
--- a/unsupported/test/matrix_function.cpp
+++ b/unsupported/test/matrix_function.cpp
@@ -114,8 +114,7 @@ void testMatrixExponential(const MatrixType& A)
typedef typename NumTraits<Scalar>::Real RealScalar;
typedef std::complex<RealScalar> ComplexScalar;
- VERIFY_IS_APPROX(ei_matrix_exponential(A),
- ei_matrix_function(A, StdStemFunctions<ComplexScalar>::exp));
+ VERIFY_IS_APPROX(A.exp(), A.matrixFunction(StdStemFunctions<ComplexScalar>::exp));
}
template<typename MatrixType>
@@ -123,10 +122,8 @@ void testHyperbolicFunctions(const MatrixType& A)
{
// Need to use absolute error because of possible cancellation when
// adding/subtracting expA and expmA.
- MatrixType expA = ei_matrix_exponential(A);
- MatrixType expmA = ei_matrix_exponential(-A);
- VERIFY_IS_APPROX_ABS(ei_matrix_sinh(A), (expA - expmA) / 2);
- VERIFY_IS_APPROX_ABS(ei_matrix_cosh(A), (expA + expmA) / 2);
+ VERIFY_IS_APPROX_ABS(A.sinh(), (A.exp() - (-A).exp()) / 2);
+ VERIFY_IS_APPROX_ABS(A.cosh(), (A.exp() + (-A).exp()) / 2);
}
template<typename MatrixType>
@@ -143,15 +140,13 @@ void testGonioFunctions(const MatrixType& A)
ComplexMatrix Ac = A.template cast<ComplexScalar>();
- ComplexMatrix exp_iA = ei_matrix_exponential(imagUnit * Ac);
- ComplexMatrix exp_miA = ei_matrix_exponential(-imagUnit * Ac);
+ ComplexMatrix exp_iA = (imagUnit * Ac).exp();
+ ComplexMatrix exp_miA = (-imagUnit * Ac).exp();
- MatrixType sinA = ei_matrix_sin(A);
- ComplexMatrix sinAc = sinA.template cast<ComplexScalar>();
+ ComplexMatrix sinAc = A.sin().template cast<ComplexScalar>();
VERIFY_IS_APPROX_ABS(sinAc, (exp_iA - exp_miA) / (two*imagUnit));
- MatrixType cosA = ei_matrix_cos(A);
- ComplexMatrix cosAc = cosA.template cast<ComplexScalar>();
+ ComplexMatrix cosAc = A.cos().template cast<ComplexScalar>();
VERIFY_IS_APPROX_ABS(cosAc, (exp_iA + exp_miA) / 2);
}