⽤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为m p 的矩阵,B为p n的矩阵,那么称m n的矩阵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)
sizeof 指针
{
cout<<C[i][j]<<' ';//最后把每⼀项都输出
}
cout<<endl;
}
return 0;
}
但是int⼀个⼆维数组属于静态分配,存在许多缺点,⽽使⽤malloc函数分配⼀个⼆维数组相⽐之下更灵活,需要⽤到⼆维指针进⾏分配在使⽤malloc申请空间以后,可以⽤ free来释放
int (a)[n]=(int()[n])malloc(sizeof(int)m n); //定义⼀个数组作为指针,再申请出m*n⼤⼩的空间
⼆维指针是指向⼀维指针的地址
⽽在程序的最后⽤ free(a);来释放
注意:malloc的头⽂件
#include<stdio.h>
#include<malloc.h>
⽤malloc的⼆维指针替换之前的int⼆维数组
先来⼀个简单的程序,⽤⼆维指针,构建⼀个⾏列给定的矩阵(没有头⽂件)
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)m n);//注意m*n是C的元素个数,虽然C是位置的,但因为AB已知,所以C的⾏列数是已知的
所以,给出⼀个矩阵乘法的程序
输⼊两个已知矩阵 输出其的积
//矩阵相乘
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#include
using namespace std;
int main()
{
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;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。