int arMatrixPCA2( ARMat *input, ARMat *evec, ARVec *ev ) { ARMat *work; /* ARdouble srow; */ ARdouble sum; int row, clm; int check, rval; int i; row = input->row; clm = input->clm; check = (row < clm)? row: clm; if( row < 2 || clm < 2 ) return(-1); if( evec->clm != input->clm || evec->row != check ) return(-1); if( ev->clm != check ) return(-1); work = arMatrixAllocDup( input ); if( work == NULL ) return -1; /* srow = sqrt((ARdouble)row); for(i=0; i<row*clm; i++) work->m[i] /= srow; */ rval = PCA( work, evec, ev ); arMatrixFree( work ); sum = 0.0; for( i = 0; i < ev->clm; i++ ) sum += ev->v[i]; for( i = 0; i < ev->clm; i++ ) ev->v[i] /= sum; return( rval ); }
int arMatrixPCA( ARMat *input, ARMat *evec, ARVec *ev, ARVec *mean ) { ARMat *work; double srow, sum; int row, clm; int check, rval; int i; row = input->row; clm = input->clm; check = (row < clm)? row: clm; if( row < 2 || clm < 2 ) return(-1); if( evec->clm != input->clm || evec->row != check ) return(-1); if( ev->clm != check ) return(-1); if( mean->clm != input->clm ) return(-1); work = arMatrixAllocDup( input ); if( work == NULL ) return -1; srow = sqrt((double)row); if( EX( work, mean ) < 0 ) { arMatrixFree( work ); return(-1); } if( CENTER( work, mean ) < 0 ) { arMatrixFree( work ); return(-1); } for(i=0; i<row*clm; i++) work->m[i] /= srow; rval = PCA( work, evec, ev ); arMatrixFree( work ); sum = 0.0; for( i = 0; i < ev->clm; i++ ) sum += ev->v[i]; for( i = 0; i < ev->clm; i++ ) ev->v[i] /= sum; return( rval ); }