Example #1
0
//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() );
}
Example #2
0
std::ostream& operator<<(std::ostream&o,const String& s)
{
	std::string stds(s.c_str());
	o<<stds;
	return o;
}