static int PCA( ARMat *input, ARMat *output, ARVec *ev ) { ARMat *u; ARFloat *m1, *m2; int row, clm, min; int i, j; row = input->row; clm = input->clm; min = (clm < row)? clm: row; if( row < 2 || clm < 2 ) return(-1); if( output->clm != input->clm ) return(-1); if( output->row != min ) return(-1); if( ev->clm != min ) return(-1); u = Matrix::alloc( min, min ); if( u->row != min || u->clm != min ) return(-1); if( row < clm ) { if( x_by_xt( input, u ) < 0 ) { Matrix::free(u); return(-1); } } else { if( xt_by_x( input, u ) < 0 ) { Matrix::free(u); return(-1); } } if( QRM( u, ev ) < 0 ) { Matrix::free(u); return(-1); } if( row < clm ) { if( EV_create( input, u, output, ev ) < 0 ) { Matrix::free(u); return(-1); } } else{ m1 = u->m; m2 = output->m; for( i = 0; i < min; i++){ if( ev->v[i] < VZERO ) break; for( j = 0; j < min; j++ ) *(m2++) = *(m1++); } for( ; i < min; i++){ ev->v[i] = 0.0; for( j = 0; j < min; j++ ) *(m2++) = 0.0; } } Matrix::free(u); return( 0 ); }
static int PCA( Mat input, Mat output, Vec ev ) { Mat u; double *m1, *m2; int row, clm, min; int i, j; row = input.row; clm = input.clm; min = (clm < row)? clm: row; if( row < 2 || clm < 2 ) return(-1); if( output.clm != input.clm ) return(-1); if( output.row != min ) return(-1); if( ev.clm != min ) return(-1); u = matrixAlloc( min, min ); if( u.row != min || u.clm != min ) return(-1); if( row < clm ) { if( x_by_xt( input, u ) < 0 ) { matrixFree(u); return(-1); } } else { if( xt_by_x( input, u ) < 0 ) { matrixFree(u); return(-1); } } if( QRM( u, ev ) < 0 ) { matrixFree(u); return(-1); } if( row < clm ) { if( EV_create( input, u, output, ev ) < 0 ) { matrixFree(u); return(-1); } } else{ m1 = u.m; m2 = output.m; for( i = 0; i < min; i++){ if( ev.v[i] < VZERO ) break; for( j = 0; j < min; j++ ) *(m2++) = *(m1++); } for( ; i < min; i++){ ev.v[i] = 0.0; for( j = 0; j < min; j++ ) *(m2++) = 0.0; } } matrixFree(u); return( 0 ); }