矩阵乘法~~


矩阵的相乘

瞎吹吹

由m行、n列的标量所构成的数组被称为一个 m × n m×n m×n的矩阵 ( m a t r i x ) (matrix) (matrix)。一般用大写字母表示矩阵,对应的小写字母表示矩阵中的项 ( e n t r y ) (entry) (entry)。这里,aij就是矩阵A中第i行第j列的项。
在这里插入图片描述
定义矩阵 A , B A,B A,B。A和B可以作乘法操作当且仅当A的大小是 a × b a×b a×b,B的大小是 b × c b×c b×c,其中 a , b , c a,b, c abc皆为正整数。设矩阵 C = A B C=AB C=AB,则C的大小是 a × c a×c a×c,且有
在这里插入图片描述
矩阵乘法满足结合律,但不满足交换律,具体证明略。


瞎打打

常规写法一:

matrix multi(matrix a,matrix b)
{
	matrix c;
	c.n=a.n,c.m=b.m; //乘法后的矩阵的行数与一个矩阵相同,列数与第二个矩阵相同 
	for (int i=1;i<=c.n;i++) //初始化 
	{
		for (int j=1;j<=c.m;j++) c.a[i][j]=0;
	}
	for (int k=1;k<=a.m;k++) //先枚举中间的数,时间上比较优秀,按k,i,j的顺序依次枚举 
	{
		for (int i=1;i<=a.n;i++) 
		{
			for (int j=1;j<=b.m;j++)
			{
				c.a[i][j]+=a.a[i][k]*b.a[k][j];
			}
		}
	}
	return c;
}

常规写法二:

struct matrix{
	int n,m;
	LL a[30][30];
}A,B; //定义一个矩阵类型,表示矩阵的行,列和元素 

matrix operator *(matrix a,matrix b) //定义矩阵类之间的乘法 
{
	matrix c;
	c.n=a.n,c.m=b.m; //行和列进行赋值 
	for (int i=0;i<=c.n;i++)
	{
		for (int j=0;j<=c.m;j++) c.a[i][j]=0; //清空数组 
	}
	for (int k=1;k<=a.m;k++) //计算矩阵乘法 
	{
		for (int i=1;i<=a.n;i++)
		{
			for (int j=1;j<=b.m;j++)
			{
				c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod; //这是取mod意义下的计算方式 
			}
		}
	}
	return c; //返回结果 
}

矩阵转置

在这里插入图片描述
在这里插入图片描述


矩阵乘法的快速幂

定义矩阵M,M的大小为 N × N N×N N×N,t个矩阵M相乘记为MT
因为矩阵乘法满足结合律,所以可以用快速幂在 O(N3log t) 的时间内求出
过程如下:
在这里插入图片描述
代码

void power(LL k) //计算A^k,并存在数组B中 
{
	if (k==1)
	{
		B=A;
		return;
	}
	power(k/2); //计算A^(k/2)
	B=B*B; //直接用乘号即可调用上述过程,对A^(k/2)平方 
	if (k&1) B=B*A; //如果是奇数,在乘上一个A 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值