void randvec_gaussian(float* v, MatrixFloat& mu, MatrixFloat& sigma) { // if(_randvec_gaussian_tmp.width != mu.width) // _randvec_gaussian_tmp.realloc(mu.width, 1); randvec_gaussian(_randvec_gaussian_tmp, mu.width); for(int i=0; i<mu.width; i++) v[i] = mu[i]; matrix_CpAtB_float(v, sigma, _randvec_gaussian_tmp, sigma.width, sigma.width, 1); }
Matrix Matrix::gram() { Matrix g(height,height); g = 0; matrix_CpAtB_float(g.data, data, data, height, width, height); return g; }
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++; }