[C++] 关于矩阵运算类的历史残次品记录

声明:用了就寄,完整版在 隔壁. 记下来只是看看之后的自己能不能救活这坨玩意.

Updated : 不写类了,写个结构体的重载矩阵运算。还方便一点

#define maxlen 101
struct matrix{
		int n,m,mod;
		bool ifmod;
		long long mat[maxlen+1][maxlen+1];
		void clear(){
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					mat[i][j]=0;
				}
			}
			n=0;
			m=0;
			ifmod=false;
			mod=0;
		}
		void setmod(int x){
			if(x==0){
				ifmod=false;
			}
			else{
				ifmod=true;
			}
			mod=x;
		}
		void resize(int nsize,int msize){
			n=nsize;
			m=msize;
		}
		void fillmain(int x){
			for(int i=1;i<=n;++i){
				mat[i][i]=x;
			}
		}
		void fillsec(int x){
			for(int i=1;i<=n;++i){
				mat[i][n-i+1]=x;
			}
		}
		void fill(int x){
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					mat[i][j]=x;
				}
			}
		}
		void fill(int x,int startn,int endn,int startm,int endm){
			for(int i=startn;i<=endn;++i){
				for(int j=startm;j<=endm;++j){
					mat[i][j]=x;
				}
			}
		}
		void opposite(){
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					mat[i][j]*=-1;
				}
			}
		}
		void input(){
			cin>>n>>m;
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cin>>mat[i][j];
				}
			}
		}
		void inputn(int nsize){
			n=nsize;
			cin>>m;
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cin>>mat[i][j];
				}
			}
		}
		void inputm(int msize){
			m=msize;
			cin>>n;
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cin>>mat[i][j];
				}
			}
		}
		void input(int nsize,int msize){
			n=nsize;
			m=msize;
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cin>>mat[i][j];
				}
			}
		}
		void print(){
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cout<<mat[i][j]<<" ";
				}
				cout<<endl;
			}
		}
		matrix operator *(const matrix &A)const{
			matrix p;
			p.resize(n,A.m);
			for(int i=1;i<=n;++i){
				for(int j=1;j<=A.m;++j){
					for(int k=1;k<=m;++k){
						if(ifmod){
							p.mat[i][j]+=(mat[i][k]*A.mat[k][j])%mod;
						}
						else{
							p.mat[i][j]+=mat[i][k]*A.mat[k][j];
						}
					}
				}
			}
			return p;
		}
		matrix operator +(const matrix &A)const{
			matrix p;
			p.resize(n,m);
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					if(ifmod){
						p.mat[i][j]=(mat[i][j]+A.mat[i][j])%mod;
					}
					else{
						p.mat[i][j]=mat[i][j]+A.mat[i][j];
					}
				}
			}
			return p;
		}
		matrix operator -(const matrix &A)const{
			matrix p;
			p.resize(n,m);
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					if(ifmod){
						p.mat[i][j]=(mat[i][j]-A.mat[i][j])%mod;
					}
					else{
						p.mat[i][j]=mat[i][j]-A.mat[i][j];
					}
				}
			}
			return p;
		}
		matrix operator ^(const int times)const{
			matrix p;
			p.resize(n,m);
			p.fill(1);
			for(int i=1;i<=times;++i){
				p=p*(*this);
			}
			return p;
		}
		matrix operator |(int times)const{
			matrix base,p;
			base.resize(n,m);
			base=(*this);
			p.resize(n,m);
			p.fillmain(1);
			while(times){
				if(times&1){
					p=p*base;
				}
				base=base*base;
				times>>=1;
			}
			return p;
		}
};

下面这个别用,谁用谁寄

这回是真不好了,有bug没修

#define maxlen 100
class matrix{
	private:
		int n,m;
	public:
		int mat[maxlen+1][maxlen+1];
		void clear(){
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					mat[i][j]=0;
				}
			}
			n=0;
			m=0;
		}
		void resize(int nsize,int msize){
			n=nsize;
			m=msize;
		}
		void fill(int x){
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					mat[i][j]=x;
				}
			}
		}
		void fill(int x,int startn,int endn,int startm,int endm){
			for(int i=startn;i<=endn;++i){
				for(int j=startm;j<=endm;++j){
					mat[i][j]=x;
				}
			}
		}
		void opposite(){
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					mat[i][j]*=-1;
				}
			}
		}
		void input(){
			cin>>n>>m;
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cin>>mat[i][j];
				}
			}
		}
		void inputn(int nsize){
			n=nsize;
			cin>>m;
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cin>>mat[i][j];
				}
			}
		}
		void inputm(int msize){
			m=msize;
			cin>>n;
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cin>>mat[i][j];
				}
			}
		}
		void input(int nsize,int msize){
			n=nsize;
			m=msize;
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cin>>mat[i][j];
				}
			}
		}
		void print(){
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					cout<<mat[i][j]<<" ";
				}
				cout<<endl;
			}
		}
		int nsize(){
			return n;
		}
		int msize(){
			return m;
		}
		bool operator =(matrix &A){
			clear();
			resize(A.nsize(),A.msize());
			for(int i=1;i<=A.nsize();++i){
				for(int j=1;j<=A.msize();++j){
					mat[i][j]=A.mat[i][j];
				}
			}
		}
		void selfmult(){
			matrix answer;
			answer.resize(n,m);
			for(int i=1;i<=n;++i){
				for(int j=1;j<=m;++j){
					for(int k=1;k<=m;++k){
						answer.mat[i][j]+=mat[i][k]*mat[k][j];
					}
				}
			}
			clear();
			resize(answer.nsize(),answer.msize());
			for(int i=1;i<=answer.nsize();++i){
				for(int j=1;j<=answer.msize();++j){
					mat[i][j]=answer.mat[i][j];
				}
			}
		}
};

class matrix_opera{
	public:
		matrix answer,a,b;
		bool matrix_mult(){
			answer.clear();
			if(a.msize()!=b.nsize()){
				return false;
			}
			answer.resize(a.nsize(),b.msize());
			for(int i=1;i<=a.nsize();++i){
				for(int j=1;j<=b.msize();++j){
					for(int k=1;k<=a.msize();++k){
						answer.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
					}
				}
			}
			return true;
		}
		bool matrix_add(){
			answer.clear();
			if(a.msize()!=b.msize()){
				return false;
			}
			if(a.nsize()!=b.nsize()){
				return false;
			}
			answer.resize(a.nsize(),b.msize());
			for(int i=1;i<=a.nsize();++i){
				for(int j=1;j<=a.msize();++j){
					answer.mat[i][j]=a.mat[i][j]+b.mat[i][j];
				}
			}
			return true;
		}
		bool matrix_reduce(){
			answer.clear();
			if(a.msize()!=b.msize()){
				return false;
			}
			if(a.nsize()!=b.nsize()){
				return false;
			}
			answer.resize(a.nsize(),b.msize());
			for(int i=1;i<=a.nsize();++i){
				for(int j=1;j<=a.msize();++j){
					answer.mat[i][j]=a.mat[i][j]-b.mat[i][j];
				}
			}
			return true;
		}
		void store_answer(){
			a.clear();
			a.resize(answer.nsize(),answer.msize());
			for(int i=1;i<=a.nsize();++i){
				for(int j=1;j<=a.msize();++j){
					a.mat[i][j]=answer.mat[i][j];
				}
			}
		}
		bool matrix_selfmult(){
			answer.clear();
			if(a.msize()!=a.nsize()){
				return false;
			}
			answer.resize(a.nsize(),a.msize());
			for(int i=1;i<=a.nsize();++i){
				for(int j=1;j<=a.msize();++j){
					for(int k=1;k<=a.msize();++k){
						answer.mat[i][j]+=a.mat[i][k]*a.mat[k][j];
					}
				}
			}
			return true;
		}
		void matrix_power(int times){
			answer.clear();
			answer.resize(a.nsize(),a.nsize());
			for(int i=1;i<=times-1;++i){
				matrix_selfmult();
				store_answer();
			}
		}
		void matrix_quickpower(int times){
			b.clear();
			b.resize(a.nsize(),a.nsize());
			b.fill(1);
			while(times){
				if(times&1){
					matrix_mult();
					b=answer;
				}
				a.selfmult();
				times>>=1;
			}
		}
};
posted @ 2024-02-08 21:09  HaneDaniko  阅读(7)  评论(0编辑  收藏  举报
/**/