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

📄 smatrixn.cpp

📁 basic mathematic classes used for math programming
💻 CPP
字号:
//// Sparse Matrix:	Aug 11, 1998//#include "mathclass.h"//################################################################################################voidsmatrixN::allocate(int N){	n = N;	nnze = 0;	rows = new entity[n];	for (int i = 0; i < n; i++)	{		rows[i].id = HEAD_ENTITY;		rows[i].value = MEANINGLESS;		rows[i].next = NULL;	}}voidsmatrixN::deallocate(){	// deallocate memories for every non-zero entities	entity*	curr;	entity*	next;	for (int i = 0; i < n; i++)	{		next = rows[i].next;		while (next)		{			curr = next;			next = curr->next;			delete	curr;		}	}	delete []	rows;	rows = NULL; n = nnze = 0;}m_realsmatrixN::setValue(int row, int col, m_real value, entity** e){	assert(0 <= row && row < n);	assert(0 <= col && col < n);	if (row > col)	{ int tmp = row; row = col; col = tmp; }	// find A(row,col) entity	for (entity* p = &rows[row]; p; p = p->next)	{		if (p->id == col)		{			m_real	old = p->value;			p->value = value;			if (e)	*e = p;			return	old;		}		else if (!p->next || p->next->id > col)		{			nnze++;			entity*	tmp = new entity;			tmp->id = col;			tmp->value = value;			tmp->next = p->next;			p->next = tmp;			if (e)	*e = tmp;			return	0;		}	}	return	0;}m_realsmatrixN::getValue(int row, int col) const{	assert(0 <= row && row < n);	assert(0 <= col && col < n);	if (row > col)	{ int tmp = row; row = col; col = tmp; }	// find A(row,col) entity	for (entity* p = rows[row].next; p; p = p->next)		if (p->id == col)	return	p->value;	// A(row,col) entity is zero	return	0;}m_realsmatrixN::add(int row, int col, m_real increment){	entity*	e;	m_real	old;		old = setValue(row, col, 0, &e);	e->value = old + increment;	return	(old + increment);}m_realsmatrixN::sub(int row, int col, m_real decrement){	entity*	e;	m_real	old;	old = setValue(row, col, 0, &e);	e->value = old - decrement;	return	(old - decrement);}ostream&operator<<(ostream& os, smatrixN& A){	os << A.n << " x " << A.n << " ";	os << A.nnze << " non-zero sparse matrix " << endl;	for (int i = 0; i < A.n; i++)	for (entity* p = A.rows[i].next; p; p = p->next)		os << " [ " << i << " , " << p->id << " ] = " << p->value << endl;	os << endl;	return	os;}istream&operator>>(istream& is, smatrixN& A){
	static char	buf[256];
	int	nrow, ncol, nnze;//	is >> nrow >> "x" >> ncol;
	is >> nrow >> buf >> ncol;//	is >> nnze >> "non-zero" >> "sparse" >> "matrix";
	is >> nnze >> buf >> "sparse" >> buf;	assert(nrow == ncol);	int	n = nrow;	A.deallocate();	A.allocate(n);	int		row, col;	m_real	value;	for (int i = 0; i < nnze; i++)	{		//is >> "[" >> row >> "," >> col >> "]" >> "=" >> value;
		is >> buf >> row >> buf >> col >> buf >> buf >> value;		if (fabs(value) > EPS)	A.setValue(row, col, value);	}	return	is;}
//################################################################################################

SparseMatrixN::SparseMatrixN(){

	n = 0;
	nnze = 0;
    rows = NULL;


}

void 
SparseMatrixN::setSize(int n){

	deallocate();
	allocate(n);
}

void
SparseMatrixN::allocate(int N)
{
	
	if(rows!=NULL) deallocate();

	n = N;

	nnze = 0;

	rows = new entity[n];
	for (int i = 0; i < n; i++)
	{
		rows[i].id = HEAD_ENTITY;
		rows[i].value = MEANINGLESS;
		rows[i].next = NULL;
	}
}

int     
SparseMatrixN::getColNum(int row){

  int colnum;
  colnum = 0;
  assert(0 <= row && row< n);

  for (entity* p = rows[row].next; p; p = p->next){
		
		colnum++; 

  }

  return colnum;


}

