矩阵的乘法和求逆(C语言实现)

来源:互联网 发布:淘宝买车怎么买 编辑:程序博客网 时间:2024/05/21 22:37

文章分为两个部分:

1、用C语言实现矩阵的相乘

2、用C语言实现矩阵的求逆


1、矩阵的相乘


/************************************************************************ 函数名称:* MatricMul()**函数参数:*  int a[]  -第一个矩阵*  int b[]  -第二个矩阵*  int c[]  -结果矩阵*  int m    -第一个矩阵为m行*  int Middle  -第一个矩阵为Middle列,第二个矩阵为Middle行*  int n    -第二个矩阵为n列*  返回值: 无返回值**  说明:无***********************************************************************/void MatricMul(int a[],int b[],int c[],int m,int Middle,int n){for (int i=0;i<m;i++ ){for (int j=0;j<n;j++){int sum = 0;for (int k=0;k<Middle;k++){sum += a[i*Middle+k] * b[k*n+j];}c[i*n+j] = sum;}}}

2、矩阵求逆

此程序使用的是初等变换法。

/*********************************************************************** * 函数名称: * MatrixOpp * *函数参数: *  double a[]       -原始矩阵 *  double result[]  -结果矩阵 *  *  返回值: 无返回值 * *  说明:矩阵的维数需要定义,且需要定义为常量型的,需要注意***********************************************************************/  void MatrixOpp(double a[], double result[]){int const M=3;     //矩阵的维数int const N =2*M;  //增广矩阵的列数double b[M][N];    //增广矩阵int i,j,k;for(i=0;i<M;i++){for(j=0;j<M;j++){b[i][j]=a[i*M+j];}}/*****************扩展矩阵***********************/for(i=0;i<M;i++){for(j=M;j<N;j++){if(i==(j-M)){b[i][j]=1;}else{b[i][j]=0;}}}/*****************扩展矩阵***********************//*****************求逆模块***********************/for(i=0;i<M;i++){if(b[i][i]==0){for(k=i;k<M;k++){if(b[k][k]!=0){for(int j=0;j<N;j++){double temp;temp=b[i][j];b[i][j]=b[k][j];b[k][j]=temp;}break;}}if(k==M){cout<<"该矩阵不可逆!"<<endl;}}for(j=N-1;j>=i;j--){b[i][j]/=b[i][i];}for(k=0;k<M;k++){if(k!=i){double temp=b[k][i];for(j=0;j<N;j++){b[k][j]-=temp*b[i][j];}}}}/*****************求逆模块***********************//*****************导出结果***********************/for(i=0;i<M;i++){for(j=M;j<N;j++){result[i*M+j-3]=b[i][j];}}/*****************导出结果***********************/for(i=0;i<M;i++){for(j=0;j<M;j++){cout<<result[i*M+j]<<" ";}cout<<endl;}}

扩充:超定方程的最小二乘求解


通过计算矩阵的转置、矩阵的逆、以及矩阵相乘,最终得到超定方程的最小二乘解。


0 0
原创粉丝点击