| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4312 人关注过本帖
标题:[原创]求一个n阶矩阵的逆矩阵!
只看楼主 加入收藏
jessie
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-7-8
收藏
 问题点数:0 回复次数:2 
[原创]求一个n阶矩阵的逆矩阵!

#include <stdlib.h> #define N 20

#include <iostream> using namespace std;

float b1[N][2*N]; /*用于存放原矩阵扩展后的n*2n矩阵*/ float a[N][N]; /*用于存放输入的矩阵*/ float b[N][N]; /*与原矩阵相同*/ float e[N][N]; /*单位矩阵*/ float c[N][N]; /*用于存放求出的逆矩阵*/ float x[(N-1)*(N-1)];

int n; /*矩阵的阶数*/

float JudgeMatrix(float a[N][N],int n); /*用于判断原矩阵是否存在逆矩阵*/ void BuildE(int n); /*建立单位矩阵*/ void Enlarge(float a[N][N], float e[N][N],int n); /*扩展原矩阵*/ void ShangSanJiao(float b1[N][2*N],int n); /*把扩展后的矩阵的前一半化为上三角*/ void DuiJiaoXian(float b1[N][2*N],int n); /*把前一半化为上三角后的扩展矩阵的前一半的对角线元素化1*/ void DanWei(float b1[N][2*N]); /*把前一半的对角线化1后的扩展矩阵的前一半化为单位矩阵*/ void QuChu(float b1[N][2*N]); /*把进行初等变换后的扩展矩阵的后一半取出*/ void Error(void); /*若输入数据出错,显示错误*/

int Input() /*用于输入矩阵阶数和矩阵各元素*/ { int i,j;

printf("请输入是几阶矩阵: "); scanf("%d",&n); /*输入矩阵阶数*/ if(n>20) /*判断输入的矩阵的阶数是否过大*/ { printf("输入矩阵过大!\n"); Error(); }

for(i=0;i<n;i++) { printf("请按顺序输入矩阵的第 %d 行元素:\n",i); for(j=0;j<n;j++) { scanf("%f",&a[i][j]); /*输入矩阵各元素*/ } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { b[i][j]=a[i][j]; printf("%f ",a[i][j]); /*输出原矩阵*/ } printf("\n"); } return n; }

void BuildE(int n) /*建立一个n阶的单位矩阵e*/ {int i,j;

for(i=0;i<n;i++) { for(j=0;j<n;j++) { e[i][j]=0; /*把矩阵的所有元素赋值为0*/ } } for(i=0;i<n;i++) { e[i][i]=1; /*把1赋值给矩阵的对角线元素*/ }

printf("单位矩阵为:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%f ",e[i][j]); /*输出单位矩阵*/ } printf("\n"); }

}

void Enlarge(float b[N][N],float e[N][N],int n)/*建立一个n*2n的矩阵b1,把原矩阵a赋值给前一半,把单位矩阵e赋值给另一半*/ { int i,j; int m2,n2,k; for(m2=0;m2<n;m2++) { for(n2=0;n2<n;n2++) b1[m2][n2]=b[m2][n2]; /*把原矩阵的元素赋值给n*2n矩阵的前一半*/ for(k=0,n2=n;k<n,n2<2*n;k++,n2++) b1[m2][n2]=e[m2][k]; /*把单位矩阵赋值给n*2n矩阵的后一半*/ }

printf("扩展后矩阵为:\n"); for(i=0;i<n;i++) { for(j=0;j<2*n;j++) { printf("%f ",b1[i][j]); /*输出扩展后的矩阵*/ } printf("\n"); }

}

void ShangSanJiao(void) /*把矩阵前一半化为上三角矩阵*/ { int k,m2,n2,i,l,j; float s[2*N]; if(b1[0][0]==0) /*判断矩阵的第0行第0个元素是否是0,若是,查找下面的第0列第i行元素是否是0,若不是,把这行与第一行交换*/ { l=1; while(b1[l][0]==0&&l<n-1) { l++; } for(j=0;j<2*n;j++) { s[j]=b1[l][j]; b1[l][j]=b1[0][j]; b1[0][j]=s[j]; }

printf("juzhne:\n"); /*若矩阵的行进行了交换,则输出进行行交换后的矩阵*/ for(i=0;i<n;i++) { for(j=0;j<2*n;j++) { printf("%f ",b1[i][j]); } printf("\n"); } } for(k=0;k<n-1;k++) /*把n*2n矩阵的前一半化为上三角*/ { for(m2=k+1;m2<n;m2++) x[m2]=b1[m2][k]/b1[k][k]; for(m2=k+1;m2<n;m2++) { for(n2=0;n2<2*n;n2++) b1[m2][n2]=b1[m2][n2]-b1[k][n2]*x[m2]; } }

printf("上三角矩阵b1:\n"); for(m2=0;m2<n;m2++) /*把矩阵前一半化成上三角后的矩阵输出*/ { for(n2=0;n2<2*n;n2++) printf("%f ", b1[m2][n2]); printf("\n"); } printf("\n");

}

