File indexing completed on 2025-02-22 10:34:42
0001
0002
0003
0004
0005
0006
0007
0008
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 }
0097
0098 #endif