예제 #1
0
파일: cv.c 프로젝트: BrownRiceRice/amino
AA_API void aa_cv_rgb2hsv(const double rgb[3], double hsv[3]) {
    double r = rgb[0];
    double g = rgb[1];
    double b = rgb[2];

    // using the polar coordinates method (not hexagon)
    double alpha = 0.5 * (2*r - g - b);
    double beta = (sqrt(3) / 2.0) * (g - b);
    double c = sqrt(alpha*alpha + beta*beta);

    // H
    hsv[0] = atan2(beta, alpha);

    // V
    double tmp = AA_MAX(r,g);
    hsv[2] = AA_MAX(tmp,b);

    // S
    if( aa_feq(c,0,0) ) {
        hsv[1] = 0;
    } else {
        hsv[1] = c / hsv[2];
    }

}
예제 #2
0
파일: la.c 프로젝트: BrownRiceRice/amino
/// Deadzone Damped Pseudoinverse
void aa_la_dzdpinv( size_t m, size_t n, double s2_min, const double *A, double *A_star ) {
    // A^T (AA^T + kI)^{-1}
    // A is m*n
    // x = Aq, x is m, q is n

    const int mi = (int)m;
    const int ni = (int)n;

    // This method uses the SVD
    double *W = (double*)aa_mem_region_local_alloc( sizeof(double) *
                                                (m*m + n*n + AA_MIN(m,n)) );
    double *U = W;        // size m*m
    double *Vt = U + m*m; // size n*n
    double *S = Vt + n*n; // size min(m,n)

    // A = U S V^T
    aa_la_svd(m,n,A,U,S,Vt);

    memset( A_star, 0, sizeof(double)*m*n );
    // \sum s_i/(s_i**2+k) * v_i * u_i^T
    for( size_t i = 0; i < AA_MIN(m,n); i ++ ) {
        double s2 = AA_MAX( (S[i]*S[i]), s2_min );
        cblas_dger( CblasColMajor, ni, mi, S[i] / s2,
                Vt + i, ni,
                U + m*i, 1,
                A_star, ni
                );
    }
    aa_mem_region_local_pop( W );
}
예제 #3
0
파일: io.c 프로젝트: BrownRiceRice/amino
AA_API ssize_t aa_read_realloc(int fd, void **buf,
                           size_t off, size_t *max) {
    size_t n = *max - off;
    if( n < 16 ) {
        *max = AA_MAX( 2*(*max), (size_t)16 );
        *buf = realloc(*buf, *max);
        n = *max - off;
    }
    return read( fd, ((uint8_t*)*buf)+off, n );
}
예제 #4
0
파일: mem.c 프로젝트: kingdwd/amino
static void aa_mem_region_grow( aa_mem_region_t *reg, size_t size ) {
    size_t nsize = AA_MAX(2*(size_t)(reg->node->end - reg->node->d),
                          size + AA_MEMREG_ALIGN);
    // this growth strategy creates worst-case O(n) memory waste
    reg->node =
        aa_mem_region_node_alloc( nsize,
                              /* free unused chunk */
                              (aa_mem_region_alignptr(reg->node->d) == reg->head) ?
                              aa_mem_region_node_free(reg->node) : reg->node );
    aa_mem_region_align(reg, reg->node->d);
    assert( aa_mem_region_freesize(reg) >= size );
    assert( ! ((uintptr_t)reg->head%16) );
}
예제 #5
0
파일: mem.c 프로젝트: kingdwd/amino
void aa_mem_pool_init( aa_mem_pool_t *pool, size_t size, size_t count ) {
    pool->size = AA_MAX(size,(size_t)16);
    pool->top = NULL;
    aa_mem_region_init( &pool->region, pool->size * count );
}
예제 #6
0
파일: la.c 프로젝트: BrownRiceRice/amino
double aa_la_max( size_t n, const double *x ) {
    double v = -HUGE_VAL;
    for( size_t i = 0; i < n; i++ )
        v = AA_MAX(v,x[i]);
    return v;
}