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

📄 cmatrix.cpp

📁 《VC++ 编程技巧与示例 .rar》各个示例代码绝对可用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			pp.setelem(i,j,p(i,j));
		}
		for(j=cp;j<c;j++)
		{
			pp.setelem(i,j,q(i,(j-cp)));
		}
	}

	return pp;
}

//将p矩阵与q矩阵上下合并为一新的矩阵(i.e. P'={p/q}):
CMatrix operator % (CMatrix p,CMatrix q)
{
	unsigned i,j,r,c,rp,rq;
	CMatrix pp;
	if(q.getcols()!=p.getcols())
	{
		AfxMessageBox("%运算错误:列数不同,无法合并两个矩阵!");
		return pp;
	}

	rp=p.getrows();
	rq=q.getrows();
	r =rp+rq;
	c =q.getcols();

	pp.setvalue(r,c);

	for(i=0;i<rp;i++)
	{
		for(j=0;j<c;j++)
		{
			pp.setelem(i,j,p(i,j));
		}
	}
	for(i=rp;i<r;i++)
	{
		for(j=0;j<c;j++)
		{
			pp.setelem(i,j,q((i-rp),j));
		}
	}
	return pp;
}

//除法:
CMatrix operator / (CMatrix p,double q)
{
	unsigned i,j,r,c;
	double t;
	r=p.rows;
	c=p.cols;
	for(i=0;i<r;i++)
	{
		for(j=0;j<c;j++)
		{
			t=p(i,j)/q;
			p.setelem(i,j,t);
		}
	}
	return p;
}

//求转置:
CMatrix operator ~ (CMatrix p)
{
	int i,j,r,c;
	r=p.rows;
	c=p.cols;
	CMatrix Temp(c,r);
	for(i=0;i<c;i++)
	{
		for(j=0;j<r;j++)
		{
			Temp.setelem(i,j,p(j,i));
		}
	}
	return Temp;
}


//求逆矩阵:
CMatrix operator ! (CMatrix p)
{
	if(p.rows!=p.cols)
	{
		AfxMessageBox("求逆矩阵错误:不能进行求逆:cols!=rows");
		return p;
	}
	p.cinv(p.elems,p.rows);
	return p;
}

//减法:
CMatrix operator - (CMatrix p)
{
	unsigned i,j;
	CMatrix t(p.rows,p.cols);
	t=p;
	for(i=0;i<p.rows;i++)
	{
		for(j=0;j<p.cols;j++)
		{
			p.setelem(i,j,-t(i,j));
		}
	}
	return p;
}

int CMatrix::calroot()//求方程组的根;
{
	unsigned i,j,k;
	unsigned * mj;//主元所在行;
	unsigned dlted;
	double p,d;
	mj=new unsigned[rows];
	if(cols!=(rows+1))
	{
		AfxMessageBox("calroot错误:CMatrix:矩阵列数不对!");
		return 0;
	}
	for(i=0;i<(cols-1);i++)
	{
	//找主元:
		d=0.0;
		for(j=0;j<rows;j++)
		{
			dlted=0;
			for(k=0;k<=i;k++)
			{
				if(mj[k]==j)
				{
					dlted=1;
				}
			}
			p=fabs(elems[j*cols+i]);
			if(p>d&&dlted==0) 
			{
				d=p;
				mj[i]=j;
			}
		}
		if(d<(1e-15))
		{
			AfxMessageBox("calrrot错误:矩阵奇异,无法求解!");
			delete [] mj;
			return 0;
		}
	//消元:
		delelem(mj[i],i);
	}

	for(i=0;i<(cols-1);i++)
	{
		for(j=0;j<rows;j++)
		{
			if((fabs(elems[j*cols+i]-1.0)<1e-15)&&j!=i)
			{
				MoveRow(j,i);
			}
		}
	}
	delete [] mj;
	return 1;
}

//求矩阵的模:
double CMatrix::mod()
{
	double re;
	double sum;
	unsigned i,j;
	sum=0;
	for(i=0;i<rows;i++)
	{
		for(j=0;j<cols;j++)
		{
			sum=sum+elems[i*cols+j]*elems[i*cols+j];
		}
	}
	re=sqrt(sum);
	return re;
}

//将row1行移向row2行:
void CMatrix::MoveRow(unsigned int row1, unsigned int row2)
{
	unsigned i,j;
	if(row1>rows||row2>rows)
	{
		AfxMessageBox("MoveRow错误:矩阵下标越界!");
		return;
	}
	double * temp;
	temp=new double[cols];
	for(i=0;i<cols;i++)
	{
		temp[i]=elems[row1*cols+i];//记下当前行;
	}
	//挪动row2以下、row1以上各行;
	for(i=row1;i>row2;i--)
	{
		for(j=0;j<cols;j++)
		{
			elems[i*cols+j]=elems[(i-1)*cols+j];
		}
	}
	for(i=0;i<cols;i++)
	{
		elems[row2*cols+i]=temp[i];
	}
	delete temp;
	return;
}

void CMatrix::deleterow(unsigned int r)
{
	if(rows==0||r>=rows||elems==0)
	{
		AfxMessageBox("deleterow错误:此时不能删除指定行!");
	}
	double * temp;
	unsigned i,j;
	rows-=1;
	size=rows*cols;
	temp=new double[size];
	ASSERT(temp);
	for(i=0;i<=rows;i++)
	{
		for(j=0;j<cols;j++)
		{
			if(i<r)
			{
				temp[i*cols+j]=elems[i*cols+j];
			}
			if(i>r)
			{
				temp[(i-1)*cols+j]=elems[i*cols+j];
			}
		}
	}

	if(elems!=0)
	{
		delete [] elems;
	}

	elems=new double[size];
	for(i=0;i<size;i++)
	{
		elems[i]=temp[i];
	}
	delete [] temp;
}

