这个程序是大二上学期中秋前后完成的一个程序,是学完c语言和数据结构后写的第一个小项目
1.方法
用于转化的arr数组是一个行数为n(阶数),列数为2n的数组,前n列用于储存原数组,后n列在原数组转化的过程做相应的变换,最终左边n列化为最简型后,右边n列即为所求的逆矩阵
2.转化过程
2.1化为阶梯型
2.1.1 将原数组存入变换数组
//把矩阵存入新数组
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
arr[i][j]=a[i][j];
for (int i=0;i<n;i++){
arr[i][i+n]=1;
}
2.1.2 遍历每一行,将矩阵化为上三角型(阶梯型)
//遍历每一行,将矩阵化为上三角型(阶梯型)
for (int i=0;i<n-1;i++) {
int m=0;
while(arr[i][i]==0&&m<n-1-i){//如果i行i列为0,将该行放到末尾,其他行前移一行
//第i行的第i个为0,就将第i行放到末尾,其他行前移一行
for(int j=i;j<2*n;j++){
double temp=arr[i][j];
for(int k=i;k<n-1;k++){
arr[k][j]=arr[k+1][j];
}
arr[n-1][j]=temp;
}
m++;
if(m==n-1-i&&arr[i][i]==0){//i行以后任意行第i列都为0:秩小于n无逆矩阵
printf("该矩阵无逆矩阵\n");
return;
}
}
//将第i行的主元化为1
double flag=arr[i][i];flag:该行需要除以的数
for (int j = i; j < 2 * n; j++) {
arr[i][j] /= flag;
}
//将主元所在列其他元素化为0
for (int k = i+1; k<n;k++){//第i+1行到第n行的第i个元素化为0
double sign=arr[k][i];
for (int j=i;j<2*n;j++)
arr[k][j]=arr[k][j]-arr[i][j]*sign;
}
}
2.1.3计数矩阵的秩(秩小于n没有逆矩阵)
//第n行第n个不为1:将该列除以该数,化为1;
int result=(arr[n-1][n-1]==0);
if(result){
printf("该矩阵无逆矩阵\n");
return;
}
else if(arr[n-1][n-1]!=1){
double flag=arr[n-1][n-1];
//将第n行第n个元素化为1
for (int j = n-1; j < 2 * n; j++) {
arr[n-1][j] /= flag;
}
}
2.2阶梯型化为最简型
//将阶梯型化为最简型,arr数组的11-20列即为逆矩阵
for(int i=n-1;i>0;i--){
for(int k=i-1;k>=0;k--){
double flag=arr[k][i];
for(int j=0;j<2*n;j++){
arr[k][j]=arr[k][j]-arr[i][j]*flag;
}
}
}
2.3得到逆矩阵
//将逆矩阵存入a数组的第n到2n列
for(int i=0;i<n;i++){
for(int j=n;j<2*n;j++){
a[i][j]=arr[i][j];
}
}
3.运行截图
文章来源:https://www.toymoban.com/news/detail-718755.html
文章来源地址https://www.toymoban.com/news/detail-718755.html
4.完整代码
#include<stdio.h>
#define row 10
#define col 20
//初始化二维数组
void init(double arr[row][col]){
for(int i=0;i<10;i++){
for(int j=0;j<20;j++){
arr[i][j]=0;
}
}
}
/**********************show原矩阵******************************/
void showY(double arr[row][col],int n){//n为矩阵阶数
printf("---------------------------------------------\n");
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
printf("| %7.3lf\t",arr[i][j]);
}
printf("|\n\n");
}
printf("---------------------------------------------\n");
}
/**********************show逆矩阵******************************/
void showN(double arr[row][col],int n){
printf("---------------------------------------------\n");
for (int i=0;i<n;i++){
for (int j=n;j<2*n;j++){
printf("| %7.3lf\t",arr[i][j]);
}
printf("|\n\n");
}
printf("---------------------------------------------\n");
}
/**********************化为逆矩阵******************************/
/*
a:输入输出的数组
arr:中间数组
n:矩阵阶数
*/
void toInverse(double a[row][col],double arr[row][col],int n){
printf("原矩阵:\n");
showY(a,n);//输出原矩阵
/*--------化为阶梯型--------*/
//n为矩阵阶数
//把矩阵存入新数组
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
arr[i][j]=a[i][j];
for (int i=0;i<n;i++){
arr[i][i+n]=1;
}
//遍历每一行,将矩阵化为上三角型(阶梯型)
for (int i=0;i<n-1;i++) {
int m=0;
while(arr[i][i]==0&&m<n-1-i){//如果i行i列为0,将该行放到末尾,其他行前移一行
//第i行的第i个为0,就将第i行放到末尾,其他行前移一行
for(int j=i;j<2*n;j++){
double temp=arr[i][j];
for(int k=i;k<n-1;k++){
arr[k][j]=arr[k+1][j];
}
arr[n-1][j]=temp;
}
m++;
if(m==n-1-i&&arr[i][i]==0){//i行以后任意行第i列都为0:秩小于n无逆矩阵
printf("该矩阵无逆矩阵\n");
return;
}
}
//将第i行的主元化为1
double flag=arr[i][i];flag:该行需要除以的数
for (int j = i; j < 2 * n; j++) {
arr[i][j] /= flag;
}
//将主元所在列其他元素化为0
for (int k = i+1; k<n;k++){//第i+1行到第n行的第i个元素化为0
double sign=arr[k][i];
for (int j=i;j<2*n;j++)
arr[k][j]=arr[k][j]-arr[i][j]*sign;
}
}
//判断:阶梯型(n阶矩阵)第n行第n个为0:无逆矩阵;
//第n行第n个不为1:将该列除以该数,化为1;
int result=(arr[n-1][n-1]==0);
if(result){
printf("该矩阵无逆矩阵\n");
return;
}
else if(arr[n-1][n-1]!=1){
double flag=arr[n-1][n-1];
//将第n行第n个元素化为1
for (int j = n-1; j < 2 * n; j++) {
arr[n-1][j] /= flag;
}
}
/*--------求出逆矩阵--------*/
//将阶梯型化为最简型,arr数组的11-20列即为逆矩阵
for(int i=n-1;i>0;i--){
for(int k=i-1;k>=0;k--){
double flag=arr[k][i];
for(int j=0;j<2*n;j++){
arr[k][j]=arr[k][j]-arr[i][j]*flag;
}
}
}
//将逆矩阵存入a数组的第n到2n列
for(int i=0;i<n;i++){
for(int j=n;j<2*n;j++){
a[i][j]=arr[i][j];
}
}
//输出逆矩阵
printf("该矩阵的逆矩阵:\n");
showN(a,n);//输出逆矩阵
//将矩阵存入文件
FILE* fp=NULL;
fp=fopen("d:\\逆矩阵.txt","w");
for(int i=0;i<n;i++){
for(int j=n;j<2*n;j++){
fprintf(fp,"%-14.3lf",arr[i][j]);
}
fprintf(fp,"\n");
}
}
int main(){
int i,j,m,n;
double arr[row][col];//开辟一个新数组以进行临时储存
init(arr);//初始化临时数组
printf("请输入行数:");
scanf("%d",&m) ;
printf("请输入列数:");
scanf("%d",&n) ;
double a[row][col];//定义存储矩阵的数组
init(a);//初始化数组
FILE* fp;
fp = fopen("d:\\data.txt", "rb");//打开文件,如果文件不存在,则结束程序
if (fp == NULL)
{
printf("File not exist!");
return -1;
}
//读取文件中的值,依次保存到二维数组的各元素中
for ( i=0; i < m; i++)
{
for ( j=0; j < n; j++)
{
fscanf(fp, "%lf", &a[i][j]);//将文件中的值读到arr[][]数组中
}
}
fclose(fp);
if(m==n){
toInverse(a,arr,n);
}else{
printf("原矩阵:\n---------------------------------------------\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("| %7.3lf\t",a[i][j]);
}
printf("\n\n");
}
printf("---------------------------------------------\n");
printf("该矩阵无逆矩阵\n");
}
return 0;
}
到了这里,关于求逆矩阵程序(c语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!