20template<
typename T,
typename U,
22 bool NeedToTranspose = T::IsVectorAtCompileTime
23 && U::IsVectorAtCompileTime
24 && ((int(T::RowsAtCompileTime) == 1 && int(U::ColsAtCompileTime) == 1)
27 (
int(T::ColsAtCompileTime) == 1 && int(U::RowsAtCompileTime) == 1))
31 typedef scalar_conj_product_op<typename traits<T>::Scalar,
typename traits<U>::Scalar> conj_prod;
32 typedef typename conj_prod::result_type ResScalar;
35 static ResScalar run(
const MatrixBase<T>& a,
const MatrixBase<U>& b)
37 return a.template binaryExpr<conj_prod>(b).sum();
41template<
typename T,
typename U>
42struct dot_nocheck<T, U, true>
44 typedef scalar_conj_product_op<typename traits<T>::Scalar,
typename traits<U>::Scalar> conj_prod;
45 typedef typename conj_prod::result_type ResScalar;
48 static ResScalar run(
const MatrixBase<T>& a,
const MatrixBase<U>& b)
50 return a.transpose().template binaryExpr<conj_prod>(b).sum();
67template<
typename Derived>
68template<
typename OtherDerived>
71typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,
typename internal::traits<OtherDerived>::Scalar>::ReturnType
74 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
75 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
76 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
77#if !(defined(EIGEN_NO_STATIC_ASSERT) && defined(EIGEN_NO_DEBUG))
78 typedef internal::scalar_conj_product_op<Scalar,typename OtherDerived::Scalar> func;
79 EIGEN_CHECK_BINARY_COMPATIBILIY(func,
Scalar,
typename OtherDerived::Scalar);
82 eigen_assert(size() == other.size());
84 return internal::dot_nocheck<Derived,OtherDerived>::run(*
this, other);
95template<
typename Derived>
98 return numext::real((*this).cwiseAbs2().sum());
107template<
typename Derived>
108EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
MatrixBase<Derived>::norm()
const
110 return numext::sqrt(squaredNorm());
122template<
typename Derived>
123EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const typename MatrixBase<Derived>::PlainObject
126 typedef typename internal::nested_eval<Derived,2>::type _Nested;
127 _Nested n(derived());
128 RealScalar z = n.squaredNorm();
131 return n / numext::sqrt(z);
144template<
typename Derived>
147 RealScalar z = squaredNorm();
150 derived() /= numext::sqrt(z);
165template<
typename Derived>
166EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const typename MatrixBase<Derived>::PlainObject
169 typedef typename internal::nested_eval<Derived,3>::type _Nested;
170 _Nested n(derived());
171 RealScalar w = n.cwiseAbs().maxCoeff();
172 RealScalar z = (n/w).squaredNorm();
174 return n / (numext::sqrt(z)*w);
190template<
typename Derived>
193 RealScalar w = cwiseAbs().maxCoeff();
194 RealScalar z = (derived()/w).squaredNorm();
196 derived() /= numext::sqrt(z)*w;
203template<
typename Derived,
int p>
204struct lpNorm_selector
206 typedef typename NumTraits<typename traits<Derived>::Scalar>::Real RealScalar;
208 static inline RealScalar run(
const MatrixBase<Derived>& m)
211 return pow(m.cwiseAbs().array().pow(p).sum(), RealScalar(1)/p);
215template<
typename Derived>
216struct lpNorm_selector<Derived, 1>
219 static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(
const MatrixBase<Derived>& m)
221 return m.cwiseAbs().sum();
225template<
typename Derived>
226struct lpNorm_selector<Derived, 2>
229 static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(
const MatrixBase<Derived>& m)
235template<
typename Derived>
236struct lpNorm_selector<Derived,
Infinity>
238 typedef typename NumTraits<typename traits<Derived>::Scalar>::Real RealScalar;
240 static inline RealScalar run(
const MatrixBase<Derived>& m)
242 if(Derived::SizeAtCompileTime==0 || (Derived::SizeAtCompileTime==
Dynamic && m.size()==0))
243 return RealScalar(0);
244 return m.cwiseAbs().maxCoeff();
260template<
typename Derived>
262#ifndef EIGEN_PARSED_BY_DOXYGEN
263EIGEN_DEVICE_FUNC
inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
265EIGEN_DEVICE_FUNC MatrixBase<Derived>::RealScalar
269 return internal::lpNorm_selector<Derived, p>::run(*
this);
280template<
typename Derived>
281template<
typename OtherDerived>
283(
const MatrixBase<OtherDerived>& other,
const RealScalar& prec)
const
285 typename internal::nested_eval<Derived,2>::type nested(derived());
286 typename internal::nested_eval<OtherDerived,2>::type otherNested(other.derived());
287 return numext::abs2(nested.dot(otherNested)) <= prec * prec * nested.squaredNorm() * otherNested.squaredNorm();
301template<
typename Derived>
304 typename internal::nested_eval<Derived,1>::type self(derived());
305 for(
Index i = 0; i < cols(); ++i)
307 if(!internal::isApprox(self.col(i).squaredNorm(),
static_cast<RealScalar
>(1), prec))
309 for(
Index j = 0; j < i; ++j)
310 if(!internal::isMuchSmallerThan(self.col(i).dot(self.col(j)),
static_cast<Scalar>(1), prec))
internal::traits< Derived >::Scalar Scalar
Definition DenseBase.h:66
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
Namespace containing all symbols from the Eigen library.
Definition Core:141
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
const int Infinity
Definition Constants.h:36
const int Dynamic
Definition Constants.h:22