Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-02-22 10:34:42

0001 // This file is part of Eigen, a lightweight C++ template library
0002 // for linear algebra.
0003 //
0004 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
0005 //
0006 // This Source Code Form is subject to the terms of the Mozilla
0007 // Public License v. 2.0. If a copy of the MPL was not distributed
0008 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
0009 
0010 #ifndef EIGEN_SPARSE_DOT_H
0011 #define EIGEN_SPARSE_DOT_H
0012 
0013 namespace Eigen { 
0014 
0015 template<typename Derived>
0016 template<typename OtherDerived>
0017 typename internal::traits<Derived>::Scalar
0018 SparseMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
0019 {
0020   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
0021   EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
0022   EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
0023   EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
0024     YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
0025 
0026   eigen_assert(size() == other.size());
0027   eigen_assert(other.size()>0 && "you are using a non initialized vector");
0028 
0029   internal::evaluator<Derived> thisEval(derived());
0030   typename internal::evaluator<Derived>::InnerIterator i(thisEval, 0);
0031   Scalar res(0);
0032   while (i)
0033   {
0034     res += numext::conj(i.value()) * other.coeff(i.index());
0035     ++i;
0036   }
0037   return res;
0038 }
0039 
0040 template<typename Derived>
0041 template<typename OtherDerived>
0042 typename internal::traits<Derived>::Scalar
0043 SparseMatrixBase<Derived>::dot(const SparseMatrixBase<OtherDerived>& other) const
0044 {
0045   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
0046   EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
0047   EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
0048   EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
0049     YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
0050 
0051   eigen_assert(size() == other.size());
0052 
0053   internal::evaluator<Derived> thisEval(derived());
0054   typename internal::evaluator<Derived>::InnerIterator i(thisEval, 0);
0055   
0056   internal::evaluator<OtherDerived>  otherEval(other.derived());
0057   typename internal::evaluator<OtherDerived>::InnerIterator j(otherEval, 0);
0058 
0059   Scalar res(0);
0060   while (i && j)
0061   {
0062     if (i.index()==j.index())
0063     {
0064       res += numext::conj(i.value()) * j.value();
0065       ++i; ++j;
0066     }
0067     else if (i.index()<j.index())
0068       ++i;
0069     else
0070       ++j;
0071   }
0072   return res;
0073 }
0074 
0075 template<typename Derived>
0076 inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
0077 SparseMatrixBase<Derived>::squaredNorm() const
0078 {
0079   return numext::real((*this).cwiseAbs2().sum());
0080 }
0081 
0082 template<typename Derived>
0083 inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
0084 SparseMatrixBase<Derived>::norm() const
0085 {
0086   using std::sqrt;
0087   return sqrt(squaredNorm());
0088 }
0089 
0090 template<typename Derived>
0091 inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
0092 SparseMatrixBase<Derived>::blueNorm() const
0093 {
0094   return internal::blueNorm_impl(*this);
0095 }
0096 } // end namespace Eigen
0097 
0098 #endif // EIGEN_SPARSE_DOT_H