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

📄 cmatrix.cpp

📁 一个矩阵类的实现
💻 CPP
字号:
#include <iostream.h>
#include <math.h>

class Cmatrix
{
public:
	 Cmatrix();
     Cmatrix(int i,int j,double a[]);
	  ~Cmatrix();
	//void SetA(int,int,double );//设置矩阵元素值
	//void SetA(double B[]);//矩阵整体赋值
	 double getA(int,int);//得到矩阵元素
	int getH();
	int getL();
	double* getpt();
    double getHL_value();//计算行列式的值
	Cmatrix inv();//求逆
	void setpt(double*);//设置矩阵元素值
	Cmatrix T();//转置
	//重载操作符
	Cmatrix operator =(Cmatrix);
	Cmatrix operator *(Cmatrix);
	Cmatrix operator +(Cmatrix);
	Cmatrix operator -(Cmatrix);
private:
	int H; //矩阵行数
	int L;//矩阵列数
    double* pt;//矩阵的值,以一维数组的形式存放
	
};

Cmatrix::Cmatrix()
{
	H=0;
	L=0;
	pt=NULL;
}

Cmatrix::Cmatrix(int i,int j,double a[])
{
	H=i;
	L=j;
	pt=a;
	
}

Cmatrix::~Cmatrix()
{
	
}

void Cmatrix::setpt(double* p)
{
	pt=p;
}

double* Cmatrix::getpt()
{
	return pt;
}

int Cmatrix::getH()
{
	return H;
}

int Cmatrix::getL()
{
	return L;
}

double Cmatrix::getA(int i,int j)
{
	//return *(pt+(i-1)*H+(j-1));
	return pt[(i-1)*H+(j-1)];
}

Cmatrix Cmatrix::operator =(Cmatrix x)
{
	delete []pt;
	pt=new double[x.getH()*x.getL()];
	long i;
	for (i=0;i<x.getH()*x.getL();i++)
	{
		pt[i]=x.getpt()[i];
	}
	H=x.getH();
	L=x.getL();
	
	return *this;
}

Cmatrix Cmatrix::operator *(Cmatrix x)
{	
	Cmatrix temp(H,x.getL(),NULL);
	double *p;
	p=new double[H*x.getL()];
	int i,j,k;
	for(i=0;i<H;i++)
	{
		for(j=0;j<x.getL();j++)
		{
			p[i*x.getL()+j]=0;
			for(k=0;k<L;k++)
			{
				p[i*x.getL()+j]+=pt[i*L+k]*x.getpt()[k*x.getL()+j];
			}
		}
	}
	temp.setpt(p);
	return temp;

}

Cmatrix Cmatrix::operator +(Cmatrix x)
{
	Cmatrix temp(H,L,NULL);
	double *p;
	p=new double[H*L];
	int i;
	for(i=0;i<H*L;i++)
	{
		p[i]=pt[i]+x.getpt()[i];
	}
	temp.setpt(p);
	return temp;
}

Cmatrix Cmatrix::operator -(Cmatrix x)
{
	Cmatrix temp(H,L,NULL);
	double *p;
	p=new double[H*L];
	int i;
	for(i=0;i<H*L;i++)
	{
		p[i]=pt[i]-x.getpt()[i];
	}
	temp.setpt(p);
	return temp;
}

Cmatrix Cmatrix::T()
{
	Cmatrix temp(L,H,NULL);
	double *p;
	p=new double[H*L];
	int i,j;
	for (i=0;i<L;i++) 
	{
		for (j=0;j<H;j++) 
		{
			p[i*H+j]=pt[j*L+i];
		}	
	}
	temp.setpt(p);
	p=NULL;
	return temp;
}
//double Cmatrix::getHL_value(int i,double* pd)
//{
//	double* p;
//	double num;
//	long cha;
//	long T0,T1,T2,T3;
//	cha=0;
//	p= new double[(i-1)*(i-1)];
//	
//	if (i==1)
//	{
//		return (*pd)*(*(pd+3))-*(pd+1)*(*(pd+2));
//		delete []p;
//	}
//	
//	for(T0=0;T0<i;T0++)
//	{
//		for(T1=1;T1<i;T1++)
//		{
//			for(T2=0;T2<i-1;T2++)
//			{
//				if (T2=T0)
//					cha=1;
//				p[(T1-1)*(i-1)+T2]=pd[T1*i+T2+cha];
//				
//			}
//			cha=0;
//		}
//		num=num+pd[T0]*getHL_value(i-1,p)*pow(-1,T0);
//	}
//	 return num;
//	 delete []p;
//	
//}

