test_complex_norms.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Copyright 2010 Gunter Winkler <guwi17@gmx.de>
  2. // Distributed under the Boost Software License, Version 1.0. (See
  3. // accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #include <boost/numeric/ublas/vector.hpp>
  6. #include <boost/numeric/ublas/io.hpp>
  7. #include <boost/numeric/ublas/matrix.hpp>
  8. #include <complex>
  9. #include "utils.hpp"
  10. using namespace boost::numeric::ublas;
  11. static const double TOL(1.0e-5); ///< Used for comparing two real numbers.
  12. BOOST_UBLAS_TEST_DEF ( test_double_complex_norm_inf ) {
  13. typedef std::complex<double> dComplex;
  14. vector<dComplex> v(4);
  15. for (unsigned int i = 0; i < v.size(); ++i)
  16. v[i] = dComplex(i, i + 1);
  17. const double expected = abs(v[3]);
  18. BOOST_UBLAS_DEBUG_TRACE( "norm is " << norm_inf(v) );
  19. BOOST_UBLAS_TEST_CHECK(std::abs(norm_inf(v) - expected) < TOL);
  20. v *= 3.;
  21. BOOST_UBLAS_TEST_CHECK(std::abs(norm_inf(v) - (3.0*expected)) < TOL);
  22. }
  23. BOOST_UBLAS_TEST_DEF ( test_double_complex_norm_2 ) {
  24. typedef std::complex<double> dComplex;
  25. vector<dComplex> v(4);
  26. for (unsigned int i = 0; i < v.size(); ++i)
  27. v[i] = dComplex(i, i + 1);
  28. const double expected = sqrt(44.0);
  29. BOOST_UBLAS_DEBUG_TRACE( "norm is " << norm_2(v) );
  30. BOOST_UBLAS_TEST_CHECK(std::abs(norm_2(v) - expected) < TOL);
  31. v *= 3.;
  32. BOOST_UBLAS_TEST_CHECK(std::abs(norm_2(v) - (3.0*expected)) < TOL);
  33. }
  34. BOOST_UBLAS_TEST_DEF ( test_double_complex_norm_2_square ) {
  35. typedef std::complex<double> dComplex;
  36. vector<dComplex> v(4);
  37. for (unsigned int i = 0; i < v.size(); ++i)
  38. v[i] = dComplex(i, i + 1);
  39. const double expected = 44;
  40. BOOST_UBLAS_DEBUG_TRACE( "square norm is " << norm_2_square(v) );
  41. BOOST_UBLAS_TEST_CHECK(std::abs(norm_2_square(v) - expected) < TOL);
  42. v *= 3.;
  43. BOOST_UBLAS_TEST_CHECK(std::abs(norm_2_square(v) - (9.0*expected)) < TOL);
  44. }
  45. BOOST_UBLAS_TEST_DEF ( test_float_complex_norm_inf ) {
  46. typedef std::complex<float> dComplex;
  47. vector<dComplex> v(4);
  48. for (unsigned short i = 0; i < v.size(); ++i) {
  49. unsigned short imag(i + 1);
  50. v[i] = dComplex(i, imag);
  51. }
  52. const float expected = abs(v[3]);
  53. BOOST_UBLAS_DEBUG_TRACE( "norm is " << norm_inf(v) );
  54. BOOST_UBLAS_TEST_CHECK(std::abs(norm_inf(v) - expected) < TOL);
  55. v *= 3.f;
  56. BOOST_UBLAS_TEST_CHECK(std::abs(norm_inf(v) - (3.0*expected)) < TOL);
  57. }
  58. BOOST_UBLAS_TEST_DEF ( test_float_complex_norm_2 ) {
  59. typedef std::complex<float> dComplex;
  60. vector<dComplex> v(4);
  61. for (unsigned short i = 0; i < v.size(); ++i) {
  62. unsigned short imag(i + 1);
  63. v[i] = dComplex(i, imag);
  64. }
  65. const double expected = sqrt(44.0);
  66. BOOST_UBLAS_DEBUG_TRACE( "norm is " << norm_2(v) );
  67. BOOST_UBLAS_TEST_CHECK(std::abs(norm_2(v) - expected) < TOL);
  68. v *= 3.f;
  69. BOOST_UBLAS_TEST_CHECK(std::abs(norm_2(v) - (3.0*expected)) < TOL);
  70. }
  71. BOOST_UBLAS_TEST_DEF ( test_float_complex_norm_2_square ) {
  72. typedef std::complex<float> dComplex;
  73. vector<dComplex> v(4);
  74. for (unsigned short i = 0; i < v.size(); ++i) {
  75. unsigned short imag(i + 1);
  76. v[i] = dComplex(i, imag);
  77. }
  78. const double expected = 44;
  79. BOOST_UBLAS_DEBUG_TRACE( "square norm is " << norm_2_square(v) );
  80. BOOST_UBLAS_TEST_CHECK(std::abs(norm_2_square(v) - expected) < TOL);
  81. v *= 3.f;
  82. BOOST_UBLAS_TEST_CHECK(std::abs(norm_2_square(v) - (9.0*expected)) < TOL);
  83. }
  84. int main() {
  85. BOOST_UBLAS_TEST_BEGIN();
  86. BOOST_UBLAS_TEST_DO( test_double_complex_norm_inf );
  87. BOOST_UBLAS_TEST_DO( test_float_complex_norm_inf );
  88. BOOST_UBLAS_TEST_DO( test_double_complex_norm_2 );
  89. BOOST_UBLAS_TEST_DO( test_float_complex_norm_2 );
  90. BOOST_UBLAS_TEST_DO( test_double_complex_norm_2_square );
  91. BOOST_UBLAS_TEST_DO( test_float_complex_norm_2_square );
  92. BOOST_UBLAS_TEST_END();
  93. }