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

📄 matrix.h

📁 提供矩阵以及向量的各种运算
💻 H
字号:

#pragma once
#include<iostream>
#include"vector.h"
using std::cout;
using std::cin;
using std::endl;
using std::ios_base;

class Matrix
{
private:
	int row,line;
	double **MatrA;
public:
	int getRow(){return row;}
	int getLine(){return line;}
	Matrix (int m,int n):row(m),line(n)
    {
	 MatrA=new double*[row];
	 for(int i=0;i<row;i++)
		MatrA[i]=new double[line];
    }
	Matrix ():row(0),line(0)
	{
		MatrA = NULL;
	}
	void init()
	{
		if(row==7&&line==7)
		{
			MatrA[1][1]=-0.5;
	        MatrA[2][1]=-0.42;
	        MatrA[3][1]=-0.18;
	        MatrA[4][1]=0.22;
	        MatrA[5][1]=0.78;
	        MatrA[6][1]=1.5;
	        MatrA[1][2]=-0.34;
	        MatrA[2][2]=-0.5;
	        MatrA[3][2]=-0.5;
	        MatrA[4][2]=-0.34;
	        MatrA[5][2]=-0.02;
	        MatrA[6][2]=0.46;
	        MatrA[1][3]=0.14;
	        MatrA[2][3]=-0.26;
	        MatrA[3][3]=-0.5;
	        MatrA[4][3]=-0.58;
	        MatrA[5][3]=-0.5;
	        MatrA[6][3]=-0.26;
	        MatrA[1][4]=0.94;
	        MatrA[2][4]=0.3;
	        MatrA[3][4]=-0.18;
	        MatrA[4][4]=-0.5;
	        MatrA[5][4]=-0.66;
	        MatrA[6][4]=-0.66;
	        MatrA[1][5]=2.06;
	        MatrA[2][5]=1.18;
	        MatrA[3][5]=0.46;
	        MatrA[4][5]=-0.1;
	        MatrA[5][5]=-0.5;
	        MatrA[6][5]=-0.74;
	        MatrA[1][6]=3.5;
	        MatrA[2][6]=2.38;
	        MatrA[3][6]=1.42;
	        MatrA[4][6]=0.62;
	        MatrA[5][6]=-0.02;
	        MatrA[6][6]=-0.5;
			MatrA[0][0]=0;
			for(int i=0;i<6;i++)
			{
				MatrA[0][i+1]=i*0.4;
				MatrA[i+1][0]=i*0.2;
			}
		}
		else
			cout<<"error"<<endl;
	}

	Matrix(Matrix &temp)
    {
	row=temp.row;
	line=temp.line;
	MatrA=new double*[row];
	for(int i=0;i<row;i++)
		MatrA[i]=new double[line];
	for(int i=0;i<row;i++)
		for(int j=0;j<line;j++)
			MatrA[i][j]=temp.MatrA[i][j];
    }
	Matrix& copy(Matrix& temp)
	{
	row=temp.row;
	line=temp.line;
	MatrA=new double*[row];
	for(int i=0;i<row;i++)
		MatrA[i]=new double[line];
	for(int i=0;i<row;i++)
		for(int j=0;j<line;j++)
			MatrA[i][j]=temp.MatrA[i][j];
	return *this;
	}

	void setMatrA(int i,int j,double res)
	{
		MatrA[i][j]=res;
	}
	
	
	double getMatrA(int i,int j)
	{
		
		return MatrA[i][j];
	}


 void input()
   {
	cout<<"input number:"<<endl;
	int i,j;
	for(i=0;i<row;i++)
		for(j=0;j<line;j++)
			cin>>MatrA[i][j];
	cout<<endl;
   }
 void output()
   {
	int i,j;
	for(i=0;i<row;i++)
	{
		for(j=0;j<line;j++)
		{
			printf("%.11e,",MatrA[i][j]);
			if(j==line-1)
		    cout<<endl;
		}
	 }
	cout<<endl;
    }


