首页 > 其他分享 >关于矩阵的相关运算

关于矩阵的相关运算

时间:2024-03-15 12:03:57浏览次数:20  
标签:运算 int 矩阵 运算符 关于 ans 除数 define

定义

肥肠的简单
即将矩阵作为一个整体进行加减乘(包括快速幂)等的运算操作

对,没有除
至于为什么我不会告诉你是因为huge没有讲的

不过对于除法我们可以通过增广原除数矩阵再进行高斯消元balabala的操作求得除数矩阵逆矩阵
再将被除数矩阵乘上除数矩阵逆矩阵得到ans矩阵

我们可以将矩阵定义为结构体
通过重载运算符来实现矩阵的加减乘

矩阵快速幂就和普通的快速幂没什么两样
毕竟已经重载了运算符嘛

模板

Elaina's code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define INF 0x7fffffff
#define mst(a,b) memset(a,b,sizeof(a))
#define Elaina 0
const int N = 105;
int mod=1e14;
struct Mat{
	int n,m;//行列
	int a[N][N];
	void clean(){
		mst(a,0);
	}
	
	//n*n的单位矩阵
	void unit(){ 
		clean();
		for(int i=1;i<=n;i++){
			a[i][i]=1;
		}
	}
	
	//设置矩阵大小
	void resize(int x,int y){ 
		n=x,m=y;
	}
	
	//矩阵加
	Mat operator + (const Mat &A) const{ 
		Mat res;
		res.resize(n,m);
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				res.a[i][j]=(a[i][j]+A.a[i][j])%mod;
			}
		}
		return res;
	}
	
	//矩阵减 
	Mat operator - (const Mat &A) const { 
		Mat res;
		res.resize(n,m);
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				res.a[i][j]=(a[i][j]-A.a[i][j])%mod;
			}
		}
		return res;
	}
	
	//矩阵乘
	Mat operator * (const Mat &A) const { 
		Mat res;
		res.resize(n,A.m);
		res.clean();
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=A.m;j++){
				for(int k=1;k<=m;k++){
					res.a[i][j]=(a[i][k]*A.a[k][j]+res.a[i][j])%mod;
				}
			}
		}
		return res;
	}
	
	//输出矩阵
	void output(){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				printf("%lld ",a[i][j]);
			}
			putchar('\n');
		}
	} 
};

//矩阵快速幂 
Mat qpow(Mat A,int b){
	Mat res;
	res.resize(2,2);
	res.unit();
	while(b){
		if(b&1){
			res=res*A;
		}
		A=A*A;
		b>>=1; 
	}
	return res;
} 

signed main(){
	int x,y,a,b;
	Mat A,B,ans;
	cin>>x>>y;
	A.resize(x,y);
	for(int i=1;i<=x;i++){
		for(int j=1;j<=y;j++){
			cin>>A.a[i][j];
		}
	}
	cin>>a>>b;
	B.resize(a,b);
	for(int i=1;i<=a;i++){
		for(int j=1;j<=b;j++){
			cin>>B.a[i][j];
		}
	}
	ans=A*B;
	ans.output();
}

标签:运算,int,矩阵,运算符,关于,ans,除数,define
From: https://www.cnblogs.com/Elaina-0/p/18075097

相关文章

  • 【vue3】关于ref、toRef、toRefs
    1.ref函数,可以把简单数据类型包裹为响应式数据(复杂类型也可以),注意JS中操作值的时候,需要加.value属性,模板中正常使用即可2.toRef函数的作用:转换响应式对象中某个属性为单独响应式数据,并且转换后的值和之前是关联的(ref函数也可以转换,但值非关联)3.toRefs函数的作用:转换响......
  • vs关于窗体的应用程序如何开启控制台窗口的方式
    方式一:(推荐)属性->生成后事件添加以下指令:editbin/SUBSYSTEM:CONSOLE$(OutDir)$(ProjectName).exe方式二:(动态方式)//分配一个新的控制台窗口 AllocConsole(); SetConsoleTitle(("DebugOutput"</......
  • 关于mcu不适用ide,使用交叉编译工具开发的问题
    背景本文以ti的msp430系列单片机为例首先去官网下载交叉编译链https://www.ti.com.cn/tool/cn/MSP430-GCC-OPENSOURCE我们这里用windows做测试,下载windwos的就可以安装以后参照这个https://zhuanlan.zhihu.com/p/356963477......
  • C#实现图的邻接矩阵和邻接表结构
    原文链接:https://blog.csdn.net/weixin_41883890/article/details/125517599本文介绍C#实现图的邻接矩阵和邻接表结构。逻辑结构分为两部分:V和E集合,其中,V是顶点,E是边。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵......
  • 03常见运算符
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Document......
  • C++ | 蓝桥题库区间或(位运算)
    一开始看题解很晕,这里采用前缀和方式的思想是:按位贡献,将答案分成32份(1e9最多32位二进制数)这样才有的prefix[32][N]前缀和数组,求的是第i位数第w位上的和。(1<<w)1左移w位相当于2的w次方,prefix[w][r]-prefix[w][l-1]相当于[l,r]这段距离上有1就让ans加上1,没有就不加。#inc......
  • 关于Git小白应该知道的事
    听说学会使用Git版本控制,对写程序很有帮助,今天花了一点时间学习体验了一下起初我的配置了虚拟机,安装Linux之CentOS,使用vscode连接使用,对用惯了Windows来说,非常友好了写代码,管理文件,包括调试都很方便,在网上看过视频讲解后,也安装上了GIT,还建了一个测试仓库(Repository)也把代码搞......
  • 01-位运算、算法
    题目:打印int类型整数的32位信息1与任何二进制的与运算:同1为1,有0为0;可以让整数每一位和1做与运算,按位输出结果这是循环的操作,并且应该从最高位32位按位输出,也就是最开始1应该左移31位,接下来左移30位publicclassCode01_PrintBinary{ publicstaticvoidprintBinary(intn......
  • 关于PolarDB粗浅认识
    PolarDB简介目前(20240314),PolarDB有两个版本:PolarDB-PGPolarDBPostgreSQL版(PolarDBforPostgreSQL,简称“PolarDB-PG”)是阿里云自主研发的云原生关系型数据库产品,100%兼容PostgreSQL。采用基于Shared-Storage的存储计算分离架构,具有极致弹性、毫秒级延迟、HTAP的能力......
  • LeetCodeHot100 73. 矩阵置零 54. 螺旋矩阵 48. 旋转图像 240. 搜索二维矩阵 II
    73.矩阵置零https://leetcode.cn/problems/set-matrix-zeroes/description/?envType=study-plan-v2&envId=top-100-likedpublicvoidsetZeroes(int[][]matrix){inttop=0,bottom=matrix.length,left=0,right=matrix[0].length;int[][]flag......