fork 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 const & (*)(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. }
Success #stdin #stdout 0s 2864KB
stdin
Standard input is empty
stdout
 (3,4) (3,4) (3,4) (3,4) (3,4) (3,4) (3,4)
 (3,4) (30,40) (30,40) (30,40) (30,40) (3,4) (3,4)
 (3,4) (30,40) (30,40) (30,40) (30,40) (3,4) (3,4)
 (3,4) (30,40) (30,40) (30,40) (30,40) (3,4) (3,4)
 (3,4) (3,4) (3,4) (3,4) (3,4) (3,4) (3,4)

 (30,40) (30,40) (30,40) (30,40)
 (30,40) (30,40) (30,40) (30,40)
 (30,40) (30,40) (30,40) (30,40)

 (30,40) (30,40) (30,40) (3,4)
 (30,40) (30,40) (30,40) (3,4)
 (30,40) (30,40) (30,40) (3,4)

v.1
 25 25 25 25 25 25 25
 25 2500 2500 2500 2500 25 25
 25 2500 2500 2500 2500 25 25
 25 2500 2500 2500 2500 25 25
 25 25 25 25 25 25 25

v.2
 25 25 25 25 25 25 25
 25 2500 2500 2500 2500 25 25
 25 2500 2500 2500 2500 25 25
 25 2500 2500 2500 2500 25 25
 25 25 25 25 25 25 25

v.3
 25 25 25 25 25 25 25
 25 2500 2500 2500 2500 25 25
 25 2500 2500 2500 2500 25 25
 25 2500 2500 2500 2500 25 25
 25 25 25 25 25 25 25

v.4
 25 25 25 25 25 25 25
 25 2500 2500 2500 2500 25 25
 25 2500 2500 2500 2500 25 25
 25 2500 2500 2500 2500 25 25
 25 25 25 25 25 25 25