35 template<
typename T,
typename U,
37 bool NeedToTranspose = T::IsVectorAtCompileTime
38 && U::IsVectorAtCompileTime
39 && ((
int(T::RowsAtCompileTime) == 1 &&
int(U::ColsAtCompileTime) == 1)
42 (
int(T::ColsAtCompileTime) == 1 &&
int(U::RowsAtCompileTime) == 1))
46 typedef typename scalar_product_traits<typename traits<T>::Scalar,
typename traits<U>::Scalar>::ReturnType ResScalar;
47 static inline ResScalar run(
const MatrixBase<T>& a,
const MatrixBase<U>& b)
49 return a.template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,
typename traits<U>::Scalar> >(b).sum();
53 template<
typename T,
typename U>
54 struct dot_nocheck<T, U, true>
56 typedef typename scalar_product_traits<typename traits<T>::Scalar,
typename traits<U>::Scalar>::ReturnType ResScalar;
57 static inline ResScalar run(
const MatrixBase<T>& a,
const MatrixBase<U>& b)
59 return a.transpose().template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,
typename traits<U>::Scalar> >(b).sum();
75 template<
typename Derived>
76 template<
typename OtherDerived>
77 typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,
typename internal::traits<OtherDerived>::Scalar>::ReturnType
83 typedef internal::scalar_conj_product_op<Scalar,typename OtherDerived::Scalar> func;
88 return internal::dot_nocheck<Derived,OtherDerived>::run(*
this, other);
101 template<
typename Derived>
102 template<
typename OtherDerived>
103 typename internal::traits<Derived>::Scalar
110 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
114 return internal::dot_nocheck<OtherDerived,Derived>::run(other,*this);
127 template<
typename Derived>
139 template<
typename Derived>
151 template<
typename Derived>
155 typedef typename internal::nested<Derived>::type Nested;
156 typedef typename internal::remove_reference<Nested>::type _Nested;
157 _Nested n(derived());
167 template<
typename Derived>
177 template<
typename Derived,
int p>
178 struct lpNorm_selector
183 return pow(m.
cwiseAbs().array().pow(
p).sum(), RealScalar(1)/
p);
187 template<
typename Derived>
188 struct lpNorm_selector<Derived, 1>
190 static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(
const MatrixBase<Derived>& m)
192 return m.cwiseAbs().sum();
196 template<
typename Derived>
197 struct lpNorm_selector<Derived, 2>
199 static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(
const MatrixBase<Derived>& m)
205 template<
typename Derived>
206 struct lpNorm_selector<Derived,
Infinity>
208 static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(
const MatrixBase<Derived>& m)
210 return m.cwiseAbs().maxCoeff();
222 template<
typename Derived>
224 inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
227 return internal::lpNorm_selector<Derived, p>::run(*
this);
238 template<
typename Derived>
239 template<
typename OtherDerived>
243 typename internal::nested<Derived,2>::type nested(derived());
244 typename internal::nested<OtherDerived,2>::type otherNested(other.derived());
245 return internal::abs2(nested.dot(otherNested)) <= prec * prec * nested.squaredNorm() * otherNested.squaredNorm();
259 template<
typename Derived>
262 typename Derived::Nested nested(derived());
263 for(
Index i = 0; i < cols(); ++i)
267 for(
Index j = 0; j < i; ++j)
276 #endif // EIGEN_DOT_H