题解 | #矩阵乘法#
矩阵乘法
http://www.nowcoder.com/practice/ebe941260f8c4210aa8c17e99cbc663b
题目的主要信息:
如果A是个x行y列的矩阵,B是个y行z列的矩阵,要求计算A和B相乘得到的x行z列的矩阵C。
方法一:
如果A是个x行y列的矩阵,B是个y行z列的矩阵,矩阵C为矩阵A与B的乘积,其中矩阵C中的第i行第j列元素可以表示为:
用一个三重循环实现这个公式。最后再输出C。
具体做法:
#include<iostream>
#include<vector>
using namespace std;
int main(){
int x, y, z;
while (cin >> x >> y >> z){
vector<vector<int>> A(x, vector<int>(y, 0));
vector<vector<int>> B(y, vector<int>(z, 0));
vector<vector<int>> C(x, vector<int>(z, 0));
for(int i = 0; i < x; ++i){//输入矩阵A
for(int j = 0; j < y; ++j)
cin >> A[i][j];
}
for(int i = 0; i < y; ++i){//输入矩阵B
for(int j = 0; j < z; ++j)
cin >> B[i][j];
}
for(int i = 0; i < x; ++i){//计算C[i][j]的值
for(int j = 0; j < z; ++j)
for(int k = 0; k < y; ++k)//A的第i行和B的第j列相乘的结果为C[i][j]
C[i][j] += A[i][k] * B[k][j];
}
for(int i = 0; i < x; ++i){//输出C
for(int j = 0; j < z-1; ++j)
cout << C[i][j] << " ";
cout << C[i][z-1] << endl;
}
}
return 0;
}
复杂度分析:
- 时间复杂度:,三重for循环计算C中的值。
- 空间复杂度:,只用了常数空间。
方法二:
改变三重for循环的顺序,从逐个值计算变为逐行计算,可以加快程序运行的速度。
具体做法:
#include<iostream>
#include<vector>
using namespace std;
int main(){
int x, y, z;
while (cin >> x >> y >> z){
vector<vector<int>> A(x, vector<int>(y, 0));
vector<vector<int>> B(y, vector<int>(z, 0));
vector<vector<int>> C(x, vector<int>(z, 0));
for(int i = 0; i < x; ++i){//输入矩阵A
for(int j = 0; j < y; ++j)
cin >> A[i][j];
}
for(int i = 0; i < y; ++i){//输入矩阵B
for(int j = 0; j < z; ++j)
cin >> B[i][j];
}
for(int i = 0; i < x; ++i){
for(int j = 0; j < y; ++j){
for(int k = 0; k < z; ++k){//计算C第i行的值
C[i][k] += A[i][j] * B[j][k];
}
}
}
for(int i = 0; i < x; ++i){//输出C
for(int j = 0; j < z-1; ++j)
cout << C[i][j] << " ";
cout << C[i][z-1] << endl;
}
}
return 0;
}
复杂度分析:
- 时间复杂度:,逐行计算,三重for循环计算C中的值。
- 空间复杂度:,只用了常数空间。