最近看离散数学,讲图的时候觉得矩阵相乘算起来很麻烦,写了个代码帮忙跑一下,因为是学习用的,所以只写了正方矩阵的,main前四行为输入的参数,四个函数分别是,矩阵乘法,矩阵n次幂,矩阵n次幂相加,遍历
#include#include 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("%dt", 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; }



