45 std::max(
int(selectedPoints.size()), 1), data->getSizeT(), 1, 1,
46 carto::AllocatorContext::fast() );
48 std::list< Point3d >::const_iterator iter( selectedPoints.begin() ), last( selectedPoints.end() ) ;
51 for(
int t = 0 ; t < data->getSizeT() ; ++t )
52 individuals( i, t ) = data->
at( (*iter)[0], (*iter)[1], (*iter)[2], t ) ;
65 int nbFrame = individuals->getSizeY();
68 individuals->getSizeX(), individuals->getSizeY(), 1, 1,
69 carto::AllocatorContext::fast() );
73 _mean = std::vector<float>(individuals->getSizeY(), 0.) ;
74 _var = std::vector<float>(individuals->getSizeY(), 0.) ;
76 for(
int ind = 0 ; ind < individuals->getSizeX() ; ++ind )
77 for(
int t = 0 ; t < individuals->getSizeY() ; ++t )
79 val = individuals->at( ind, t ) ;
81 _var[t] += val * val ;
86 for(
int t = 0 ; t < nbFrame ; ++t )
91 for(
int ind = 0 ; ind < centeredIndivMatrix->
getSizeX() ; ++ind )
93 centeredIndivMatrix( ind, t ) = individuals->
at( ind, t ) ;
96 centeredIndivMatrix( ind, t ) -=
_mean[t] ;
100 centeredIndivMatrix( ind, t ) /=
_var[t] ;
111 carto::AllocatorContext::fast() );
116 for( y1=0; y1<dy1; ++y1 )
117 for( x1=0; x1<dx1; ++x1 )
119 for(
int k=0; k < centeredIndivMatrix->
getSizeX() ;++k)
121 += centeredIndivMatrix(k, x1) * centeredIndivMatrix(k, y1);
122 matVarCov(x1, y1) /= centeredIndivMatrix->
getSizeX() - 1;
124 std::cerr <<
"var cov filled" << std::endl ;
136 std::cerr <<
"doing svd !" << std::endl ;
138 std::cerr <<
"svd done !" << std::endl ;
143 svd.
sort(matVarCov, eigenVal) ;
154 for(
int t = 0 ; t < matVarCov->
getSizeX() ; ++t )
161 catch( std::exception &e )
164 if( individuals->getSizeX() > 0 && individuals->getSizeY() > 0
165 && individuals->getSizeZ() > 0 )
167 std::cerr <<
"invalid pca" << std::endl ;
171 std::cout <<
"empty indiv matrix" << std::endl ;
carto::VolumeRef< float > _eigenVectors
std::vector< float > _mean
std::vector< float > _var
void doIt(const carto::rc_ptr< carto::Volume< T > > &individuals)
std::vector< float > _eigenValues
void sort(carto::VolumeRef< T > &, carto::VolumeRef< T > &, carto::VolumeRef< T > *v=NULL)
sort the U and V matrices and the W vector in decreasing order
carto::VolumeRef< T > doit(carto::VolumeRef< T > &, carto::VolumeRef< T > *v=NULL)
Singular Value Decomposition.
void setReturnType(SVDReturnType rt)
const T & at(long x, long y=0, long z=0, long t=0) const
float max(float x, float y)