⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vectorn.cpp

📁 basic mathematic classes used for math programming
💻 CPP
字号:
#include "mathclass.h"vectorN::vectorN(const vectorN& a){

	n=on=0;
	setExactSize( a.size());

    for( int i=0; i<a.size(); i++ )
        v[i] = a.getValue(i);

//	on=n=a.n; 
  

}
vectorN::vectorN(){	on = n = 0;
	v=NULL;}vectorN::vectorN( int x ){    on = n = x;    if ( on>0 ) v = new m_real[n];}vectorN::vectorN( int x, m_real *a ){    on = n = x;    v = new m_real[n];	for( int i=0; i<n; i++ )		v[i] = a[i];}vectorN::~vectorN(){    if ( on>0 ) delete [] v;}voidvectorN::setValue( m_real *d ){	for( int i=0; i<n; i++ )		v[i] = d[i];}voidvectorN::getValue( m_real *d ){	for( int i=0; i<n; i++ )		d[i] = v[i];}voidvectorN::setSize( int x ){	if ( on<x )	{		if ( on>0 ) delete[] v;		v = new m_real[x];
		assert(v!=NULL);		on = x;	}	n = x;

	for(int i=0;i<on;i++){
	
		v[i] = 0;
	}}
void vectorN::setExactSize(int x)
{
	
	if(on!=x){
		if ( on>0 ) delete[] v;
		v = new m_real[x];
		assert(v!=NULL);
		on = x;
		n = x;
	}

	n=x;
	for(int i=0;i<n;i++){
	
		v[i] = 0;
	}
}


void      
vectorN::exchange( int i, int j){

	assert(i<n);
	assert(j<n);

	m_real tmp;
	tmp = v[i];
	v[i] = v[j];
	v[j] = tmp;

}vectorN&vectorN::operator=(const  vectorN& a ){ 
	    setExactSize( a.size() );    for( int i=0; i<a.size(); i++ )        v[i] = a.getValue(i);    return (*this);}vectorN&vectorN::assign( const vectorN& a ){    vectorN &c = (*this);    c.setSize( a.size() );    for( int i=0; i<c.size(); i++ )        c[i] = a.getValue(i);    return c;}vectorN&vectorN::negate(){    vectorN &c = (*this);    for( int i=0; i<c.size(); i++ )        c[i] = -c.getValue(i);    return c;}vectorN&vectorN::add(const vectorN& a, const vectorN& b ){    vectorN &c = (*this);    assert( a.size()==b.size() );    c.setSize( a.size() );    for( int i=0; i<a.size(); i++ )        c[i] = a.getValue(i) + b.getValue(i);    return c;}vectorN&vectorN::operator+=(const  vectorN& a ){    vectorN &c = (*this);    assert( c.size()==a.size() );    for( int i=0; i<c.size(); i++ )        c[i] += a.getValue(i);    return c;}vectorN&vectorN::sub(const  vectorN& a, const vectorN& b ){    vectorN &c = (*this);    assert( a.size()==b.size() );    c.setSize( a.size() );    for( int i=0; i<a.size(); i++ )        c[i] = a.getValue(i) - b.getValue(i);    return c;}vectorN&vectorN::operator-=(const vectorN& a ){    vectorN &c = (*this);    assert( c.size()==a.size() );    for( int i=0; i<a.size(); i++ )        c[i] -= a.getValue(i);    return c;}
vectorN   
operator*(const m_real& a, const vectorN& b){
//operator*(const m_real& a,const vectorN& b){

		//assert( a.size()==b.size() );

    vectorN c;
	c.setSize(b.size()); 
    for( int i=0; i<b.size(); i++ )
        c.v[i] = a*b.getValue(i);
    return c;

}

vectorN   
operator/(const vectorN& b,const m_real& a){

		//assert( a.size()==b.size() );

    vectorN c;
	c.setSize(b.size()); 
    for( int i=0; i<b.size(); i++ )
        c[i] = b.getValue(i)/a;
    return c;

}