void CMatrix::deletecol(unsigned int c)
{
	if(cols==0||c>=cols||elems==0)
	{
		AfxMessageBox("deletecol错误:此时不能删除指定列!");
	}
	double * temp;
	unsigned i,j;
	cols-=1;
	size=rows*cols;
	temp=new double[size];
	ASSERT(temp);
	for(i=0;i<rows;i++)
	{
		for(j=0;j<=cols;j++)
		{
			if(j<c)
			{
				temp[i*cols+j]=elems[i*(cols+1)+j];
			}
			if(j>c)
			{
				temp[i*cols+j-1]=elems[i*(cols+1)+j];
			}
		}
	}
	if(elems!=0)
	{
		delete [] elems;
	}

	elems=new double[size];
	for(i=0;i<size;i++)
	{
		elems[i]=temp[i];
	}
	delete [] temp;
}

UINT CMatrix::getrows()
{
	return rows;
}

UINT CMatrix::getcols()
{
	return cols;
}

UINT CMatrix::getsize()
{
	return size;
}

//添加一行,使之成为第r行:
void CMatrix::addrow(UINT r,double dat[])
{
	if(r>rows||elems==0)
	{
		AfxMessageBox("addrow错误:此时不能添加指定行!");
	}
	double * temp;
	unsigned i,j;
	rows+=1;
	size=rows*cols;
	temp=new double[size];
	ASSERT(temp);
	for(i=0;i<(rows-1);i++)
	{
		for(j=0;j<cols;j++)
		{
			if(i<r)
			{
				temp[i*cols+j]=elems[i*cols+j];
			}
			if(i>=r)
			{
				temp[(i+1)*cols+j]=elems[i*cols+j];
			}
		}
	}

	if(elems!=0)
	{
		delete [] elems;
	}

	elems=new double[size];
	for(i=0;i<size;i++)
	{
		elems[i]=temp[i];
	}
	delete [] temp;	

	for(i=0;i<cols;i++)
	{
		setelem(r,i,dat[i]);
	}
}

//添加一列,使之成为第c列:
void CMatrix::addcol(UINT c,double dat[])
{
	if(c>cols||elems==0)
	{
		AfxMessageBox("addcol错误:此时不能删除指定列!");
	}
	double * temp;
	unsigned i,j;
	cols+=1;
	size=rows*cols;
	temp=new double[size];
	ASSERT(temp);
	for(i=0;i<rows;i++)
	{
		for(j=0;j<(cols-1);j++)
		{
			if(j<c)
			{
				temp[i*cols+j]=elems[i*(cols-1)+j];
			}
			if(j>=c)
			{
				temp[i*cols+j+1]=elems[i*(cols-1)+j];
			}
		}
	}
	if(elems!=0)
	{
		delete [] elems;
	}

	elems=new double[size];
	for(i=0;i<size;i++)
	{
		elems[i]=temp[i];
	}
	delete [] temp;
	for(i=0;i<rows;i++)
	{
		setelem(i,c,dat[i]);
	}
}

//添加一行,使之成为第r行:
void CMatrix::addrow(UINT r,double dat)
{
	if(r>rows||elems==0||cols>1)
	{
		AfxMessageBox("addrow错误:此时不能添加指定行!");
	}
	double * temp;
	unsigned i,j;
	rows+=1;
	size=rows*cols;
	temp=new double[size];
	ASSERT(temp);
	for(i=0;i<(rows-1);i++)
	{
		for(j=0;j<cols;j++)
		{
			if(i<r)
			{
				temp[i*cols+j]=elems[i*cols+j];
			}
			if(i>=r)
			{
				temp[(i+1)*cols+j]=elems[i*cols+j];
			}
		}
	}

	if(elems!=0)
	{
		delete [] elems;
	}

	elems=new double[size];
	for(i=0;i<size;i++)
	{
		elems[i]=temp[i];
	}
	delete [] temp;	
	setelem(r,0,dat);
}

//添加一列,使之成为第c列:
void CMatrix::addcol(UINT c,double dat)
{
	if(c>cols||elems==0||rows>1)
	{
		AfxMessageBox("addcol错误:此时不能删除指定列!");
	}
	double * temp;
	unsigned i,j;
	cols+=1;
	size=rows*cols;
	temp=new double[size];
	ASSERT(temp);
	for(i=0;i<rows;i++)
	{
		for(j=0;j<(cols-1);j++)
		{
			if(j<c)
			{
				temp[i*cols+j]=elems[i*(cols-1)+j];
			}
			if(j>=c)
			{
				temp[i*cols+j+1]=elems[i*(cols-1)+j];
			}
		}
	}
	if(elems!=0)
	{
		delete [] elems;
	}

	elems=new double[size];
	for(i=0;i<size;i++)
	{
		elems[i]=temp[i];
	}
	delete [] temp;
	setelem(0,c,dat);
}

double * CMatrix::getdatabuffer()
{
	if(elems==NULL)
	{
		return NULL;
	}
	return elems;
}

⌨️ 快捷键说明

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