1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2008, 2010 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_DOT_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_DOT_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// helper function for dot(). The problem is that if we put that in the body of dot(), then upon calling dot
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with mismatched types, the compiler emits errors about failing to instantiate cwiseProduct BEFORE
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// looking at the static assertions. Thus this is a trick to get better compile errors.
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T, typename U,
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// the NeedToTranspose condition here is taken straight from Assign.h
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         bool NeedToTranspose = T::IsVectorAtCompileTime
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                && U::IsVectorAtCompileTime
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                && ((int(T::RowsAtCompileTime) == 1 && int(U::ColsAtCompileTime) == 1)
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      |  // FIXME | instead of || to please GCC 4.4.0 stupid warning "suggest parentheses around &&".
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                         // revert to || as soon as not needed anymore.
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    (int(T::ColsAtCompileTime) == 1 && int(U::RowsAtCompileTime) == 1))
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath>
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct dot_nocheck
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename scalar_product_traits<typename traits<T>::Scalar,typename traits<U>::Scalar>::ReturnType ResScalar;
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return a.template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> >(b).sum();
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T, typename U>
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct dot_nocheck<T, U, true>
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename scalar_product_traits<typename traits<T>::Scalar,typename traits<U>::Scalar>::ReturnType ResScalar;
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return a.transpose().template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> >(b).sum();
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the dot product of *this with other.
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \only_for_vectors
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \note If the scalar type is complex numbers, then this function returns the hermitian
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * (sesquilinear) dot product, conjugate-linear in the first variable and linear in the
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * second variable.
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa squaredNorm(), norm()
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived>
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef internal::scalar_conj_product_op<Scalar,typename OtherDerived::Scalar> func;
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_CHECK_BINARY_COMPATIBILIY(func,Scalar,typename OtherDerived::Scalar);
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  eigen_assert(size() == other.size());
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return internal::dot_nocheck<Derived,OtherDerived>::run(*this, other);
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN2_SUPPORT
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the dot product of *this with other, with the Eigen2 convention that the dot product is linear in the first variable
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * (conjugating the second variable). Of course this only makes a difference in the complex case.
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This method is only available in EIGEN2_SUPPORT mode.
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \only_for_vectors
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa dot()
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived>
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypename internal::traits<Derived>::Scalar
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixBase<Derived>::eigen2_dot(const MatrixBase<OtherDerived>& other) const
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  eigen_assert(size() == other.size());
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return internal::dot_nocheck<OtherDerived,Derived>::run(other,*this);
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//---------- implementation of L2 norm and related functions ----------
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns, for vectors, the squared \em l2 norm of \c *this, and for matrices the Frobenius norm.
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * In both cases, it consists in the sum of the square of all the matrix entries.
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * For vectors, this is also equals to the dot product of \c *this with itself.
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa dot(), norm()
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_STRONG_INLINE typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::squaredNorm() const
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  return numext::real((*this).cwiseAbs2().sum());
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns, for vectors, the \em l2 norm of \c *this, and for matrices the Frobenius norm.
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * In both cases, it consists in the square root of the sum of the square of all the matrix entries.
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * For vectors, this is also equals to the square root of the dot product of \c *this with itself.
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa dot(), squaredNorm()
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::norm() const
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  using std::sqrt;
1287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  return sqrt(squaredNorm());
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns an expression of the quotient of *this by its own norm.
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \only_for_vectors
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa norm(), normalize()
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const typename MatrixBase<Derived>::PlainObject
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixBase<Derived>::normalized() const
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename internal::nested<Derived>::type Nested;
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename internal::remove_reference<Nested>::type _Nested;
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  _Nested n(derived());
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return n / n.norm();
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Normalizes the vector, i.e. divides it by its own norm.
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \only_for_vectors
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa norm(), normalized()
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void MatrixBase<Derived>::normalize()
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *this /= norm();
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//---------- implementation of other norms ----------
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, int p>
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct lpNorm_selector
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename NumTraits<typename traits<Derived>::Scalar>::Real RealScalar;
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  static inline RealScalar run(const MatrixBase<Derived>& m)
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
1697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    using std::pow;
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return pow(m.cwiseAbs().array().pow(p).sum(), RealScalar(1)/p);
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct lpNorm_selector<Derived, 1>
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return m.cwiseAbs().sum();
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct lpNorm_selector<Derived, 2>
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return m.norm();
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct lpNorm_selector<Derived, Infinity>
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    return m.cwiseAbs().maxCoeff();
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \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
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *          of the coefficients of *this. If \a p is the special value \a Eigen::Infinity, this function returns the \f$ \ell^\infty \f$
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *          norm, that is the maximum of the absolute values of the coefficients of *this.
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa norm()
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int p>
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixBase<Derived>::lpNorm() const
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return internal::lpNorm_selector<Derived, p>::run(*this);
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//---------- implementation of isOrthogonal / isUnitary ----------
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns true if *this is approximately orthogonal to \a other,
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *          within the precision given by \a prec.
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_isOrthogonal.cpp
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_isOrthogonal.out
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived>
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool MatrixBase<Derived>::isOrthogonal
2287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez(const MatrixBase<OtherDerived>& other, const RealScalar& prec) const
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename internal::nested<Derived,2>::type nested(derived());
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename internal::nested<OtherDerived,2>::type otherNested(other.derived());
2327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  return numext::abs2(nested.dot(otherNested)) <= prec * prec * nested.squaredNorm() * otherNested.squaredNorm();
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns true if *this is approximately an unitary matrix,
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *          within the precision given by \a prec. In the case where the \a Scalar
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *          type is real numbers, a unitary matrix is an orthogonal matrix, whence the name.
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \note This can be used to check whether a family of vectors forms an orthonormal basis.
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *       Indeed, \c m.isUnitary() returns true if and only if the columns (equivalently, the rows) of m form an
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *       orthonormal basis.
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_isUnitary.cpp
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_isUnitary.out
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
2477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezbool MatrixBase<Derived>::isUnitary(const RealScalar& prec) const
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename Derived::Nested nested(derived());
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(Index i = 0; i < cols(); ++i)
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if(!internal::isApprox(nested.col(i).squaredNorm(), static_cast<RealScalar>(1), prec))
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return false;
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for(Index j = 0; j < i; ++j)
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if(!internal::isMuchSmallerThan(nested.col(i).dot(nested.col(j)), static_cast<Scalar>(1), prec))
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        return false;
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return true;
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_DOT_H
264