1571:基础练习 矩阵乘法
Posted fengzeng666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1571:基础练习 矩阵乘法相关的知识,希望对你有一定的参考价值。
题目:https://acmore.cc/problem/LOCAL/1571#desc
解法一:二维数组(因为二维数组不能作为函数的返回值,所以处理起来比较麻烦,此时推荐使用vector表示二维数组,请看解法二)
1 #include <iostream> 2 3 using namespace std; 4 5 int a[30][30] = { 0 }; //初始矩阵 6 int b[30][30] = { 0 }; //结果矩阵 7 8 int getMultiSum(int a1[][30], int a2[][30], int m, int i, int j) //计算矩阵a1的第i行与矩阵a2的第j列相乘的结果,其中a1,a2是同为m阶的方阵 9 { 10 int result = 0; 11 for (int k = 0; k < m; ++k) 12 { 13 result += a1[i][k] * a2[k][j]; 14 } 15 return result; 16 } 17 18 19 int main() 20 { 21 int N, M; //N表示矩阵的阶数,M表示幂 22 while (cin >> N >> M) 23 { 24 for (int i = 0; i < N; ++i) 25 for (int j = 0; j < N; ++j) 26 cin >> a[i][j]; 27 28 switch (M) 29 { 30 case 0: //矩阵的零次方是单位矩阵 31 for (int i = 0; i < N; ++i) 32 b[i][i] = 1; 33 break; 34 35 case 1: 36 for (int i = 0; i < N; ++i) 37 for (int j = 0; j < N; ++j) 38 b[i][j] = a[i][j]; 39 40 case 2: 41 for (int i = 0; i < N; ++i) //i表示原矩阵的行 42 { 43 for (int j = 0; j < N; ++j) //j表示原矩阵的列 44 { 45 b[i][j] = getMultiSum(a, a, N, i, j); 46 } 47 48 } 49 break; 50 51 case 3: 52 int tmp[30][30]; 53 for (int i = 0; i < N; ++i) //i表示原矩阵的行 54 { 55 for (int j = 0; j < N; ++j) //j表示原矩阵的列 56 { 57 tmp[i][j] = getMultiSum(a, a, N, i, j); 58 } 59 60 } 61 for (int i = 0; i < N; ++i) //i表示原矩阵的行 62 { 63 for (int j = 0; j < N; ++j) //j表示原矩阵的列 64 { 65 b[i][j] = getMultiSum(a, tmp, N, i, j); 66 } 67 68 } 69 break; 70 71 case 4: 72 int tmp1[30][30]; 73 for (int i = 0; i < N; ++i) //i表示原矩阵的行 74 { 75 for (int j = 0; j < N; ++j) //j表示原矩阵的列 76 { 77 tmp1[i][j] = getMultiSum(a, a, N, i, j); 78 } 79 80 } 81 int tmp2[30][30]; 82 for (int i = 0; i < N; ++i) //i表示原矩阵的行 83 { 84 for (int j = 0; j < N; ++j) //j表示原矩阵的列 85 { 86 tmp2[i][j] = getMultiSum(a, tmp1, N, i, j); 87 } 88 89 } 90 for (int i = 0; i < N; ++i) //i表示原矩阵的行 91 { 92 for (int j = 0; j < N; ++j) //j表示原矩阵的列 93 { 94 b[i][j] = getMultiSum(a, tmp2, N, i, j); 95 } 96 97 } 98 99 break; 100 101 case 5: 102 int tmp3[30][30]; 103 for (int i = 0; i < N; ++i) //i表示原矩阵的行 104 { 105 for (int j = 0; j < N; ++j) //j表示原矩阵的列 106 { 107 tmp3[i][j] = getMultiSum(a, a, N, i, j); 108 } 109 110 } 111 int tmp4[30][30]; 112 for (int i = 0; i < N; ++i) //i表示原矩阵的行 113 { 114 for (int j = 0; j < N; ++j) //j表示原矩阵的列 115 { 116 tmp4[i][j] = getMultiSum(a, tmp3, N, i, j); 117 } 118 119 } 120 int tmp5[30][30]; 121 for (int i = 0; i < N; ++i) //i表示原矩阵的行 122 { 123 for (int j = 0; j < N; ++j) //j表示原矩阵的列 124 { 125 tmp5[i][j] = getMultiSum(a, tmp4, N, i, j); 126 } 127 128 } 129 for (int i = 0; i < N; ++i) //i表示原矩阵的行 130 { 131 for (int j = 0; j < N; ++j) //j表示原矩阵的列 132 { 133 b[i][j] = getMultiSum(a, tmp5, N, i, j); 134 } 135 136 } 137 138 139 break; 140 141 } 142 143 for (int i = 0; i < N; ++i) 144 { 145 int j = 0; 146 for (; j < N-1; ++j) 147 { 148 cout << b[i][j] << ‘ ‘; 149 } 150 cout << b[i][j] << endl; 151 } 152 } 153 154 return 0; 155 156 }
解法二: 使用vector代替二维数组
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 7 //矩阵a1与a2相乘,其中a1和a2都是N阶方阵,返回值为vector表示的二维数组 8 vector<vector<int>> matrixMul(vector<vector<int>>a1, vector<vector<int>>a2, int N) 9 { 10 vector<vector<int>> result(30); 11 for (int i = 0; i < N; ++i) 12 for (int j = 0; j < N; ++j) 13 result[i].push_back(0); //把结果矩阵置为0 14 15 16 for (int i = 0; i < N; i++) //矩阵乘法的三重循环 17 { 18 for (int j = 0; j < N; j++) 19 { 20 for (int k = 0; k < N; k++) 21 { 22 result[i][j] += a1[i][k] * a2[k][j]; 23 } 24 25 } 26 } 27 28 return result; 29 30 } 31 32 33 int main() 34 { 35 int N, M; //N表示矩阵的阶数,M表示幂 36 while (cin >> N >> M) 37 { 38 vector<vector<int>>a(30); //原矩阵 39 vector<vector<int>>b(30); //结果矩阵 40 int e; 41 for (int i = 0; i < N; ++i) 42 for (int j = 0; j < N; ++j) 43 { 44 cin >> e; 45 a[i].push_back(e); //输入原矩阵 46 } 47 48 for (int i = 0; i < N; ++i) 49 for (int j = 0; j < N; ++j) 50 b[i].push_back(0); //把结果矩阵初始化为0 51 52 if (M == 0) 53 { 54 for (int i = 0; i < N; ++i) 55 b[i][i] = 1; //矩阵的零次方为单位矩阵 56 } 57 else 58 { 59 b = a; //矩阵的一次方 60 if(M > 1) //矩阵的M次方(M大于1) 61 for (int i = 0; i < M - 1; ++i) 62 { 63 b = matrixMul(a, b, N); 64 } 65 } 66 67 68 for (int i = 0; i < N; ++i) //输出结果 69 { 70 int j = 0; 71 for (; j < N-1; ++j) 72 { 73 cout << b[i][j] << ‘ ‘; 74 } 75 cout << b[i][j] << endl; 76 } 77 } 78 79 return 0; 80 81 }
以上是关于1571:基础练习 矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章