Cycles: svn merge -r41225:41232 ^/trunk/blender
[blender.git] / extern / Eigen2 / Eigen / src / Array / Norms.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra. Eigen itself is part of the KDE project.
3 //
4 // Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
5 //
6 // Eigen is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 3 of the License, or (at your option) any later version.
10 //
11 // Alternatively, you can redistribute it and/or
12 // modify it under the terms of the GNU General Public License as
13 // published by the Free Software Foundation; either version 2 of
14 // the License, or (at your option) any later version.
15 //
16 // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
17 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU Lesser General Public
22 // License and a copy of the GNU General Public License along with
23 // Eigen. If not, see <http://www.gnu.org/licenses/>.
24
25 #ifndef EIGEN_ARRAY_NORMS_H
26 #define EIGEN_ARRAY_NORMS_H
27
28 template<typename Derived, int p>
29 struct ei_lpNorm_selector
30 {
31   typedef typename NumTraits<typename ei_traits<Derived>::Scalar>::Real RealScalar;
32   inline static RealScalar run(const MatrixBase<Derived>& m)
33   {
34     return ei_pow(m.cwise().abs().cwise().pow(p).sum(), RealScalar(1)/p);
35   }
36 };
37
38 template<typename Derived>
39 struct ei_lpNorm_selector<Derived, 1>
40 {
41   inline static typename NumTraits<typename ei_traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
42   {
43     return m.cwise().abs().sum();
44   }
45 };
46
47 template<typename Derived>
48 struct ei_lpNorm_selector<Derived, 2>
49 {
50   inline static typename NumTraits<typename ei_traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
51   {
52     return m.norm();
53   }
54 };
55
56 template<typename Derived>
57 struct ei_lpNorm_selector<Derived, Infinity>
58 {
59   inline static typename NumTraits<typename ei_traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
60   {
61     return m.cwise().abs().maxCoeff();
62   }
63 };
64
65 /** \array_module
66   * 
67   * \returns the \f$ \ell^p \f$ norm of *this, that is, returns the p-th root of the sum of the p-th powers of the absolute values
68   *          of the coefficients of *this. If \a p is the special value \a Eigen::Infinity, this function returns the \f$ \ell^p\infty \f$
69   *          norm, that is the maximum of the absolute values of the coefficients of *this.
70   *
71   * \sa norm()
72   */
73 template<typename Derived>
74 template<int p>
75 inline typename NumTraits<typename ei_traits<Derived>::Scalar>::Real MatrixBase<Derived>::lpNorm() const
76 {
77   return ei_lpNorm_selector<Derived, p>::run(*this);
78 }
79
80 #endif // EIGEN_ARRAY_NORMS_H