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