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); }
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++; }