int FeatureSet::Normalize(Feature& feature) { double squareLength = 0; for (map<int, double>::iterator it = feature.begin(); it != feature.end(); it++) { squareLength += (it->second) * (it->second); } double length = sqrt(squareLength); for (map<int, double>::iterator it = feature.begin(); it != feature.end(); it++) { it->second /= length; } return 0; }
void ObjectClassificator::addFeature(Feature& feature) { newObject(feature); for (FeatureMap::const_iterator i = feature.begin(); i != feature.end(); ++i) { addFeature(i->first, i->second); } }
int FeatureSet::SaveFeature(Feature& feature, const char* const fileName) { FILE* outFile = fopen(fileName, "wb"); int rtn = Write(outFile, (int)feature.size()); CHECK_RTN(rtn); for (Feature::iterator it = feature.begin(); it != feature.end(); ++it) { rtn = Write(outFile, it->first); CHECK_RTN(rtn); rtn = Write(outFile, it->second); CHECK_RTN(rtn); } fclose(outFile); return 0; }
// Z = XY; X:n1*d1 Y:d1*K void matrix_mul( double** Z, vector<Feature*>* X, double* Y, int K){ Feature* fea; Feature::iterator it; #pragma omp parallel for for(int i=0;i<X->size();i++){ fea = X->at(i); for(int k=0;k<K;k++) Z[i][k] = 0.0; for(it=fea->begin();it!=fea->end();it++){ for(int k=0;k<K;k++) Z[i][k] += it->second* Y[it->first*K + k]; } } }