矩阵
矩阵计算
矩阵通常用二维数组表示, 表示第 行,第 列。
加减
只可针对同型矩阵,直接对应位置相加减。
数乘
将 分别乘以矩阵中每个元素。
乘法
要求: , 要求 的列数等于 的行数。
: 的大小为 , 的大小为 , 二者乘积 的大小为 。
公式: 。
时间复杂度:
for (int i = 1; i <= m; i ++)
for (int j = 1; j <= u; j ++)
for (int k = 1; k <= n; k ++)
c[i][j] += a[i][k] * b[k][j];
注意:
- 矩阵乘法结合律:
- 矩阵乘法分配律:
- BUT,矩阵乘法无交换律!!!
矩阵快速幂
对于一个 的矩阵 , 要求计算 个 相乘 的结果 ,此类问题可用快速幂计算。
时间复杂度:
实数计算中有单位元1,矩阵乘法中也有单位矩阵 ( )
const int MOD = 1e9 + 7;
struct MATRIX
{
int N;
vector<vector<int>> m;
MATRIX(int N_) : N(N_)
{
m.resize(N + 1);
for (int i=1;i<=N;i++)
m[i].resize(N + 1, 0);
}
void read()
{
for (int i=1;i<=N;i++)
for (int j=1;j<=N;j++)
cin >> m[i][j];
}
void print()
{
for (int i=1;i<=N;i++)
for (int j=1;j<=N;j++)
cout << m[i][j] << " \n"[j == N];
}
};
MATRIX operator*(const MATRIX &a, const MATRIX &b)
{
int N = a.N;
MATRIX c(N);
for (int i=1;i<=N;i++)
for (int j=1;j<=N;j++)
for (int k=1;k<=N;k++)
c.m[i][j] = (c.m[i][j] + a.m[i][k] * b.m[k][j] % MOD) % MOD;
return c;
}
MATRIX qpow(MATRIX &a, int b)
{
int N = a.N;
MATRIX ans(N);
for (int i=1;i<=N;i++) ans.m[i][i] = 1; // 初始化,类似于普通快速幂的 ans = 1
while (b)
{
if (b & 1) ans = ans * a;
a = a * a;
b >>= 1;
}
return ans;
}
void solve()
{
int n, m; cin >> n >> m;
MATRIX a(n);
a.read();
auto ans = qpow(a, 5);
ans.print();
}
矩阵加速
在面对含有递推式的题目,数据范围过大时,直接递推会超时,常用矩阵快速幂加速递推。
矩阵
http://linyisu.github.io/2025/03/24/线性代数/矩阵/