예제 #1
0
int matrix_eigMaxSym_float (float* l,float* v,float* M,size_t n){
    size_t i,k;
    float r;
    float* y = (float*)malloc(n*sizeof(float));
    *l = 1;
    for (i=0;i<n;i++)
            v[i] = 1.0/sqrt(n);
    for (k=0;k<500;k++)
    {
        /* y = A'*v */
        for (i=0;i<n;i++)
        {
            y[i] = vector_ps_float (v, &M[i*n], n);
        }
        /* l = v'*y */
        *l = vector_ps_float (v, y, n);
        if (fabs(*l) < 1E-7) {
            free (y);
            return 0;
        }
        /* r = ||y - t*v||^2 */
        vector_linear_float (v,y,-(*l),v,n);
        r = vector_ps_float (v, v, n);
        r = fabs(r/(*l));
        /*printf ("l=%f,r=%e\n",*l,r); */
        if (r < 1E-14){
            vector_cpym_float (v, 1.0/vector_n2_float (y, n), y, n);
            break;
        }
        /* r = ||y||^2 */
        r = vector_n2p2_float (y, n);
        if (r < 1E-7) {
            free (y);
            return 0;
        }
        /* v = y/sqrt(r) */
        r = 1.0/sqrt(r);
        vector_cpym_float (v, r, y, n);
    }
    /* cherche la plus grande valeur de v; */
    /* si elle est negative, inverse v; */
    r = -1;
    for (i=0;i<n;i++)
        if (v[i]<r)
            r = v[i];

    if (r < 0)
    {
        for (i=0;i<n;i++)
            v[i] = -v[i];
    }
    free (y);
    return 1;
}
예제 #2
0
    void SparseVlatCluster::add(const float* feature, size_t featureDim){
        size_t meanDim = getTensorDim(1);
        if (featureDim != meanDim)
            retinThrowException2("Invalid feature dim %d != %d", featureDim, meanDim);

        vector<float> featureCentred(meanDim);
        const float* mean = getMeanTensor(1);
        if (mean)
            vector_linear_float(&featureCentred[0], feature, -1, mean, meanDim);
        else
            memcpy(&featureCentred[0],feature,meanDim*sizeof(float));
        
        vector<float> featureDual(meanDim);
        matrix_CpAtB_float(&featureDual[0], &U[0], &featureCentred[0], meanDim, meanDim, 1);
        
        if(mainOrder == 1 || sparsityOn == SparseVlatCluster::sparsityOnDiag){
            for(size_t i = 0 ; i < meanDim ; i++)
                varDual[i] += featureDual[i]*featureDual[i];
        }
        else if(sparsityOn == SparseVlatCluster::sparsityOnFull){
            vector<float> temp(meanDim*meanDim);
            matrix_Cpaat_float(&temp[0], &featureDual[0], meanDim);
            for(size_t i = 0 ; i < meanDim*meanDim ; i++)
                temp[i] *= temp[i];
            vector_add_float (&varDual[0], &featureDual[0], meanDim*meanDim);
        }
        
        vector<pair<size_t, float> > sortTable;
        
        if (mainOrder == 1) {
            if(sparsityOn == sparsityMaxValues){
                sortTable.resize(meanDim);
                for(size_t i = 0 ; i < meanDim ; i++){
                        sortTable[i].first = i;
                        sortTable[i].second = featureDual[i];
                }
                sort(sortTable.begin(), sortTable.end(), myfunction);
                for(size_t i = sparsityDim ; i < meanDim ; i++){
                        featureDual[sortTable[i].first] = 0;
                }
            }
            vector_add_float (&vlat[0], &featureDual[0], meanDim);
        }
        else if (mainOrder == 2) {
            if(sparsityOn == sparsityMaxValues){
                vector<float> temp(meanDim*meanDim);
                memset(&temp[0],0,meanDim*meanDim*sizeof(float));
                matrix_Cpaat_float(&temp[0], &featureDual[0], meanDim);
                sortTable.resize(meanDim*meanDim);
                for(size_t i = 0 ; i < meanDim*meanDim ; i++){
                        sortTable[i].first = i;
                        sortTable[i].second = temp[i];
                }
                sort(sortTable.begin(), sortTable.end(), myfunction);
                for(size_t i = sparsityDim ; i < meanDim*meanDim ; i++){
                        temp[sortTable[i].first] = 0;
                }
                vector_add_float (&vlat[0], &temp[0], meanDim*meanDim);
            }
            else
                matrix_Cpaat_float(&vlat[0], &featureDual[0], meanDim);
        }
        counter++;
    }