文章目录
矩阵乘法
对于一些还没有学习《线性代数》的盆友们,对于矩阵相乘完全不知道该怎么操作,这就需要数学上的知识了。
首先我们需要了解矩阵的基本定义也可以说是规则吧。
矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(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有Rb 行、Cb 列,则只有Ca与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;
}