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