矩阵相乘
输入矩阵的行列,分别输入两个矩阵,输出矩阵相乘的结果
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cout<<"请输入两矩阵的行列:"<<endl;
cin>>a>>b>>c; //分别录入第一个矩阵的行,两矩阵共同行列,第二个矩阵的列
int X[a][b],Y[b][c],Z[a][c]; //开辟三个二维数组存储矩阵,注意相乘结果的行列值
cout<<"请输入第一个矩阵:"<<endl;
for(int i=0;i<a;i++){ //矩阵的行
for(int j=0;j<b;j++){ //矩阵的列
cin>>X[i][j];
}
}
cout<<"请输入第二个矩阵:"<<endl;
for(int i=0;i<b;i++){ //矩阵的行
for(int j=0;j<c;j++){ //矩阵的列
cin>>Y[i][j];
}
}
memset(Z,0,sizeof(Z)); //将二维数组Z初始化为0
//int temp=0;
cout<<"矩阵相乘的结果为:"<<endl;
for(int i=0;i<a;i++){
for(int j=0;j<c;j++){
for(int k=0;k<b;k++){
Z[i][j]=Z[i][j]+X[i][k]*Y[k][j]; //行与列的乘积和为相应结果值
//temp=temp+X[i][k]*Y[k][j];
}
cout<<Z[i][j]<<" "; //计算完一个后输出
//cout<<temp<<" ";
//temp=0;
}
cout<<endl; //计算完一列后输出换行
}
return 0;
}
//本程序也可以不开辟存放结果的二维数组矩阵,直接将结果累加到temp中进行输出,
//当输出后重新将temp中的值置0
注意memset函数:
-
memset函数实现对指定内存空间初始化的作用。
memset(Z,0,sizeof(Z)); //将二维数组Z初始化为0 -
int float long string sizeof函数返回数组元素空间的4倍数(一元素占4字节)
char sizeof函数返回数组元素空间大小(一元素占1字节)
double sizeof函数返回数组元素空间8倍数(一元素占8字节)
将矩阵相乘的方法体拿出来
#include<bits/stdc++.h>
using namespace std;
int jzcheng(int *q, int *w, int h, int l, int k) //定义两个指针,指向二维数组变为一维数组后的首地址
{
int Z[h][k]; //h*k
// memset(Z, 0, sizeof(Z)); //将二维数组Z初始化为0
//int temp=0;
//cout<<"矩阵相乘的结果为:"<<endl;
//cout<<'\n';
for(int i = 0; i < h; i++)
{
for(int j = 0; j < k; j++)
{
Z[i][j]=0;
for(int n = 0; n < l; n++)
{
Z[i][j] = Z[i][j] + q[i * l + n] * w[n * k + j]; //行与列的乘积和为相应结果值,认真思考为什么是这样,看作一维数组
//temp=temp+X[i][k]*Y[k][j];
}
cout << Z[i][j] << " "; //计算完一个后输出
//cout<<temp<<" ";
//temp=0;
}
cout<<'\n';
}
}
int main()
{
int a, b, c;
cout << "请输入两矩阵的行列:" << endl;
cin >> a >> b >> c; //分别录入第一个矩阵的行,两矩阵共同行列,第二个矩阵的列
int X[a][b], Y[b][c]; //开辟三个二维数组存储矩阵,注意相乘结果的行列值
cout << "请输入第一个矩阵:" << endl;
for(int i = 0; i < a; i++) //矩阵的行
{
for(int j = 0; j < b; j++) //矩阵的列
{
cin >> X[i][j];
}
}
cout << "请输入第二个矩阵:" << endl;
for(int i = 0; i < b; i++) //矩阵的行
{
for(int j = 0; j < c; j++) //矩阵的列
{
cin >> Y[i][j];
}
}
jzcheng(*X, *Y, a, b, c);
//也可写作jzcheng(X[0], Y[0], a, b, c);均代表以a[0][0]为首元素的一维数组;可用作指针
return 0;
}
//本程序也可以不开辟存放结果的二维数组矩阵,直接将结果累加到temp中进行输出,
//当输出后重新将temp中的值置0
用vector定义二维数组,避免指针情况
#include<bits/stdc++.h>
using namespace std;
int jzcheng(vector<vector<int> >X, vector<vector<int> >Y, int h, int l, int k)
{
int Z[h][k];//h*k
memset(Z, 0, sizeof(Z)); //将二维数组Z初始化为0
//int temp=0;
cout<<"矩阵相乘的结果为:"<<endl;
//cout<<'\n';
for(int i = 0; i < h; i++)
{
for(int j = 0; j < k; j++)
{
//Z[i][j]=0;
for(int n = 0; n < l; n++)
{
Z[i][j] = Z[i][j] + X[i][n] * Y[n][j]; //行与列的乘积和为相应结果值
//temp=temp+X[i][k]*Y[k][j];
}
cout << Z[i][j] << " "; //计算完一个后输出
//cout<<temp<<" ";
//temp=0;
}
cout<<'\n';
}
}
int main()
{
int a, b, c;
cout << "请输入两矩阵的行列:" << endl;
cin >> a >> b >> c; //分别录入第一个矩阵的行,两矩阵共同行列,第二个矩阵的列
vector<vector<int> >X;
vector<vector<int> >Y;
X.resize(a);
for(int i=0;i<X.size();i++){
X[i].resize(b);
}
Y.resize(b);
for(int i=0;i<Y.size();i++){
Y[i].resize(c);
} //开辟三个二维数组存储矩阵,注意相乘结果的行列值
cout << "请输入第一个矩阵:" << endl;
for(int i = 0; i < a; i++) //矩阵的行
{
for(int j = 0; j < b; j++) //矩阵的列
{
cin >> X[i][j];
}
}
cout << "请输入第二个矩阵:" << endl;
for(int i = 0; i < b; i++) //矩阵的行
{
for(int j = 0; j < c; j++) //矩阵的列
{
cin >> Y[i][j];
}
}
jzcheng(X, Y, a, b, c);
return 0;
}
//本程序也可以不开辟存放结果的二维数组矩阵,直接将结果累加到temp中进行输出,
//当输出后重新将temp中的值置0