![]() |
Eigen
3.3.3
|
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