本贴分享用C++实现矩阵乘法计算的功能,具体内容请看代码和注释,这里单独说一明一部分代码块。
1.采用vector< vector<int>>的方式,可以实现无限度的二维动态数组,需要注意的是,对于C++来说a[m][n]的写法是合法的,而对于C语言则不行,必须采用malloc开辟空间等操作
2.对于vector< vector<int>>来说,其元素为vector<int> ,此处必须借助中间变量的方式,
如vector<int> V1=V[i],然后 int i =V1[i],才能获取到数字元素
3.即便C++允许a[m][n],但是一定要记得初始化,不然可能会得到想象不到的结果
4.后期为了方便对列操作,新开辟了a[m][n]格式的数组,二维vector不利于对列操作
5.对于核心计算部分的三循环,第一层和第二层分别用来控制行标和列标,第三层才是真正的乘法计算,1号矩阵的行元素对应与2号矩阵的列元素相乘,再累加,得到的结果即为当前位置上矩阵的值
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv) {
int m1=0,m2=0,n1=0,n2=0; //定义两个矩阵的行数和列数
int num1=0,num2=0; //两个矩阵的元素总数
cout<<"请输入矩阵1的行数与列数:"<<endl;
cin>>m1>>n1;
cout<<"请输入矩阵2的行数与列数:"<<endl;
cin>>m2>>n2;
if(m2!=n1)
{
cout<<"当前两个矩阵不能进行乘法运算!"<<endl;
return 0;
}
//创建两个矩阵并打印
vector< vector<int> >V1;
vector< vector<int> >V2;
cout<<"请读入矩阵1:"<<endl;
for(int i=0;i<=m1-1;i++) //外层循环,控制行数向下移动
{
vector<int> T1;
for(int j=0;j<=n1-1;j++) //内层循环,控制列数向左移动
{
int temp=0;
cin>>temp;
T1.push_back(temp);
}
V1.push_back(T1);
}
cout<<"请读入矩阵2:"<<endl;
for(int i=0;i<=m2-1;i++)
{
vector<int> T2;
for(int j=0;j<=n2-1;j++)
{
int temp=0;
cin>>temp;
T2.push_back(temp);
}
V2.push_back(T2);
}
cout<<"输入的矩阵1如下:"<<endl;
for(int i=0;i<=m1-1;i++) //外层循环控制行数向下移动
{
vector<int> C1=V1[i];
for(int j=0;j<=n1-1;j++) //内层循环控制列数向左移动
{
cout<<C1[j]<<" ";
}
cout<<endl;
}
cout<<"输入的矩阵2如下:"<<endl;
for(int i=0;i<=m2-1;i++) //外层循环控制行数向下移动
{
vector<int> C2=V2[i];
for(int j=0;j<=n2-1;j++) //内层循环控制列数向左移动
{
cout<<C2[j]<<" ";
}
cout<<endl;
}
int A1[m1][n1],A2[m2][n2];
for(int i=0;i<=m1-1;i++) //外层循环,控制行数向下移动
{
vector<int> C1=V1[i];
for(int j=0;j<=n1-1;j++) //内层循环,控制列数向左移动
{
A1[i][j]=C1[j];
}
cout<<endl;
}
for(int i=0;i<=m2-1;i++)
{
vector<int> C2=V2[i];
for(int j=0;j<=n2-1;j++)
{
A2[i][j]=C2[j];
}
cout<<endl;
}
int A3[m1][n2];
for(int i=0;i<=m1-1;i++)
{
for(int j=0;j<=n2-1;j++)
{
A3[i][j]=0;
}
}
//计算第a行和第b列的元素乘积累和
for(int a=0;a<=m1-1;a++) //外层控制行标
{
for(int b=0;b<=n2-1;b++) //里层控制列标
{
int sum=0;
for(int i=0;i<=m2-1;i++)
{
int temp=0;
temp=A1[a][i]*A2[i][b];
//对应位置相乘
sum+=temp;
//再累加
}
A3[a][b]=sum;
}
}
for(int i=0;i<=m1-1;i++)
{
for(int j=0;j<=n2-1;j++)
{
cout<<A3[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
对于矩阵:1 2 3;4 5 6和1 2;3 4 ;5 6相乘的结果如下图,与手算和MATLAB计算保持一致