📄 matrix.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 + -