double Cmatrix::getHL_value()
{
	
	double max,temp,a;
	double num=1;
	double *p;
	p=new double[H*H];
	int maxid;
	int i,j,k,s,n;
	int flag=1;

	for(i=0;i<H*H;i++)
	{
		p[i]=pt[i];
	}

	for(i=0;i<H-1;i++)
	{
		max=fabs(p[i*H+i]);
		maxid=i;
		for(s=i+1;s<=H-1;s++)
		{
			if(fabs(p[s*H+i])>max)
			{
				max=fabs(p[s*H+i]);
				maxid=s;
			}
		}

		if(max==0)
			return 0;

		if(maxid!=i)
		{	flag=flag*(-1);
			for(n=i;n<=H-1;n++)
			{
				temp=p[maxid*H+n];
				p[maxid*H+n]=p[i*H+n];
				p[i*H+n]=temp;
			}

		}

	
		for(j=i+1;j<=H-1;j++)
			{
				a=-p[j*H+i]/p[i*H+i];
				for(k=i;k<=H-1;k++)
				{
					p[j*H+k]=p[j*H+k]+a*p[i*H+k];
				}
				
			}
		
	}
	
	for(i=0;i<=H-1;i++)
	{
		num=num*p[i*H+i];

	}
	delete []p;
	return flag*num;

}


Cmatrix Cmatrix::inv()
{	
	int i,j,k,n;
	int chax=0,chay=0;
	double add;
	double *p;
	double *q;	
	p=new double[H*H];
	q=new double[(H-1)*(H-1)];
	Cmatrix temp1(H,H,NULL);
	Cmatrix temp2(H-1,H-1,NULL);
 	add=1/this->getHL_value();

	 for(k=0;k<H;k++)
	 {
	 	for(n=0;n<H;n++)
		 {	
			
			
			for(i=0;i<H-1;i++)
			{
				if(i<k)
					chax=0;
				else
					chax=1;
				for(j=0;j<H-1;j++)
				{
					if(j<n)
						chay=0;
					else
						chay=1;
					q[i*(H-1)+j]=pt[(i+chax)*H+(j+chay)];
				}
				
		}
			  
			temp2.setpt(q);			  
			p[n*H+k]=pow(-1,k+n)*add*temp2.getHL_value();
			 
			 
		}
 	}
	 temp1.setpt(p);
	delete []q;
	return temp1;

}








void main()
{
	double b[28]={1.34,5.67,5.7,7.56,
1.34,9.00,12.56,7.3,
3.45,6.78,13.4,3.56,
23.5,67.3,33.1,7.3,
3.4,6.78,22.3,5.44,
3.67,8.33,9.12,3.77,
4.77,2.77,8.67,4.44
	};
	double a[28]={1.34,1.34,3.45,23.5,3.4,3.67,4.77,
		5.67,9,6.78,67.3,6.78,8.33,2.77,
		5.7,12.56,13.4,33.1,22.3,9.12,8.67,
		7.56,7.3,3.56,7.3,5.44,3.77,4.44
	};
	double c[7]={45.34,56.66,23.44,5.66,45.67,84.3,22.34
	};
//	double h[5]={2.34,5.78,22.34,2.31,3.55
//	};
	Cmatrix f55(7,4,b);
	Cmatrix d55(7,1,c);
	Cmatrix ss(4,7,a);
	// Cmatrix s(5,1,h);
	Cmatrix f,x;
	/*double c=matrix.getA(1,1);*/
//	double d;
//	d=matrix.getHL_value();
// 	cout<<d<<endl;
	 // f=matrix.inv();
	// matrix.setpt(NULL);
	// cout<<c<<endl;
	//  f=d55*f55;
	 f=f55.T()*f55;
	 x=f.inv()*f55.T()*d55;
	 f=f55*x-d55;
	for(int i=0;i<f.getH();i++)
	{
		// int gg=f.getL();
		for(int j=0;j<f.getL();j++)
		{
			cout<<f.getpt()[i*f.getL()+j]<<" ";

		}
		cout<<endl;
	}
	
	return;
}


⌨️ 快捷键说明

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