SparseDot.h revision c981c48f5bc9aefeffc0bcb0cc3934c2fae179dd
1// This file is part of Eigen, a lightweight C++ template library 2// for linear algebra. 3// 4// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> 5// 6// This Source Code Form is subject to the terms of the Mozilla 7// Public License v. 2.0. If a copy of the MPL was not distributed 8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10#ifndef EIGEN_SPARSE_DOT_H 11#define EIGEN_SPARSE_DOT_H 12 13namespace Eigen { 14 15template<typename Derived> 16template<typename OtherDerived> 17typename internal::traits<Derived>::Scalar 18SparseMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const 19{ 20 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 21 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 22 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived) 23 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value), 24 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY) 25 26 eigen_assert(size() == other.size()); 27 eigen_assert(other.size()>0 && "you are using a non initialized vector"); 28 29 typename Derived::InnerIterator i(derived(),0); 30 Scalar res(0); 31 while (i) 32 { 33 res += internal::conj(i.value()) * other.coeff(i.index()); 34 ++i; 35 } 36 return res; 37} 38 39template<typename Derived> 40template<typename OtherDerived> 41typename internal::traits<Derived>::Scalar 42SparseMatrixBase<Derived>::dot(const SparseMatrixBase<OtherDerived>& other) const 43{ 44 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 45 EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) 46 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived) 47 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value), 48 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY) 49 50 eigen_assert(size() == other.size()); 51 52 typedef typename Derived::Nested Nested; 53 typedef typename OtherDerived::Nested OtherNested; 54 typedef typename internal::remove_all<Nested>::type NestedCleaned; 55 typedef typename internal::remove_all<OtherNested>::type OtherNestedCleaned; 56 57 const Nested nthis(derived()); 58 const OtherNested nother(other.derived()); 59 60 typename NestedCleaned::InnerIterator i(nthis,0); 61 typename OtherNestedCleaned::InnerIterator j(nother,0); 62 Scalar res(0); 63 while (i && j) 64 { 65 if (i.index()==j.index()) 66 { 67 res += internal::conj(i.value()) * j.value(); 68 ++i; ++j; 69 } 70 else if (i.index()<j.index()) 71 ++i; 72 else 73 ++j; 74 } 75 return res; 76} 77 78template<typename Derived> 79inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real 80SparseMatrixBase<Derived>::squaredNorm() const 81{ 82 return internal::real((*this).cwiseAbs2().sum()); 83} 84 85template<typename Derived> 86inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real 87SparseMatrixBase<Derived>::norm() const 88{ 89 return internal::sqrt(squaredNorm()); 90} 91 92} // end namespace Eigen 93 94#endif // EIGEN_SPARSE_DOT_H 95