用C++实现矩阵的加法与乘法
矩阵是按照长方阵列排列的实数集合,在C语言中可以用二维数组来表示
若A是m*n的矩阵 ,在C++中可以创建一个二维数组A [m] [n],
用两个变量ij来描述矩阵中某一数的行与列即A [i] [j],如下是程序的一部分,
功能是录入一个已知的矩阵A中的元素
cout<<"输入矩阵A"<<endl;
cout<<"行数:"<<endl;
cin>>m;
cout<<"列数:"<<endl;
cin>>n;
int A[m][n]={0};//通过已知的矩阵行列数m、n,构建一个二维数组 A[m][n],其中有m*n个元素
cout<<"元素"<<endl;
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
cin>>A[i][j];//通过两层嵌套依次将每一个元素的值输入
}
}
要想实现两个矩阵的加法也并不难,只需两个矩阵对应行列的元素相加即可
以下是程序的第二部分,与上半部分同理
cout<<"输入矩阵B"<<endl;
cout<<"行数:"<<endl;
cin>>m;
cout<<"列数:"<<endl;
cin>>n;
cout<<"元素"<<endl;
int B[m][n]={0};
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
cin>>B[i][j];
}
}
因为加法需满足两矩阵行列数相等,所以两矩阵之和的行与列也是已知的
即C=A+B
则
cout<<"和为:"<<endl ;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
C[i][j]=A[i][j]+B[i][j];
cout<<C[i][j]<<' ';
}
cout<<endl;//在输出的时候要注意,因为是矩阵,所以每打完一行要换行,即当i(行)变动时,要换行
}
return 0;
}
将以上三部分合起来就是矩阵的加法了
接下来是矩阵的乘法
与加法不同的是,当两矩阵存在有意义的乘积时,必定其中一个矩阵的行与另一个矩阵的列的元素个数相等
设A为mp 的矩阵,B为pn的矩阵,那么称mn的矩阵C为矩阵A与B的乘积,即C=AB
要注意的是乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和
所以当涉及到乘法的时候,不仅要进行乘法运算,还有一个累加(求和)的过程
计算步骤是先对应项先相乘,再相加
在C++里 += 表示一个累加的过程
即c+=ab
用C++翻译该数学公式,
cout<<"积为:"<<endl ;
int C[m][n]={0};
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
for(k=0;k<p;++k)//k从1(下界)开始到p(上界),进行求和
{
C[i][j]+=A[i][k]*B[k][j];
}
}
}
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
cout<<C[i][j]<<' ';//最后把每一项都输出
}
cout<<endl;
}
return 0;
}
但是int一个二维数组属于静态分配,存在许多缺点,而使用malloc函数分配一个二维数组相比之下更灵活,需要用到二维指针进行分配
在使用malloc申请空间以后,可以用 free来释放
int (a)[n]=(int()[n])malloc(sizeof(int)mn); //定义一个数组作为指针,再申请出m*n大小的空间
二维指针是指向一维指针的地址
而在程序的最后用 free(a);来释放
注意:malloc的头文件
#include<stdio.h>
#include<malloc.h>
用malloc的二维指针替换之前的int二维数组
先来一个简单的程序,用二维指针,构建一个行列给定的矩阵(没有头文件)
int m,n,i,j;
cout<<"行数:"<<endl;
cin>>m;
cout<<"列数:"<<endl;
cin>>n;
int (*a)[n]=(int(*)[n])malloc(sizeof(int)*m*n);
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
cin>>a[i][j];
}
}
cout<<"该矩阵为:"<<endl;
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
这里有一点要注意的是,因为C=AB
其中A与B矩阵都是给定元素的,而C是未知的,或者说是要去求得的
而求解过程中要用到累加,所以C的二维数组一定要进行初始化(清零),不然定义了一个数组C但是初始值是随机的,会影响结果
用
memset(c,0,sizeof(int)mn);//注意m*n是C的元素个数,虽然C是位置的,但因为AB已知,所以C的行列数是已知的
所以,给出一个矩阵乘法的程序
输入两个已知矩阵 输出其的积
//矩阵相乘
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#include
using namespace std;
int main()
{
int m,n,i,j,k,p;
cout<<"输入矩阵A"<<endl;
cout<<"行数:"<<endl;
cin>>m;
cout<<"列数:"<<endl;
cin>>p;
int (*a)[p]=(int(*)[p])malloc(sizeof(int)*m*p);
//memset(a,0,sizeof(int)*m*p);
cout<<"元素:"<<endl;
for(i=0;i<m;++i)
{
for(j=0;j<p;++j)
{
cin>>a[i][j];
}
}
cout<<"输入矩阵B"<<endl;
cout<<"行数:"<<endl;
cin>>p;
cout<<"列数:"<<endl;
cin>>n;
int (*b)[n]=(int(*)[n])malloc(sizeof(int)*p*n);
//memset(b,0,sizeof(int)*p*n);
cout<<"元素:"<<endl;
for(i=0;i<p;++i)
{
for(j=0;j<n;++j)
{
cin>>b[i][j];
}
}
int (*c)[n]=(int(*)[n])malloc(sizeof(int)*m*n);
memset(c,0,sizeof(int)*m*n);
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
for(k=0;k<p;++k)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
cout<<"乘积为:"<<endl;
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
cout<<c[i][j]<<' ';
}
cout<<endl;
}
free(a);
free(b);
free(c);
return 0;
}