void DuiJiaoXian(float b1[N][2*N],int n) /*把矩阵前一半的对角线上元素化1*/ { int m2,n2,i; for(m2=n-1,i=n-1;m2>=0,i>=0;m2--,i--) { x[i]=b1[m2][m2]; } for(m2=n-1,i=n-1;m2>=0,i>=0;m2--,i--) { for(n2=0;n2<2*n;n2++)

b1[m2][n2]=b1[m2][n2]/x[i]; }

printf("对角线为1的矩阵b1:\n"); for(m2=0;m2<n;m2++) /*把矩阵前一半的对角线上化1后输出*/ { for(n2=0;n2<2*n;n2++) printf("%f ", b1[m2][n2]); printf("\n"); }

printf("\n");

}

void DanWei(void) /*把矩阵前一半化为单位矩阵*/ { int m2,n2,k,i; for(m2=0;m2<n-1;m2++) { for(k=m2+1,i=1;k<n,i<n;k++,i++) { x[i]=b1[m2][k]; for(n2=0;n2<2*n;n2++) b1[m2][n2]=b1[m2][n2]-b1[k][n2]*x[i]; } }

printf("前一半为单位矩阵的矩阵b1:\n"); for(m2=0;m2<n;m2++) /*把矩阵前一半化为单位矩阵后输出*/ { for(n2=0;n2<2*n;n2++) printf("%f ", b1[m2][n2]); printf("\n"); }

printf("\n"); }

void QuChu(void) /*把矩阵b1的前一半赋值给c并输出,即为原矩阵的逆矩阵*/ {int i,j,m;

for(i=0;i<n;i++) { for(j=0,m=n;j<n,m<2*n;j++,m++) c[i][j]=b1[i][m]; }

printf("要求的逆矩阵是:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%f ",c[i][j]); /*输出求出的逆矩阵*/ printf("\n"); }

}

float JudgeMatrix(float a[N][N],int n) /*判断原矩阵是否存在逆矩阵*/ { int i,j,k,l ; float D=1.0 ; float s[N]; if(a[0][0]==0) /*判断矩阵的第0行第0个元素是否是0,若是,查找下面的第0列第i行元素是否是0,若不是,把这行与第一行交换*/ { l=1; while(a[l][0]==0&&l<n-1) { l++; } for(j=0;j<n;j++) { s[j]=a[l][j]; a[l][j]=a[0][j]; a[0][j]=s[j]; } } printf("juzhne:\n"); /*若矩阵的行进行了交换,则输出进行行交换后的矩阵*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%f ",a[i][j]); } printf("\n"); } for(k=0;k<n-1;k++) /*把矩阵化为上三角矩阵*/ { for(i=k+1;i<n;i++) x[i]=a[i][k]/a[k][k]; for(i=k+1;i<n;i++) { for(j=0;j<n;j++) a[i][j]=a[i][j]-a[k][j]*x[i]; } } for(i=0,j=0;i<n,j<n;i++,j++) /*求出矩阵的矩阵的行列式的值*/ D=D*a[i][j]; return(D); }

void Error(void) /*显示错误并退出程序*/ { printf("Input ERROR!\n"); exit(1); }

void main() {

Input(); /*调用输入函数*/

if(JudgeMatrix(a,n)==0) /*调用JudgeMatrix函数,判断矩阵是否存在逆矩阵*/ { printf("D=0,没有逆矩阵!"); exit(1); /*不存在逆矩阵,退出程序*/ } BuildE(n); Enlarge(b,e,n); ShangSanJiao(); DuiJiaoXian(b1,n); DanWei(); QuChu(); } 请多多指教!

搜索更多相关主题的帖子: 矩阵 float include std 
2005-07-10 13:08
147043838
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2005-5-15
收藏
得分:0 
复杂复杂了
2005-07-11 11:30
jessie
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2005-7-8
收藏
得分:0 
函数声明上有注解,看了应该很容易懂的啊,至少我用的都是最最基础的c 知识了.
2005-07-11 12:57
快速回复:[原创]求一个n阶矩阵的逆矩阵!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015281 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved