Eigen  3.3.3
SparseDot.h
00001 // This file is part of Eigen, a lightweight C++ template library
00002 // for linear algebra.
00003 //
00004 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
00005 //
00006 // This Source Code Form is subject to the terms of the Mozilla
00007 // Public License v. 2.0. If a copy of the MPL was not distributed
00008 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
00009 
00010 #ifndef EIGEN_SPARSE_DOT_H
00011 #define EIGEN_SPARSE_DOT_H
00012 
00013 namespace Eigen { 
00014 
00015 template<typename Derived>
00016 template<typename OtherDerived>
00017 typename internal::traits<Derived>::Scalar
00018 SparseMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
00019 {
00020   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
00021   EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
00022   EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
00023   EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
00024     YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
00025 
00026   eigen_assert(size() == other.size());
00027   eigen_assert(other.size()>0 && "you are using a non initialized vector");
00028 
00029   internal::evaluator<Derived> thisEval(derived());
00030   typename internal::evaluator<Derived>::InnerIterator i(thisEval, 0);
00031   Scalar res(0);
00032   while (i)
00033   {
00034     res += numext::conj(i.value()) * other.coeff(i.index());
00035     ++i;
00036   }
00037   return res;
00038 }
00039 
00040 template<typename Derived>
00041 template<typename OtherDerived>
00042 typename internal::traits<Derived>::Scalar
00043 SparseMatrixBase<Derived>::dot(const SparseMatrixBase<OtherDerived>& other) const
00044 {
00045   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
00046   EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
00047   EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
00048   EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
00049     YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
00050 
00051   eigen_assert(size() == other.size());
00052 
00053   internal::evaluator<Derived> thisEval(derived());
00054   typename internal::evaluator<Derived>::InnerIterator i(thisEval, 0);
00055   
00056   internal::evaluator<OtherDerived>  otherEval(other.derived());
00057   typename internal::evaluator<OtherDerived>::InnerIterator j(otherEval, 0);
00058 
00059   Scalar res(0);
00060   while (i && j)
00061   {
00062     if (i.index()==j.index())
00063     {
00064       res += numext::conj(i.value()) * j.value();
00065       ++i; ++j;
00066     }
00067     else if (i.index()<j.index())
00068       ++i;
00069     else
00070       ++j;
00071   }
00072   return res;
00073 }
00074 
00075 template<typename Derived>
00076 inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
00077 SparseMatrixBase<Derived>::squaredNorm() const
00078 {
00079   return numext::real((*this).cwiseAbs2().sum());
00080 }
00081 
00082 template<typename Derived>
00083 inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
00084 SparseMatrixBase<Derived>::norm() const
00085 {
00086   using std::sqrt;
00087   return sqrt(squaredNorm());
00088 }
00089 
00090 template<typename Derived>
00091 inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
00092 SparseMatrixBase<Derived>::blueNorm() const
00093 {
00094   return internal::blueNorm_impl(*this);
00095 }
00096 } // end namespace Eigen
00097 
00098 #endif // EIGEN_SPARSE_DOT_H
 All Classes Functions Variables Typedefs Enumerations Enumerator Friends