最近看离散数学,讲图的时候觉得矩阵相乘算起来很麻烦,写了个代码帮忙跑一下,因为是学习用的,所以只写了正方矩阵的,main前四行为输入的参数,四个函数分别是,矩阵乘法,矩阵n次幂,矩阵n次幂相加,遍历
#include <stdio.h>
#include <stdlib.h>
int** MatrixMul(int** ma1, int** ma2, int line) {
int** matrix = (int**)malloc(sizeof(int*) * line);
for (int i = 0; i < line; i++) {
matrix[i] = (int*)malloc(sizeof(int) * line);
for (int j = 0; j < line; j++) {
matrix[i][j] = 0;
}
}
for (int i = 0; i < line; i++) {
for (int j = 0; j < line; j++) {
for (int k = 0; k < line; k++) {
matrix[i][j] += ma1[i][k] * ma2[k][j];
}
}
}
return matrix;
}
int** MatrixMulN(int** ma, int line, int n) {
int** matrix1 = (int**)malloc(sizeof(int*) * line);
for (int i = 0; i < line; i++) {
matrix1[i] = (int*)malloc(sizeof(int) * line);
for (int j = 0; j < line; j++) {
matrix1[i][j] = 0;
}
}
matrix1 = MatrixMul(ma, ma, line);
for (int i = 0; i < n - 2; i++) {
matrix1 = MatrixMul(matrix1, ma, line);
}
return matrix1;
}
int** MatrixMulNadd(int** ma, int line, int n) {
int** matrix2 = (int**)malloc(sizeof(int*) * line);
for (int i = 0; i < line; i++) {
matrix2[i] = (int*)malloc(sizeof(int) * line);
for (int j = 0; j < line; j++) {
matrix2[i][j] = ma[i][j];
}
}
int** ans;
for (int i = 2; i < n+1; i++) {
ans = MatrixMulN(ma, line, i);
for (int j = 0; j < line; j++) {
for (int k = 0; k < line; k++) {
matrix2[j][k] += ans[j][k];
}
}
}
return matrix2;
}
void ErgodicMatrix(int** matrix, int line) {
for (int i = 0; i < line; i++) {
for (int j = 0; j < line; j++) {
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
printf("\n");
}
int main() {
int matrix[4][4] = { {0,1,1,0}, {1,0,1,1}, {1,0,0,0}, {0,0,0,1} };
int line = 4;
int n = 4;
int* p[4];
for (int i = 0; i < line; i++) {
p[i] = matrix[i];
}
int** ans;
ans = MatrixMul(p, p, line); //矩阵相乘
ErgodicMatrix(ans, line);
ans = MatrixMulN(p, line, n); //矩阵n次幂
ErgodicMatrix(ans, line);
ans = MatrixMulNadd(p, line, n); //矩阵n次幂相加
ErgodicMatrix(ans, line);
return 0;
}