L1-048 矩阵A乘以B(15)
题目要求
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra行、Ca列,B有Rb行、Cb列,则只有Ca与Rb相等时,两个矩阵才能相乘。
输入格式
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。
输出格式
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出
Error: Ca != Rb
,其中Ca
是A的列数,Rb
是B的行数。
分析
本题涉及到矩阵的运算,首先明确,两矩阵相乘,前面矩阵A的列数和后面矩阵B的行数相等才能相乘,结果矩阵C的行数为A矩阵的行数,C的列数为B矩阵的列数
由于c++中没有直接进行矩阵操作的功能函数,因此可以采用数组或者vector等容器实现矩阵的存储和操作。本题可以采用vector容器实现,由于是二维矩阵,因此需要创建二维vector来存储矩阵元素,如用 vector<vector<int>>
来存储整数元素的矩阵。
- 使用vector进行矩阵运算用法如下
#include <iostream>
#include <vector>
using namespace std;
// 矩阵加法
void addMatrices(const vector<vector<int>>& A, const vector<vector<int>>& B, vector<vector<int>>& result) {
int ROW = A.size();
int COL = A[0].size();
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
result[i][j] = A[i][j] + B[i][j];
}
}
}
// 矩阵乘法
void multiplyMatrices(const vector<vector<int>>& A, const vector<vector<int>>& B, vector<vector<int>>& result) {
int ROW = A.size();
int COL = B[0].size();
int commonDim = A[0].size(); // A的列数和B的行数必须相同
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
result[i][j] = 0;
for (int k = 0; k < commonDim; k++) {
result[i][j] += A[i][k] * B[k][j];
}
}
}
}
// 打印矩阵
void printMatrix(const vector<vector<int>>& matrix) {
for (const auto& row : matrix) {
for (const auto& elem : row) {
cout << elem << " ";
}
cout << endl;
}
}
int main() {
// 定义2x2矩阵
vector<vector<int>> A = {
{1, 2}, {3, 4}};
vector<vector<int>> B = {
{5, 6}, {7, 8}};
// 创建结果矩阵,初始化为0
vector<vector<int>> result(2, vector<int>(2, 0));
// 矩阵加法
addMatrices(A, B, result);
cout << "矩阵加法结果:" << endl;
printMatrix(result);
// 矩阵乘法
multiplyMatrices(A, B, result);
cout << "矩阵乘法结果:" << endl;
printMatrix(result);
return 0;
}
代码
#include <iostream>
#include <vector>
using namespace std;
int main(){
int RA,CA,RB,CB,num; //A的行、列,B的行、列,
cin >> RA >> CA; //输入A的行、列
//创建一个包含 RA 个 vector<int>(CA) 的二维向量,存储A矩阵的容器
vector <vector<int>> matrixA(RA,vector<int>(CA));
for(int m = 0; m < RA; m++){
for(int n = 0;n < CA; n++){
cin >> num;
matrixA[m][n] = num;
}
}
cin >> RB >> CB; //输入B矩阵的行、列
vector <vector<int>> matrixB(RB,vector<int>(CB));
for(int m = 0; m < RB; m++){
for(int n = 0;n < CB; n++){
cin >> num;
matrixB[m][n] = num;
}
}
//结果矩阵,元素初始化为0
vector <vector<int>> matrixC(RA,vector<int>(CB,0));
// cout << CA <<" "<< RB <<endl;
//判断矩阵是否能够相乘 CA=RB?
//CA = RB可以相乘
if(CA == RB){
cout << RA <<" "<< CB << endl;;
for(int m = 0; m < RA; m++){
for(int n = 0;n < CB;n++){
for(int i = 0;i < CA;i++){
matrixC[m][n] += matrixA[m][i] * matrixB[i][n]; //乘积累加
}
}
}
for (const auto& row : matrixC) {
int mm = 1; //用于计算输出个数
for (int elem : row) {
if(mm < CB){
// cout << "CBe" << CB<<" ";
std::cout << elem << " ";
mm++;
// cout << "m" << mm << " ";
}else{
// cout << "CBo" << CB;
std::cout << elem << endl;
mm = 1;
}
}
}
}
//矩阵不能相乘
else if(CA != RB){
cout << "Error: " << CA << " != " << RB <<endl;
}
return 0;
}
标签:15,分题,矩阵,++,int,vector,result,048,const
From: https://blog.csdn.net/LxiazichengxiL/article/details/144991679