[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 @   HaneDaniko  阅读(12)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
点击右上角即可分享
微信分享提示