Пример #1
0
void    PackedVlatCluster::add(const float* feature,size_t dim)
{
    size_t meanDim = getTensorDim(1);
    if (dim != meanDim)
        retinThrowException2("Invalid feature dim %d != %d",dim,meanDim);
    
    vector<double> temp(meanDim);
    const float* mean = getMeanTensor(1);
    if (mean) {
        for (size_t i=0;i<dim;i++)
            temp[i] = feature[i] - mean[i];
    }
    else {
        for (size_t i=0;i<dim;i++)
            temp[i] = feature[i];
    }

    pca.add(&temp[0],dim);
}
Пример #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++;
    }