矩阵基本运算以及快速幂模板
先看一下矩阵的乘法规则:
直接给出一个模板题,直接包含了基本的乘法和求幂,求幂的详细解释,可以看这篇 乘法快速幂 。
题目来源: XYNU OJ
题目
注意:
- 矩阵的乘法必须满足第一个矩阵的列 = 第二个矩阵的行;
- 矩阵的求幂必须满足矩阵是一个方阵;
import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main {
static class Matrix {
public int row;
public int col;
public int[][] m;
public Matrix(int row, int col) {
this.row = row;
this.col = col;
m = new int[row][col];
}
}
// 两个矩阵相加 --> a,b 必须为 同型矩阵
static Matrix add(Matrix a, Matrix b) {
Matrix c = new Matrix(a.row, a.col);
for (int i = 0; i < a.row; i++) {
for (int j = 0; j < a.col; j++) {
c.m[i][j] = a.m[i][j] + b.m[i][j]; // sub 减法换成-
}
}
return c;
}
// 必须满足 a.col = b.row 才能相乘
static Matrix mul(Matrix a, Matrix b) {
Matrix c = new Matrix(a.row, b.col); //注意这里
for (int i = 0; i < a.row; i++) {
for (int j = 0; j < b.col; j++) {
for (int k = 0; k < a.col; k++)
c.m[i][j] = c.m[i][j] + a.m[i][k] * b.m[k][j];
}
}
return c;
}
// 必须为 方阵才能 求幂
static Matrix pow(Matrix a, int k) { // 矩阵 a 的 k 次幂
Matrix res = new Matrix(a.row, a.col); //求幂必须满足 a.row = a.col(也就是方阵)
for (int i = 0; i < a.row; i++)
res.m[i][i] = 1;
// 真正的快速幂
while (k > 0) {
if ((k & 1) != 0)
res = mul(res, a);
a = mul(a, a);
k >>= 1;
}
return res;
}
public static void main(String[] args) {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int n = cin.nextInt();
int k = cin.nextInt();
Matrix a = new Matrix(n, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a.m[i][j] = cin.nextInt();
}
}
Matrix res = pow(a, k);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (j == n - 1) {
System.out.println(res.m[i][j]);
} else {
System.out.print(res.m[i][j] + " ");
}
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论