矩阵类程序(全)

  • 格式:docx
  • 大小:14.08 KB
  • 文档页数:7

Matrix.h #ifndef MATRIX_H_INCLUDED #define MATRIX_H_INCLUDED #include #include #include using namespace std; class matrix1 { public:

matrix1(){mat=NULL;r=0;c=0;} matrix1(int,int); matrix1(const matrix1& b); ~matrix1(){delete []mat;r=0;c=0;} int getrow() {return r;} int getcol() {return c;}

protected: int r; int c; double* mat; private: matrix1 mul(matrix1& b); };

class matrix:public matrix1 { friend istream & operator >>(istream &,const matrix&); //重载输入运算符 friend ostream & operator <<(ostream &,const matrix&); //重载输出运算符 friend double det(const matrix&); //求行列式 private:

public: matrix(){mat=NULL;r=0;c=0;} matrix(int m,int n):matrix1(m,n){} matrix(const matrix& b):matrix1(b){} ~matrix(){} matrix operator +(const matrix &); //重载+运算符 matrix operator -(const matrix &); //重载-运算符 matrix operator *(const matrix &); //重载*运算符 matrix operator = (const matrix &); //重载=运算符 matrix operator % (int); //数乘 matrix operator ^(int); //幂 double& operator()(int i,int j); matrix trans(); //转置 bool swapp(); //对称 matrix leftt(int,int)const; //求余子式 matrix inverse(); //求逆 };

#endif // MATRIX_H_INCLUDED

Matrix.cpp #include "Matrix.h" double& matrix::operator()(int i,int j) //加上异常处理 { if(i<0||i>=r||j<0||j>=c) throw out_of_range("the element is out of range"); return this->mat[i*c+j]; } istream& operator >> (istream& in,const matrix& a) { cout<<"please input the matrix">a.mat[m*(a.c)+n]; return in; } ostream& operator << (ostream& out,const matrix& a) {

for(int m=0;m{ for(int n=0;nout

matrix m(r,c); for(int i=0;im.mat[i]=mat[i]+b.mat[i]; return m; } matrix matrix::operator - (const matrix& b) { if(r!=b.r||c!=b.c) throw invalid_argument("the matrix is not matched(-)");

matrix m(r,c); for(int i=0;im.mat[i]=mat[i]-b.mat[i]; return m; } matrix matrix::operator=(const matrix& b) { if(r!=b.r||c!=b.c) throw invalid_argument("the matrix is not matched(=)"); for(int i=0;ir*c;i++) this->mat[i]=b.mat[i]; return *this; } matrix matrix::operator * (const matrix& b) { if(c!=b.r) throw invalid_argument("the matrix is not matched(*)"); matrix m(r,b.c); for(int i=0;ifor(int j=0;jfor(int k=0;km.mat[i*b.c+j]+=mat[i*c+k]*b.mat[k*b.c+j]; return m;

} bool matrix::swapp() { if((*this).r!=(*this).c) return false; for(int i=0;ifor(int j=0;j<=i;j++) if(this->mat[i*c+j]!=(*this).mat[j*c+i]) return false; return true; } matrix matrix::trans() { matrix m(c,r); for(int i=0;ifor(int j=0;jm.mat[j*r+i]=mat[i*c+j]; return m; } matrix matrix::operator %(int n) { matrix m(r,c); for(int i=0;ifor(int j=0;jm.mat[i*c+j]=mat[i*c+j]*n; return m; } matrix matrix::operator ^ (int n) { matrix m(r,c); matrix b(*this); for(int i=0,j=0;im.mat[i*c+j]=1;

while(n) { if(n&1) m = m*b; n>>=1; b = b*b; } return m; } matrix matrix::leftt(int a,int b)const { matrix left(r-1,c-1); int i,j,count1=0; for(i=0;i{ if(i==a) continue; for(j=0;j{ if(j==b) continue; left.mat[count1++]=mat[i*c+j]; } }

return left; } double det(const matrix& a) //加上不是方针的异常处理 { if(a.r==0) return 0; else if(a.r==1) return a.mat[0]; else if(a.r==2) return (a.mat[0]*a.mat[3]-a.mat[1]*a.mat[2]); else