//the compute distance is undertaken an overhaull. I prefere to compute the probability instead of the //euclidean distance. void CRegionalMetaModel::ComputeDistance( vector< vector<REAL> >& mxInputs, vector<REAL>& vcPtCen, dist_pair_vector& vcDists ) { int rows = mxInputs.size(); int cols = mxInputs.front().size(); /*compute the center of the hyperecllipsoid*/ vector<REAL> center(cols, 0.0); for( vector< vector<REAL> >::iterator iter=mxInputs.begin(); iter!=mxInputs.end(); iter++ ) transform( center.begin(), center.end(), iter->begin(), center.begin(), plus<REAL>() ); transform( center.begin(), center.end(), center.begin(), bind2nd(divides<REAL>(), rows) ); /*compute the standard deviation of the columns*/ //compute sum( (x-u)*(x-u) ) for each column vector<REAL> stds(cols, 0.0); for( int i=0; i<rows; i++ ) for( int j=0; j<cols; j++ )stds[j] += sqr( center[j] - mxInputs[i][j] ); //using compose function operator to do "sqrt( sum/N-1 )" transform( stds.begin(), stds.end(), stds.begin(), compose_f_gx( ptr_fun(sqrt), bind2nd(divides<double>(), rows-1) ) ); /* compute the radius */ REAL alpha = 1.5; vector<REAL> radius(cols); transform( stds.begin(), stds.end(), radius.begin(), bind2nd(multiplies<REAL>(), alpha) ); for( i=0; i<cols; i++ )if( radius[i]<=0.0001 )radius[i]=0.0001; /* compute the distance for each point */ vector<REAL> radius_sqr(cols); transform( radius.begin(), radius.end(), radius.begin(), radius_sqr.begin(), multiplies<REAL>() ); for( i=0; i<rows; i++ ){ vector<REAL> temp(cols); transform( mxInputs[i].begin(), mxInputs[i].end(), center.begin(), temp.begin(), diff_sqr<REAL>() ); REAL distance = inner_product( temp.begin(), temp.end(), radius_sqr.begin(), 0.0, plus<REAL>(), divides<REAL>() ); vcDists.push_back( dist_pair(i, distance) ); } sort( vcDists.begin(), vcDists.end(), op_dist_less() ); }
std::ostream& operator<<(std::ostream&o,const String& s) { std::string stds(s.c_str()); o<<stds; return o; }