예제 #1
0
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 );
}
예제 #2
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 );
}