用C++二维指针实现矩阵的加法与乘法

用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+=a
b
在这里插入图片描述
用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;  

}

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值