#include <iostream>
#include <valarray>
#include <complex>
#include <algorithm>
using namespace std;
typedef complex< float > Complex_f;
typedef valarray< Complex_f> VCF_t;
typedef valarray< float > VF_t;
gslice gslice2DSet( size_t start, size_t dim1, size_t dim2, size_t stride1, size_t stride2)
{
size_t lengths[ ] = { dim1, dim2} ;
size_t strides[ ] = { stride1, stride2} ;
gslice gs (
start,
valarray< size_t > ( lengths,2 ) ,
valarray< size_t > ( strides,2 ) ) ;
return gs;
}
template < class T>
void print2d( valarray< T> & v, size_t nRow, size_t nCol) {
for ( size_t r = 0 ; r < nRow; ++ r)
{
for ( size_t c = 0 ; c < nCol; ++ c)
{
cout << ' ' << v[ r* nCol + c] ;
}
cout << endl;
}
cout << endl;
}
template < class T>
void foo( valarray< T> & vala, gslice& gs)
{
size_t nRows = gs.size ( ) [ 0 ] ;
size_t nCols = gs.size ( ) [ 1 ] ;
valarray< T> varesult = vala[ gs] ;
print2d( varesult, nRows, nCols) ;
}
float Norm( Complex_f cf)
{
return cf.real ( ) * cf.real ( ) + cf.imag ( ) * cf.imag ( ) ;
}
void convertComplexToFloat1( VCF_t& vac, VF_t& vaf)
{
for ( size_t i= 0 ; i< vac.size ( ) ; ++ i)
{
vaf[ i] = Norm( vac[ i] ) ;
}
}
void convertComplexToFloat2( VCF_t& vac, VF_t& vaf)
{
std:: transform ( & vac[ 0 ] , & vac[ vac.size ( ) ] , & vaf[ 0 ] , Norm) ;
}
void convertComplexToFloat3( VCF_t & vac, VF_t & vaf)
{
std:: transform ( & vac[ 0 ] , & vac[ vac.size ( ) ] , & vaf[ 0 ] ,
static_cast < float ( * ) ( std:: complex < float > const & ) > ( & std:: norm < float > ) ) ;
}
void convertComplexToFloat4( VCF_t & vac, VF_t & vaf)
{
VCF_t normVac = vac * vac.apply ( conj< float > ) ;
std:: transform ( & normVac[ 0 ] , & normVac[ vac.size ( ) ] , & vaf[ 0 ] ,
static_cast < float ( * ) ( std:: complex < float > const & ) > ( & std:: real < float > ) ) ;
}
int main( )
{
const int M= 5 , N= 7 ;
const Complex_f vacFill( 3.0 , 4.0 ) ;
VCF_t vac( vacFill, M* N) ;
gslice gsOrig = gslice2DSet( 0 , M,N, N,1 ) ;
gslice gs = gslice2DSet( 8 , 3 ,4 , N,1 ) ;
vac[ gs] = Complex_f( 30 ,40 ) ;
foo( vac, gsOrig) ;
foo( vac, gs) ;
VF_t vaf( M* N) ;
gs = gslice2DSet( 9 , 3 ,4 , N,1 ) ;
foo( vac, gs) ;
vaf = 1.0 ;
cout << "v.1" << endl;
convertComplexToFloat1( vac, vaf) ;
foo( vaf, gsOrig) ;
vaf = 1.0 ;
cout << "v.2" << endl;
convertComplexToFloat2( vac, vaf) ;
foo( vaf, gsOrig) ;
vaf = 1.0 ;
cout << "v.3" << endl;
convertComplexToFloat3( vac, vaf) ;
foo( vaf, gsOrig) ;
vaf = 1.0 ;
cout << "v.4" << endl;
convertComplexToFloat4( vac, vaf) ;
foo( vaf, gsOrig) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmFsYXJyYXk+CiNpbmNsdWRlIDxjb21wbGV4PgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBjb21wbGV4PGZsb2F0PiBDb21wbGV4X2Y7CnR5cGVkZWYgdmFsYXJyYXk8Q29tcGxleF9mPiBWQ0ZfdDsKdHlwZWRlZiB2YWxhcnJheTxmbG9hdD4gVkZfdDsKCmdzbGljZSBnc2xpY2UyRFNldChzaXplX3Qgc3RhcnQsIHNpemVfdCBkaW0xLCBzaXplX3QgZGltMiwgc2l6ZV90IHN0cmlkZTEsIHNpemVfdCBzdHJpZGUyKQp7CiAgIHNpemVfdCBsZW5ndGhzW109IHtkaW0xLCAgICBkaW0yfTsKICAgc2l6ZV90IHN0cmlkZXNbXT0ge3N0cmlkZTEsIHN0cmlkZTJ9OwoKICAgZ3NsaWNlIGdzICgKICAgICAgc3RhcnQsCiAgICAgIHZhbGFycmF5PHNpemVfdD4obGVuZ3RocywyKSwKICAgICAgdmFsYXJyYXk8c2l6ZV90PihzdHJpZGVzLDIpKTsKCiAgIHJldHVybiBnczsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4Kdm9pZCBwcmludDJkKHZhbGFycmF5PFQ+ICZ2LCBzaXplX3QgblJvdywgc2l6ZV90IG5Db2wpIHsKICAgZm9yKHNpemVfdCByID0gMDsgciA8IG5Sb3c7ICsrcikKICAgewogICAgICBmb3Ioc2l6ZV90IGMgPSAwOyBjIDwgbkNvbDsgKytjKQogICAgICB7CiAgICAgICAgIGNvdXQgPDwgJyAnIDw8IHZbcipuQ29sICsgY107CiAgICAgIH0KICAgICAgY291dCA8PCBlbmRsOwogICB9CiAgIGNvdXQgPDwgZW5kbDsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4Kdm9pZCBmb28odmFsYXJyYXk8VD4mIHZhbGEsIGdzbGljZSYgZ3MpCnsKICAgc2l6ZV90IG5Sb3dzID0gZ3Muc2l6ZSgpWzBdOwogICBzaXplX3QgbkNvbHMgPSBncy5zaXplKClbMV07CiAgIHZhbGFycmF5PFQ+IHZhcmVzdWx0ID0gdmFsYVtnc107CiAgIHByaW50MmQodmFyZXN1bHQsIG5Sb3dzLCBuQ29scyk7Cn0KCmZsb2F0IE5vcm0oQ29tcGxleF9mIGNmKQp7CiAgIHJldHVybiBjZi5yZWFsKCkgKiBjZi5yZWFsKCkgKyBjZi5pbWFnKCkgKiBjZi5pbWFnKCk7Cn0KCnZvaWQgY29udmVydENvbXBsZXhUb0Zsb2F0MShWQ0ZfdCYgdmFjLCBWRl90JiB2YWYpCnsKICAgZm9yKHNpemVfdCBpPTA7IGk8dmFjLnNpemUoKTsgKytpKQogICB7CiAgICAgIHZhZltpXSA9IE5vcm0odmFjW2ldKTsKICAgfQp9Cgp2b2lkIGNvbnZlcnRDb21wbGV4VG9GbG9hdDIoVkNGX3QmIHZhYywgVkZfdCYgdmFmKQp7CiAgIHN0ZDo6dHJhbnNmb3JtKCZ2YWNbMF0sICZ2YWNbdmFjLnNpemUoKV0sICZ2YWZbMF0sIE5vcm0pOwp9Cgp2b2lkIGNvbnZlcnRDb21wbGV4VG9GbG9hdDMoVkNGX3QgJnZhYywgVkZfdCAmdmFmKQp7CiAgIHN0ZDo6dHJhbnNmb3JtKCZ2YWNbMF0sICZ2YWNbdmFjLnNpemUoKV0sICZ2YWZbMF0sCiAgICAgIHN0YXRpY19jYXN0PGZsb2F0KCopKHN0ZDo6Y29tcGxleDxmbG9hdD4gY29uc3QgJik+KCZzdGQ6Om5vcm08ZmxvYXQ+KSk7Cn0KCnZvaWQgY29udmVydENvbXBsZXhUb0Zsb2F0NChWQ0ZfdCAmdmFjLCBWRl90ICZ2YWYpCnsKICAgVkNGX3Qgbm9ybVZhYyA9IHZhYyAqIHZhYy5hcHBseShjb25qPGZsb2F0Pik7CiAgIHN0ZDo6dHJhbnNmb3JtKCZub3JtVmFjWzBdLCAmbm9ybVZhY1t2YWMuc2l6ZSgpXSwgJnZhZlswXSwKICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQoKikoc3RkOjpjb21wbGV4PGZsb2F0PiBjb25zdCAmKT4oJnN0ZDo6cmVhbDxmbG9hdD4pKTsKfQoKaW50IG1haW4oKQp7CiAgIGNvbnN0IGludCBNPTUsIE49NzsKICAgY29uc3QgQ29tcGxleF9mIHZhY0ZpbGwoMy4wLCA0LjApOwogICBWQ0ZfdCB2YWModmFjRmlsbCwgTSpOKTsKCiAgIGdzbGljZSBnc09yaWcgPSBnc2xpY2UyRFNldCgwLCBNLE4sIE4sMSk7CiAgIGdzbGljZSBncyA9IGdzbGljZTJEU2V0KDgsIDMsNCwgTiwxKTsKICAgdmFjW2dzXSA9IENvbXBsZXhfZigzMCw0MCk7CgogICBmb28odmFjLCBnc09yaWcpOwogICBmb28odmFjLCBncyk7CgogICBWRl90IHZhZihNKk4pOwogICBncyA9IGdzbGljZTJEU2V0KDksIDMsNCwgTiwxKTsKICAgZm9vKHZhYywgZ3MpOwoKICAgdmFmID0gMS4wOwpjb3V0IDw8ICJ2LjEiIDw8IGVuZGw7CiAgIGNvbnZlcnRDb21wbGV4VG9GbG9hdDEodmFjLCB2YWYpOwogICBmb28odmFmLCBnc09yaWcpOwoKICAgdmFmID0gMS4wOwpjb3V0IDw8ICJ2LjIiIDw8IGVuZGw7CiAgIGNvbnZlcnRDb21wbGV4VG9GbG9hdDIodmFjLCB2YWYpOwogICBmb28odmFmLCBnc09yaWcpOwoKICAgdmFmID0gMS4wOwpjb3V0IDw8ICJ2LjMiIDw8IGVuZGw7CiAgIGNvbnZlcnRDb21wbGV4VG9GbG9hdDModmFjLCB2YWYpOwogICBmb28odmFmLCBnc09yaWcpOwoKICAgdmFmID0gMS4wOwpjb3V0IDw8ICJ2LjQiIDw8IGVuZGw7CiAgIGNvbnZlcnRDb21wbGV4VG9GbG9hdDQodmFjLCB2YWYpOwogICBmb28odmFmLCBnc09yaWcpOwoKfQ==