1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
static void pcamat( const matrix<double> vectors, const int numOfIC,
int firstEig, int lastEig, matrix<double> &Es, vector<double> &Ds ) {
matrix<double> Et;
matrix<double> Dt;
double lowerLimitValue = 0.0;
double higherLimitValue = 0.0;
int oldDimension = vectors.size1();
matrix<double> covarianceMatrix = cov( trans(vectors), 0 );
performPCA( covarianceMatrix, Dt, Et );
std::cout << Dt << Et << std::endl;
int maxLastEig = 0;
// Compute rank
for ( unsigned i= 0; i< Dt.size1(); i++ ) if ( Dt(i,i) > FICA_TOL )
maxLastEig++;
// Force numOfIC components
if ( maxLastEig > numOfIC ) maxLastEig = numOfIC;
vector<double> eigenvalues = zero_vector<double>( Dt.size1() );
vector<double> eigenvalues2 = zero_vector<double>( Dt.size1() );
eigenvalues2 = diag(Dt);
std::cout << eigenvalues.size() << " " << Dt.size1() << " " << Dt.size2()<< std::endl;
sort( eigenvalues2 );
vector<double> lowerColumns = zero_vector<double>( Dt.size1() );
for ( unsigned i = 0; i < Dt.size1(); i++ )
eigenvalues(i)= eigenvalues2(Dt.size1()-i-1);
if ( lastEig > maxLastEig ) lastEig = maxLastEig;
if ( lastEig < oldDimension )
lowerLimitValue = ( eigenvalues(lastEig-1)+eigenvalues(lastEig) )/2;
else
lowerLimitValue = eigenvalues( oldDimension-1 ) -1;
for ( unsigned i = 0; i< Dt.size1(); i++ )
if ( Dt(i,i) > lowerLimitValue )
lowerColumns(i)= 1;
if ( firstEig > 1 )
higherLimitValue = ( eigenvalues( firstEig-2 ) + eigenvalues( firstEig-1 ) )/2;
else
higherLimitValue = eigenvalues(0)+1;
vector<double> higherColumns = zero_vector<double>( Dt.size1() );
for ( unsigned i= 0; i < Dt.size1(); i++ )
if ( Dt(i,i) < higherLimitValue )
higherColumns(i)= 1;
vector<double> selectedColumns = zero_vector<double>( Dt.size1() );
for ( unsigned i = 0; i < Dt.size1(); i++ )
selectedColumns(i) = (lowerColumns(i)==1 && higherColumns(i)==1) ? 1 : 0;
selcol( Et, selectedColumns, Es );
int numTaken= 0;
for ( unsigned i= 0; i< selectedColumns.size(); i++ )
if ( selectedColumns(i) == 1 )
numTaken++;
Ds = scalar_vector<double>( numTaken, 0 );
numTaken= 0;
for ( unsigned i = 0; i < Dt.size1(); i++ )
if ( selectedColumns(i) == 1) {
Ds( numTaken ) = Dt(i,i);
numTaken++;
}
std::cout << "pcamat fin" << std::endl;
return;
} |
Partager