vectorN  
operator-(const vectorN& a, const vectorN& b)
{
	assert( a.size()==b.size() );

    vectorN c;
	c.setSize(a.size()); 
    for( int i=0; i<a.size(); i++ )
        c[i] = a.getValue(i)-b.getValue(i);
    return c;

}
m_realoperator%(const vectorN& a, const vectorN& b ){    assert( a.size()==b.size() );    m_real c=0;    for( int i=0; i<a.size(); i++ )        c += a.getValue(i) * b.getValue(i);    return c;}vectorN&vectorN::mult(const vectorN& b, m_real a ){    vectorN &c = (*this);    c.setSize( b.size() );    for( int i=0; i<c.size(); i++ )        c[i] = b[i]*a;    return c;}vectorN&vectorN::operator*=( m_real a ){    vectorN &c = (*this);    for( int i=0; i<c.size(); i++ )        c[i] *= a;    return c;}vectorN&vectorN::div(const vectorN& b, m_real a ){    vectorN &c = (*this);    c.setSize( b.size() );    for( int i=0; i<c.size(); i++ )        c[i] = b[i]/a;    return c;}vectorN&vectorN::operator/=( m_real a ){    vectorN &c = (*this);    for( int i=0; i<c.size(); i++ )        c[i] /= a;    return c;}vectorN&vectorN::mult(const matrixN& a, const vectorN& b ){    vectorN &c = (*this);    assert( a.column()==b.size() );    c.setSize( a.row() );    for( int i=0; i<a.row(); i++ )    {        c[i] = 0;        for( int k=0; k<b.size(); k++ )            c[i] += a[i][k] * b[k];    }    return c;}vectorN&vectorN::mult(const vectorN& b, const matrixN& a ){    vectorN &c = (*this);    assert( a.row()==b.size() );    c.setSize( a.column() );    for( int i=0; i<a.column(); i++ )    {        c[i] = 0;        for( int k=0; k<b.size(); k++ )            c[i] += b[k] * a[k][i];    }    return c;}vectorN&vectorN::mult(const smatrixN& a, const vectorN& b ){    vectorN &c = (*this);    assert( a.size()==b.size() );    c.setSize( a.size() );    for (int i=0; i<c.getSize(); i++) c.setValue(i, 0);    for ( i=0; i<c.getSize(); i++ )    {        for (entity* p = a.getRows(i).next; p; p = p->next)        {            // c[i] += a[i][j] * b[j]            // c[j] += a[i][j] * b[i]            c[i] += p->value * b[p->id];            if (i != p->id) c[p->id] += p->value * b[i];        }    }	return c;}vectorN&vectorN::mult(const vectorN& b, const smatrixN& a ){    vectorN &c = (*this);    assert( a.size()==b.size() );    c.setSize( a.size() );    for ( int i=0; i<c.getSize(); i++ ) c.setValue(i, 0);    for ( i=0; i<c.getSize(); i++ )    {        for (entity* p = a.getRows(i).next; p; p = p->next)        {            // c[j] += b[i] * a[i][j]            // c[i] += b[j] * a[i][j]            c[p->id] += b[i] * p->value;            if (i != p->id) c[i] += b[p->id] * p->value;        }    }	return c;}
m_real
vectorN::length2() const
{
	 m_real c=0;
    for( int i=0; i<n; i++ )
        c += this->v[i]*this->v[i];

	return c;

}

m_real    
vectorN::componentSum() const
{
	m_real c=0;
    for( int i=0; i<n; i++ )
        c += this->v[i];
    return c;

}
m_realvectorN::length() const{    m_real c=0;    for( int i=0; i<n; i++ )        c += this->v[i]*this->v[i];    return sqrt(c);}m_realvectorN::len() const{	return this->length();}vectorN&vectorN::normalize(){    vectorN &c = (*this);    m_real l = this->len();    for( int i=0; i<n; i++ )        c[i] = c[i] / l;    return c;}

m_real difference(const vectorN& a,const vectorN& b )
{
	assert( a.getSize()==b.getSize() );

	m_real d = 0.0;
	for( int i=0; i<a.getSize(); i++ )
		d += (a.v[i] - b.v[i]) * (a.v[i] - b.v[i]);

	return d;
}ostream& operator<<( ostream& os, const vectorN& a ){    os << "( ";    for( int i=0; i< a.size()-1; i++ )        os << a.v[i] << " , ";    os << a.v[a.size()-1] << " )";    return os;}istream& operator>>( istream& is, vectorN& a ){
	static char	buf[256];    //is >> "(";
	is >> buf;    for( int i=0; i< a.size()-1; i++ )
	{		//is >> a.v[i] >> ",";
		is >> a.v[i] >> buf;
	}	//is >> a.v[a.size()-1] >> ")";
	is >> a.v[a.size()-1] >> buf;    return is;}vectorN&vectorN::solve(const matrixN& a, const vectorN& b, int num, m_real tolerance, m_real damp ){    vectorN &c = (*this);    assert( a.row()==a.column() );    assert( a.row()==b.size() );    c.setSize( b.size() );    int flag = TRUE;    for( int i=0; i<num && flag; i++ )    {        flag = FALSE;        for( int j=0; j<a.row(); j++ )        {            m_real r = b[j] - a[j]%c;            c[j] += damp*r/a[j][j];            if ( r>tolerance ) flag = TRUE;        }    }    return c;}vectorN&vectorN::solve( const matrixN& a, const vectorN& b ){    vectorN &c = (*this);    assert( a.row()==a.column() );    assert( a.row()==b.size() );	int n = b.size();    c.setSize( n );	c.assign( b );	static matrixN mat; mat.setSize( n, n );	mat.assign( a );	static int* index;
	static int index_count = 0;
	if ( index_count<n )
	{
		if ( index_count>0 ) delete[] index;
		index_count = n;
		if ( index_count>0 ) index = new int[index_count];
	}
	mat.LUdecompose( index );	mat.LUsubstitute( index, c );	return c;}vectorN&vectorN::solve(const matrixN& a, const vectorN& b, m_real tolerance ){	int m = a.row();	int n = a.column();	assert( m >= n );	assert( b.size()==m );    vectorN &c = (*this);    c.setSize( n );	static matrixN u; u.setSize( m, n );	static vectorN w; w.setSize( n );	static matrixN v; v.setSize( n, n );	u.assign( a );	u.SVdecompose( w, v );	int i, j;	m_real s;	static vectorN tmp; tmp.setSize( n );	m_real wmax = 0.0f;	for( j=0; j<n; j++ )		if ( w[j] > wmax ) wmax = w[j];	for( j=0; j<n; j++ )		if ( w[j] < wmax * tolerance ) w[j] = 0.0f;	for( j=0; j<n; j++ )	{		s = 0.0f;		if ( w[j] )		{			for( i=0; i<m; i++ )				s += u[i][j] * b[i];			s /= w[j];		}		tmp[j] = s;	}	for ( j=0; j<n; j++ )	{		s = 0.0;		for ( i=0; i<n; i++ )			s += v[j][i] * tmp[i];		c[j] = s;	}	return c;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -