fork(1) download
  1. #include <iostream>
  2. #include <valarray>
  3. #include <complex>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. typedef complex<float> Complex_f;
  8. typedef valarray<Complex_f> VCF_t;
  9. typedef valarray<float> VF_t;
  10.  
  11. gslice gslice2DSet(size_t start, size_t dim1, size_t dim2, size_t stride1, size_t stride2)
  12. {
  13. size_t lengths[]= {dim1, dim2};
  14. size_t strides[]= {stride1, stride2};
  15.  
  16. gslice gs (
  17. start,
  18. valarray<size_t>(lengths,2),
  19. valarray<size_t>(strides,2));
  20.  
  21. return gs;
  22. }
  23.  
  24. template<class T>
  25. void print2d(valarray<T> &v, size_t nRow, size_t nCol) {
  26. for(size_t r = 0; r < nRow; ++r)
  27. {
  28. for(size_t c = 0; c < nCol; ++c)
  29. {
  30. cout << ' ' << v[r*nCol + c];
  31. }
  32. cout << endl;
  33. }
  34. cout << endl;
  35. }
  36.  
  37. template<class T>
  38. void foo(valarray<T>& vala, gslice& gs)
  39. {
  40. size_t nRows = gs.size()[0];
  41. size_t nCols = gs.size()[1];
  42. valarray<T> varesult = vala[gs];
  43. print2d(varesult, nRows, nCols);
  44. }
  45.  
  46. float Norm(Complex_f cf)
  47. {
  48. return cf.real() * cf.real() + cf.imag() * cf.imag();
  49. }
  50.  
  51. void convertComplexToFloat1(VCF_t& vac, VF_t& vaf)
  52. {
  53. for(size_t i=0; i<vac.size(); ++i)
  54. {
  55. vaf[i] = Norm(vac[i]);
  56. }
  57. }
  58.  
  59. void convertComplexToFloat2(VCF_t& vac, VF_t& vaf)
  60. {
  61. std::transform(&vac[0], &vac[vac.size()], &vaf[0], Norm);
  62. }
  63.  
  64. void convertComplexToFloat3(VCF_t &vac, VF_t &vaf)
  65. {
  66. std::transform(&vac[0], &vac[vac.size()], &vaf[0],
  67. static_cast<float(*)(std::complex<float> const &)>(&std::norm<float>));
  68. }
  69.  
  70. void convertComplexToFloat4(VCF_t &vac, VF_t &vaf)
  71. {
  72. VCF_t normVac = vac * vac.apply(conj<float>);
  73. std::transform(&normVac[0], &normVac[vac.size()], &vaf[0],
  74. static_cast<float(*)(std::complex<float> const &)>(&std::real<float>));
  75. }
  76.  
  77. int main()
  78. {
  79. const int M=5, N=7;
  80. const Complex_f vacFill(3.0, 4.0);
  81. VCF_t vac(vacFill, M*N);
  82.  
  83. gslice gsOrig = gslice2DSet(0, M,N, N,1);
  84. gslice gs = gslice2DSet(8, 3,4, N,1);
  85. vac[gs] = Complex_f(30,40);
  86.  
  87. foo(vac, gsOrig);
  88. foo(vac, gs);
  89.  
  90. VF_t vaf(M*N);
  91. gs = gslice2DSet(9, 3,4, N,1);
  92. foo(vac, gs);
  93.  
  94. vaf = 1.0;
  95. cout << "v.1" << endl;
  96. convertComplexToFloat1(vac, vaf);
  97. foo(vaf, gsOrig);
  98.  
  99. vaf = 1.0;
  100. cout << "v.2" << endl;
  101. convertComplexToFloat2(vac, vaf);
  102. foo(vaf, gsOrig);
  103.  
  104. vaf = 1.0;
  105. cout << "v.3" << endl;
  106. convertComplexToFloat3(vac, vaf);
  107. foo(vaf, gsOrig);
  108.  
  109. vaf = 1.0;
  110. cout << "v.4" << endl;
  111. convertComplexToFloat4(vac, vaf);
  112. foo(vaf, gsOrig);
  113.  
  114. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function 'void convertComplexToFloat4(VCF_t&, VF_t&)':
prog.cpp:74: error: invalid static_cast from type '<unresolved overloaded function type>' to type 'float (*)(const std::complex<float>&)'
stdout
Standard output is empty