矩阵学习笔记

前言

蒟蒻刚刚开始学矩阵,有些东西可能理解得不是特别好。

矩阵的定义

\(c\)++ 中,矩阵其实就是一个 \(n*m\),可以做运算的二维数组。也是运算的中的一种基本单位。

特殊的矩阵

在矩阵的运算过程中,可能会用到一些特殊的矩阵的名称,以下是比较常见的一些特殊矩阵:

  • 同型矩阵:两个矩阵,行数与列数对应相同,称为同型矩阵。

  • 方阵:\(n*n\) 的矩阵。

  • 乘法单位元:\(a_{i,i} = 1\),其余位置为零的矩阵。

  • 加法单位元:\(a\) 数组全为零的矩阵。

矩阵的运算

  1. 矩阵加法

矩阵加法其实和正常的加法非常相似,对于两个同型矩阵 \(a,b\),每一位的加法运算过程如下:

\(ans_{i,j} = a_{i,j} + b_{i,j}\)

  1. 矩阵乘法

矩阵乘法就和一般的乘法差别很大了,矩阵乘法相当于是用 \(a\) 矩阵的列去乘 \(b\) 矩阵的行,但乘法运算有一个前提:\(a\) 矩阵的列数和 \(b\) 矩阵的行数必须相等,否则运算无意义。 对于满足条件的两个矩阵,每一位的乘法运算过程如下:

\(a\) 矩阵 \(n*m\)\(b\) 矩阵 \(m*p\),则:

$ans_{i,j} = \sum_{i=1}^{n} \sum_{j=1}^{p} a_{i,k}*b_{k,j} $

Code

void mul()
{
	int ans[MAXN][MAXM] = {};
	for(int k = 1;k <= m;k++)
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= p;j++)
				ans[i][j] = (ans[i][j] + a[i][k] * b[k][j]) % mod;
	return;
}
  1. 矩阵快速幂

模板题:P3390
练习题:CF575A

当我们需要计算矩阵 \(a^{k}\)\(k\) 十分大的时就,我们就需要用到矩阵快速幂了,思路和普通快速幂一样,不多赘述。不一样的就只是多了两个函数来计算矩阵乘法。

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls id << 1
#define rs id << 1 | 1
#define inf 0x3f3f3f3f
typedef pair <int,int> pii;
const int MAXN = 1e2 + 10;
const int mod = 1e9 + 7;
int n,k,a[MAXN][MAXN],ans[MAXN][MAXN]; 
void mul1()
{
	int res[MAXN][MAXN] = {};
	for(int k = 1;k <= n;k++)
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= n;j++)
				res[i][j] = (res[i][j] + ans[i][k] * a[k][j]) % mod;
	for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++) ans[i][j] = res[i][j];
}
void mul2()
{
	int res[MAXN][MAXN] = {};
	for(int k = 1;k <= n;k++)
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= n;j++)
				res[i][j] = (res[i][j] + a[i][k] * a[k][j]) % mod;
	for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++) a[i][j] = res[i][j];
}
signed main()
{
	cin >> n >> k;
	for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++) cin >> a[i][j];
	for(int i = 1;i <= n;i++) ans[i][i] = 1;
	for(;k;k >>= 1){if(k & 1) mul1();mul2();}
	for(int i = 1;i <= n;i++) 
	{
		for(int j = 1;j <= n;j++) cout << ans[i][j] % mod << " ";
		puts(" ");
	}
    return 0;
}


矩阵的应用

最经典的应用要数斐波那契数列了,我们可以通过矩阵快速幂在 \(O(logn)\) 的时间内求出斐波那契数列的第 \(n\) 项。具体做法如下。

首先我们知道斐波那契数列的递推式:

\(f_{i}=1*f_{i-1}+1*f_{i-2}\)\(f_{i-1}=1*f_{i-1}+0*f_{i-2}\)

我们可以把 \((f_{i},f_{i-1})\) 看作一个矩阵,把 \(f\) 数组前面的系数 \((1,1,1,0)\) 也看成一个矩阵,这样斐波那契数列的递推式也就可以等价转化成一个矩阵乘法的式子,即:

\(\begin{pmatrix}f_{i}\\f_{i-1}\end{pmatrix}= \begin{pmatrix}f_{i-1}\\f_{i-2}\end{pmatrix}* \begin{pmatrix}1& 1\\1&0\end{pmatrix}\)

这样就可以用矩阵快速幂轻松解决了。

本文作者:Creeper_l

本文链接:https://www.cnblogs.com/Creeperl/p/17913357.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Creeper_l  阅读(12)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
  3. 3 True love tired
  4. 4 一笑江湖 (DJ弹鼓版) 闻人听書_
  5. 5 最好的安排 曲婉婷
  6. 6 星星在唱歌 司南
  7. 7 山川 李荣浩
  8. 8 On My Way Alan Walker
  9. 9 百战成诗 王者荣耀·100英雄官方群像献礼歌
  10. 10 雪 Distance Capper / 罗言
  11. 11 Edamame bbno$ / Rich Brian
  12. 12 半生雪 七叔-叶泽浩
  13. 13 Catch My Breath Kelly Clarkson
  14. 14 Love Is Gone SLANDER / Dylan Matthew
  15. 15 Endless Summer Alan Walker / Zak Abel
  16. 16 悬溺 葛东琪
  17. 17 风吹丹顶鹤 葛东琪
  18. 18 Normal No More TYSM
  19. 19 哪里都是你 队长
  20. 20 Stronger Kelly Clarkson
  21. 21 廖俊涛
  22. 22 消愁 毛不易
  23. 23 The Runner Yubik
  24. 24 踏山河 七叔-叶泽浩
  25. 25 Waiting For Love Avicii
  26. 26 在你的身边 盛哲
  27. 27 Dream It Possible Delacey
  28. 28 凄美地 郭顶
  29. 29 满天星辰不及你 ycc
  30. 30 侧脸 于果
  31. 31 阿拉斯加海湾 蓝心羽
  32. 32 虞兮叹 闻人听書_
  33. 33 离别开出花 就是南方凯
  34. 34 盗墓笔记·十年人间 李常超 (Lao乾妈)
悬溺 - 葛东琪
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示