int  
SparseMatrixN::deleteSmallValEntity(int row,m_real valthres){

	assert(0 <= row && row < n);

	int delnum;
	delnum = 0;

	entity * delitem= NULL;
	entity * pre;
	pre = &rows[row];
	entity* p = rows[row].next;
	while(p){

		if(p->value<valthres){
		
			delitem = p;
			pre->next = p->next;
			p = p->next;

			delnum++;

			delete delitem;

		}else{

			pre = p;
			p = p->next;
		}
		
	}

	return delnum;

}
m_real  
SparseMatrixN::deleteEntity(int row, int col){

	assert(0 <= row && row < n);
	assert(0 <= col && col < n);

	entity * delitem= NULL;
	entity * pre;
	pre = &rows[row];
	for (entity* p = rows[row].next; p; p = p->next){
		
		if (p->id == col){

			delitem = p;
			pre->next = p->next;
			nnze--;
			break;
		}else{

			if(p->id<col){

				pre = p;
			}else{

				break;
			}
		}

	}

	if(delitem != NULL){

		m_real val ;
		val = delitem->value; 
		delete delitem;
		return val;

	}else{

		return 0;
	}
}

m_real  
SparseMatrixN::sumRow(int row){

	assert(0 <= row && row < n);

	m_real sumval = 0;

	for (entity* p = rows[row].next; p; p = p->next){
		
		sumval = sumval + p->value; 

	}

	return sumval;

}
int  
SparseMatrixN::multiplyRow(int row, m_real val){

	assert(0 <= row && row < n);

	int colsum=0;

	for (entity* p = rows[row].next; p; p = p->next){
		
		p->value =  p->value*val ; 
        colsum ++;
	}

	return colsum;
}


void
SparseMatrixN::deallocate()
{
	// deallocate memories for every non-zero entities
	entity*	curr;
	entity*	next;
	for (int i = 0; i < n; i++)
	{
		next = rows[i].next;
		while (next)
		{
			curr = next;
			next = curr->next;
			delete	curr;
		}
	}
	delete []	rows;

	rows = NULL; n = nnze = 0;
}

m_real
SparseMatrixN::setValue(int row, int col, m_real value, entity** e)
{
	assert(0 <= row && row < n);
	assert(0 <= col && col < n);

	//if (row > col)	{ int tmp = row; row = col; col = tmp; }

	// find A(row,col) entity
	for (entity* p = &rows[row]; p; p = p->next)
	{
		if (p->id == col)
		{
			m_real	old = p->value;
			p->value = value;
			if (e)	*e = p;

			return	old;
		}
		else if (!p->next || p->next->id > col)
		{
			nnze++;

			entity*	tmp = new entity;
			tmp->id = col;
			tmp->value = value;
			tmp->next = p->next;
			p->next = tmp;
			if (e)	*e = tmp;

			return	0;
		}
	}

	return	0;
}


bool  
SparseMatrixN::isRowEmpty(int row){

	assert(0<=row && row<n);
	entity* p;
	p =  rows[row].next;

	if(p==NULL) return true;
	else return false;
}

m_real
SparseMatrixN::getValue(int row, int col) const
{
	assert(0 <= row && row < n);
	assert(0 <= col && col < n);

//	if (row > col)	{ int tmp = row; row = col; col = tmp; }

	// find A(row,col) entity
	for (entity* p = rows[row].next; p; p = p->next)
		if (p->id == col)	return	p->value;

	// A(row,col) entity is zero
	return	0;
}

m_real
SparseMatrixN::add(int row, int col, m_real increment)
{
	entity*	e;
	m_real	old;
	
	old = setValue(row, col, 0, &e);
	e->value = old + increment;

	return	(old + increment);
}

m_real
SparseMatrixN::sub(int row, int col, m_real decrement)
{
	entity*	e;
	m_real	old;

	old = setValue(row, col, 0, &e);
	e->value = old - decrement;

	return	(old - decrement);
}

ostream&
operator<<(ostream& os, SparseMatrixN& A)
{
	os << A.n << " x " << A.n << " ";
	os << A.nnze << " non-zero sparse matrix " << endl;

	for (int i = 0; i < A.n; i++)
	for (entity* p = A.rows[i].next; p; p = p->next)
		os << " [ " << i << " , " << p->id << " ] = " << p->value << endl;
	os << endl;

	return	os;
}

istream&
operator>>(istream& is, SparseMatrixN& A)
{
	static char	buf[256];

	int	nrow, ncol, nnze;

//	is >> nrow >> "x" >> ncol;
	is >> nrow >> buf >> ncol;
//	is >> nnze >> "non-zero" >> "sparse" >> "matrix";
	is >> nnze >> buf >> "sparse" >> buf;

	assert(nrow == ncol);

	int	n = nrow;

	A.deallocate();
	A.allocate(n);

	int		row, col;
	m_real	value;
	for (int i = 0; i < nnze; i++)
	{
		//is >> "[" >> row >> "," >> col >> "]" >> "=" >> value;
		is >> buf >> row >> buf >> col >> buf >> buf >> value;

		if (fabs(value) > EPS)	A.setValue(row, col, value);
	}

	return	is;
}

⌨️ 快捷键说明

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