C++实现矩阵乘法 | L1-048 矩阵A乘以B (15分)

矩阵乘法

对于一些还没有学习《线性代数》的盆友们,对于矩阵相乘完全不知道该怎么操作,这就需要数学上的知识了。
首先我们需要了解矩阵的基本定义也可以说是规则吧。

矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义 [1] 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。

这个是两个行列都一样的矩阵:
在这里插入图片描述
这是两个行列不太一样的矩阵:
在这里插入图片描述

规则:
1、矩阵A的列数等于矩阵B的行数时,A与B可以相乘。
2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。
下面是对规则3的解释:
在这里插入图片描述
这个图很形象,累乘相加就完事儿了。



下面附上C++代码

#include<iostream>
#include<string>

using namespace std;

int main()
{
	int a[105][105] = {0};//存储第一个矩阵 
	int b[105][105] = {0};//存储第二个矩阵 
	int c[105][105] = {0};//存储相乘后的矩阵
	
	int m,n;
	cout << "请输入矩阵A的行数和列数:"; 
	cin >> m >> n;
	
	int o,p;
	cout << "请输入矩阵B的行数和列数:";
	cin >> o >> p;
	
	cout << "输入矩阵A:" << endl;
	for(int i = 0; i < m;i ++)
		for(int j = 0; j < n; j ++)
		cin >> a[i][j];
	
	cout << "输入矩阵B:" << endl;
	for(int i = 0; i < o; i++)
		for(int j = 0; j < p; j ++)
		cin >> b[i][j]; 	
	
	for (int i = 0;i < m;i++) //累成相加 
		for (int j = 0;j < p;j++) 
            for (int l = 0;l < n;l++) 
                c[i][j] += a[i][l] * b[l][j];

    cout << endl  << "矩阵A乘以矩阵B的结果:" << endl;
    for (int i = 0; i < m; i ++ ) {
        for (int j = 0; j < p; j ++ ) 
            cout << c[i][j] << "   ";
    cout << endl;
    }
	
	return 0;
}

给一组数据我们来测试下代码是否正确:
在这里插入图片描述


附上一题:

L1-048 矩阵A乘以B (15分)

给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra行、Ca列,B有R​b 行、Cb 列,则只有C​a与Rb相等时,两个矩阵才能相乘。

输入格式:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1

2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8

输出样例1:

2 4
20 22 24 16
53 58 63 28

输入样例2:

3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72

输出样例2:

Error: 2 != 3

AC代码呈上(依据模板代码修改即可):

#include<iostream>
#include<string>

using namespace std;

int main()
{
	int a[105][105] = {0};//存储第一个矩阵 
	int b[105][105] = {0};//存储第二个矩阵 
	int c[105][105] = {0};//存储相乘后的矩阵
	
	int m,n;
//	cout << "请输入矩阵A的行数和列数:"; 
	cin >> m >> n;
//	cout << "输入矩阵A:" << endl;
	for(int i = 0; i < m;i ++)
		for(int j = 0; j < n; j ++)
		cin >> a[i][j];
	
	int o,p;
//	cout << "请输入矩阵B的行数和列数:";
	cin >> o >> p;
	

//	cout << "输入矩阵B:" << endl;
	for(int i = 0; i < o; i++)
		for(int j = 0; j < p; j ++)
		cin >> b[i][j]; 	
	
	if(n != o)
	{
		cout << "Error: " << n <<" != " << o;
		return 0;
	}
	
	for (int i = 0;i < m;i++) //累成相加 
		for (int j = 0;j < p;j++) 
            for (int l = 0;l < n;l++) 
                c[i][j] += a[i][l] * b[l][j];	
                
	cout << m <<" "<< p << endl; 
//   cout << endl  << "矩阵A乘以矩阵B的结果:" << endl;
    for (int i = 0; i < m; i ++ ) 
        for (int j = 0; j < p; j ++ ) 
            if(j != p - 1)cout << c[i][j] << " ";
            else cout << c[i][j] << endl;
	
	return 0;
}
原创文章 50 获赞 139 访问量 2万+

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/105271313