SparseDot.h 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. #ifndef EIGEN_SPARSE_DOT_H
  10. #define EIGEN_SPARSE_DOT_H
  11. namespace Eigen {
  12. template<typename Derived>
  13. template<typename OtherDerived>
  14. typename internal::traits<Derived>::Scalar
  15. SparseMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
  16. {
  17. EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
  18. EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
  19. EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
  20. EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
  21. YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
  22. eigen_assert(size() == other.size());
  23. eigen_assert(other.size()>0 && "you are using a non initialized vector");
  24. internal::evaluator<Derived> thisEval(derived());
  25. typename internal::evaluator<Derived>::InnerIterator i(thisEval, 0);
  26. Scalar res(0);
  27. while (i)
  28. {
  29. res += numext::conj(i.value()) * other.coeff(i.index());
  30. ++i;
  31. }
  32. return res;
  33. }
  34. template<typename Derived>
  35. template<typename OtherDerived>
  36. typename internal::traits<Derived>::Scalar
  37. SparseMatrixBase<Derived>::dot(const SparseMatrixBase<OtherDerived>& other) const
  38. {
  39. EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
  40. EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
  41. EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
  42. EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
  43. YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
  44. eigen_assert(size() == other.size());
  45. internal::evaluator<Derived> thisEval(derived());
  46. typename internal::evaluator<Derived>::InnerIterator i(thisEval, 0);
  47. internal::evaluator<OtherDerived> otherEval(other.derived());
  48. typename internal::evaluator<OtherDerived>::InnerIterator j(otherEval, 0);
  49. Scalar res(0);
  50. while (i && j)
  51. {
  52. if (i.index()==j.index())
  53. {
  54. res += numext::conj(i.value()) * j.value();
  55. ++i; ++j;
  56. }
  57. else if (i.index()<j.index())
  58. ++i;
  59. else
  60. ++j;
  61. }
  62. return res;
  63. }
  64. template<typename Derived>
  65. inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
  66. SparseMatrixBase<Derived>::squaredNorm() const
  67. {
  68. return numext::real((*this).cwiseAbs2().sum());
  69. }
  70. template<typename Derived>
  71. inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
  72. SparseMatrixBase<Derived>::norm() const
  73. {
  74. using std::sqrt;
  75. return sqrt(squaredNorm());
  76. }
  77. template<typename Derived>
  78. inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
  79. SparseMatrixBase<Derived>::blueNorm() const
  80. {
  81. return internal::blueNorm_impl(*this);
  82. }
  83. } // end namespace Eigen
  84. #endif // EIGEN_SPARSE_DOT_H