  ~Matrix()
   {
	int i;
	for(i=0;i<row;i++)
	{
	    delete[] MatrA[i];
	}
    delete[] MatrA;
    }


Matrix& operator +(const Matrix &t)const
{
	Matrix* sum=new Matrix(row,line);
	int i,j;
	if((line==t.line)&&(row==t.row))
	{
		for(i=0;i<row;i++)
		{
			for(j=0;j<line;j++)
				sum->MatrA[i][j]=MatrA[i][j]+t.MatrA[i][j];
		}
		return *sum;
	}
	else 
		cout<<"check the line and row!";
}


Matrix& operator *(const Matrix &t)const
{
	int i,j;
	if(line==t.row)
	{
		Matrix  *res=new Matrix(row,t.line);
		for(i=0;i<row;i++)
		{
			for(j=0;j<t.line;j++)
			{
			    double temp=0;
				for(int k=0;k<line;k++)
				{
					temp+=MatrA[i][k]*t.MatrA[k][j];
				}
				res->MatrA[i][j]=temp;
			}
		}
		return *res;
	}
	else 
		cout<<"1:check the line and row!";
}

vector& operator *( vector& t)const
{
	if(line==t.getN())
	{
		vector* res=new vector(row);
		for(int i=0;i<row;i++)
		{
			double m_res=0;
			for(int j=0;j<line;j++)
			{
				m_res+=MatrA[i][j]*t.getVector(j);
			}
			res->setVector(i,m_res);
		}
		return *res;
	}
	else 
		cout<<"error"<<endl;
}



Matrix&  operator/(const double & t)const
{
	Matrix* res=new Matrix(row,line);
	for(int i=0;i<row;i++)
		for(int j=0;j<line;j++)
			res->MatrA[i][j]=MatrA[i][j]/t;
	return *res;
}


Matrix& operator ~()const
{
	
		Matrix *res=new Matrix ( line,row);
		for(int i=0;i<row;i++)
		{
			for(int j=0;j<line;j++)
				res->MatrA[j][i]=MatrA[i][j];
		}
	return *res;
}


Matrix& operator !()const
{
  if(row==line)
  {
	Matrix *res = new Matrix(row,row);
	Matrix mid(row,row);
	double m=0;
	double *max;
	for(int i=0;i<row;i++)
		for(int j=0;j<row;j++)
			mid.MatrA[i][j]=MatrA[i][j];
	for(int i=0;i<row;i++)
		for(int j=0;j<row;j++)
			res->MatrA[i][j]=0;
	for (int i=0;i<row;i++)
		res->MatrA[i][i]=1;
	//res->output();
	for(int k=0;k<row;k++)
	{
		for(int i=k;i<row;i++)
		{
			if(fabs(mid.MatrA[i][k])>fabs(mid.MatrA[k][k]))
			{
				max=mid.MatrA[i];
				mid.MatrA[i]=mid.MatrA[k];
				mid.MatrA[k]=max;
				max=res->MatrA[i];
				res->MatrA[i]=res->MatrA[k];
				res->MatrA[k]=max;
			}
		}
		for(int i=0;i<row;i++)
		{
			i=i==k?i+1:i;
			if(i==row){break;}
			m=mid.MatrA[i][k]/mid.MatrA[k][k];
			for(int j=0;j<row;j++)	
			{
				mid.MatrA[i][j]-=m*mid.MatrA[k][j];
				res->MatrA[i][j]-=m*res->MatrA[k][j];

			}
		}
	}
	//mid.output();

	for(int i=0;i<row;i++)
	{
		for(int j=0;j<row;j++)
		{
			res->MatrA[i][j]=res->MatrA[i][j]/mid.MatrA[i][i];
		}
	}
	return * res;
  }
  else 
	  cout<<"check the line and row!";
}


static plus(int x,int i)
{
	return (x+i)>3?x+i-3:x+i;
}
friend std::ostream& operator << (std::ostream& os,Matrix& A)
{
	cout.setf(ios_base::scientific,ios_base::floatfield);
	cout.precision(11);
	for(int i=0;i<A.getRow();i++)
		for(int j=0;j<A.getLine();j++)
			os<<"F"<<"("<<i<<","<<j<<")"<<"="<<A.getMatrA(i,j)<<endl;
	return os;
}

friend double insert(Matrix&,double,double);
friend Matrix& descompose(Matrix&,double,double);
friend double compute(Matrix&,double,double);
friend vector& nonlinear(double,double);
friend Matrix& approach(Matrix&,vector&,vector&,int);
friend double appcompute(Matrix&,double,double);



};

⌨️ 快捷键说明

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