当前位置:首页 » 编程软件 » 编程矩阵求逆

编程矩阵求逆

发布时间: 2022-06-03 00:41:13

❶ !!!跪求c语言实现矩阵运算(加,减,乘、求逆、转置)

#include<stdio.h>
#include<math.h>

void jiafa()
{
int m,n;
float a[20][20],b[20][20],c[20][20];
int i,j;

printf("请输入矩阵行数:");
scanf("%d",&m);
printf("请输入矩阵列数:");
scanf("%d",&n);

printf("请输入第一个矩阵:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);

printf("请输入第二个矩阵:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&b[i][j]);

printf("矩阵相加的结果为:");
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
{
c[i][j]=a[i][j]+b[i][j];
printf("%4f ",c[i][j]);
}
printf("\n");
}
}

void jianfa()
{
int m,n;
float a[20][20],b[20][20],c[20][20];
int i,j;

printf("请输入矩阵行数:");
scanf("%d",&m);
printf("请输入矩阵列数:");
scanf("%d",&n);

printf("请输入第一个矩阵:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);

printf("请输入第二个矩阵:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&b[i][j]);

printf("矩阵相减的结果为:");
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
{
c[i][j]=a[i][j]-b[i][j];
printf("%4f ",c[i][j]);
}
printf("\n");
}
}

void chengfa()
{
int m,n;
float s;
float a[20][20],b[20][20],c[20][20];
int i,j,k;

printf("请输入矩阵行数:");
scanf("%d",&m);
printf("请输入矩阵列数:");
scanf("%d",&n);

printf("请输入第一个矩阵:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);

printf("请输入第二个矩阵:");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%4f",&b[i][j]);

for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
s=0;
for(k=0;k<n;k++)
{
s=s+a[i][k]*b[k][j];
c[i][j]=s;
}
}
}
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
printf("%4f ",c[i][j]);
}
printf("\n");
}
}

void zhuan()
{
int m,n;
float a[20][20],b[20][20];
int i,j;

printf("请输入矩阵行数:");
scanf("%d",&m);
printf("请输入矩阵列数:");
scanf("%d",&n);

printf("请输入一个矩阵:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);

for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
b[i][j]=a[j][i];
printf("%4f ",b[i][j]);
}
printf("\n");
}
}

void qiuni()
{
int N;
printf("输入矩阵的阶数N:\n");
scanf("%d",&N);
float a[10][10],b[10][20],c[10][10],t;
int i,j,m;
printf("请输入行列式不为0的矩阵A(%d阶):\n",N); //矩阵A的各元素存入二维数组a中。
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%f",&a[i][j]);
//增广矩阵(A|E)存入二维数组b中
for(i=0;i<N;i++)
for(j=0;j<N;j++)
b[i][j]=a[i][j];

for(i=0;i<N;i++)
for(j=N;j<2*N;j++)
b[i][j]=0;

for(i=0;i<N;i++)
b[i][N+i]=1;

for(m=0;m<N;m++) //对每行进行处理。
{
t=b[m][m]; //预存b[m][m]。
i=m;
while(b[m][m]==0)
{
b[m][m]=b[i+1][m];
i++;
}

if(i>m)
{
b[i][m]=t; //实现交换。

//交换其它各列相应位置的元素
for(j=0;j<m;j++)
{
t=b[m][j];
b[m][j]=b[i][j];
b[i][j]=t;
}
for(j=m+1;j<2*N;j++)
{
t=b[m][j];
b[m][j]=b[i][j];
b[i][j]=t;
}

}

for(i=m+1;i<N;i++)
for(j=2*N-1;j>=m;j--)
b[i][j]-=b[i][m]*b[m][j]/b[m][m]; //m=0时,将第一行的-b[i][0]/b[0][0]倍加到以下各行。这样以下每行第一个元素b[i][0]就为0。

for(j=2*N-1;j>=m;j--)
b[m][j]/=b[m][m]; //对第m行作行变换,同除以b[m][m],使b[m][m]为1。

}

printf("第一步变换后得到的增广矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<2*N;j++)
printf("%3.5f ",b[i][j]);
printf("\n"); //实现了:每个i对应一个换行。
}

m=N-1;
while(m>0)
{
for(i=0;i<m;i++)
for(j=2*N-1;j>=m;j--) //千万注意,此处j必须递减,否则b[i][m]先变为0,后面的计算就无效!
b[i][j]-=b[i][m]*b[m][j];
m--;
}

printf("最后得到的增广矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<2*N;j++)
printf("%3.5f ",b[i][j]);
printf("\n"); //实现了:每个i对应一个换行。
}

for(i=0;i<N;i++) //将逆矩阵存入二维数组c中。
for(j=0;j<N;j++)
c[i][j]=b[i][N+j];

printf("故逆矩阵为:\n");

for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%3.5f ",c[i][j]);
printf("\n"); //实现了:每个i对应一个换行。
}

}

main()
{
int w;
printf("1矩阵加法\n");
printf("2矩阵减法\n");
printf("3矩阵乘法\n");
printf("4矩阵转置\n");
printf("5矩阵求逆\n");
printf("\n");
printf("请选择要进行的运算:");
scanf("%d",&w);

switch(w)
{
case 1:jiafa();break;
case 2:jianfa();break;
case 3:chengfa();break;
case 4:zhuan();break;
case 5:qiuni();break;
}

return 0;
}

❷ 用C语言 编写矩阵求逆的程序

1 2 3 45 6 7 89 10 11 1213 14 15 16 1 5 9 132 6 10 143 7 11 154 8 12 16int a[4][4];for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ a[i][j] = i*4+j+1; }}for(int a=0;a<4;a++){ for(int b=0;b<4;b++){ cout<<a[i][j]; } cout<<endl;}int a[4][4];for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ a[i][j] = i+j*4+1; }}for(int a=0;a<4;a++){ for(int b=0;b<4;b++){ cout<<a[i][j]; } cout<<endl;}

❸ 怎样编程求矩阵的逆(用VC++)

抄了一个程序,int DinV(double A[N][N],int n)
作了微小的语法改正,看看可不可以用:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 4
double A[N][N]={{1,3,2,13},{7,2,1,-2},{9,15,3,-2},{-2,-2,11,5}};

void swap(double *a,double *b){double c; c= *a; *a= *b; *b= c;};

int DinV(double A[N][N],int n)
{
int i,j,k;
double d;
int JS[N],IS[N];
for (k=0;k<n;k++)
{
d=0;
for (i=k;i<n;i++)
for (j=k;j<n;j++){
if (fabs(A[i][j])>d){
d=fabs(A[i][j]);
IS[k]=i;
JS[k]=j;
}; // end if
}; // end j
if (d+1.0==1.0) return 0;
if (IS[k]!=k) for (j=0;j<n;j++) swap( &A[k][j], &A[IS[k]][j]);
if (JS[k]!=k) for (i=0;i<n;i++) swap( &A[i][k], &A[i][JS[k]]);
A[k][k]=1/A[k][k];
for (j=0;j<n;j++) if (j!=k) A[k][j]=A[k][j]*A[k][k];
for (i=0;i<n;i++) if (i!=k) for (j=0;j<n;j++) if (j!=k) A[i][j]=A[i][j]-A[i][k]*A[k][j];
for (i=0;i<n;i++) if (i!=k) A[i][k]=-A[i][k]*A[k][k];
}; // for i
for (k=n-1;k>=0;k--)
{
for (j=0;j<n;j++) if (JS[k]!=k) swap( &A[k][j], &A[JS[k]][j]);
for (i=0;i<n;i++) if (IS[k]!=k) swap( &A[i][k], &A[i][IS[k]]);
}; // for k
for (i=0;i<n;i++)
{
for (j=0;j<n;j++) printf(" %1.4f",A[i][j]);
puts("");
}; // for i
return 1;
}

void main()
{
DinV(A,4);
getch();
}

❹ 用c语言怎么编写输入一个矩阵求其逆矩阵的程序

这是我编的一个简易矩阵计算器,C++语言,非常容易理解的,你可以参考求行列式和逆部分
#include <iostream>
#include <iomanip>
#include <conio.h>
#include "windows.h"
#include <string>
using namespace std;

void gotoxy(int x,int y) // 列x: 0~79 行y: 0~24
{ HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
COORD coordScreen={x,y};
SetConsoleCursorPosition(hConsole,coordScreen);
return;
}
void setcolor(unsigned short ForeColor,unsigned short BackColor)
// 0--黑 1--暗蓝 2--暗绿 3--暗青 4--暗红 5--暗紫 6--蟹黄 7--暗白
// 8--灰 9--亮蓝 10-亮绿 11-亮青 12-亮红 13-亮紫 14-黄 15-亮白
{ HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,(ForeColor % 16)|(BackColor % 16 * 16));
};

int main()
{
void plu();
void sub();
void amo();
void mul();
void ran();
void ord();
char sel='1';
while(sel != '0')
{ int i;
system("cls"); // 清屏
setcolor(15,0); // 下面显示黑底亮青字
gotoxy(8,1); cout<<"┌───────────────────────────┐";
for(i=2;i<20;i++)
{gotoxy(8,i);cout<<"│";gotoxy(64,i);cout<<"│";}
setcolor(15,6); // 下面显示红底白字
gotoxy(10,3); cout<<" ";
gotoxy(10,4); cout<<" 简 易 矩 阵 计 算 器 ";
gotoxy(10,5); cout<<" ";
setcolor(15,0); // 下面显示黑底亮青字
gotoxy(10,7); cout<<" 1 ---- 矩阵加法 2 ---- 矩阵减法 ";
gotoxy(10,9); cout<<" 3 ---- 矩阵数乘 4 ---- 矩阵乘法 ";
gotoxy(10,11); cout<<" 5 ---- 矩阵行列式 6 ---- 矩阵的逆 ";
gotoxy(10,13); cout<<" 0 ---- 退出 ";
gotoxy(10,15); cout<<" 请选择(0--6):";
gotoxy(8,20); cout<<"└───────────────────────────┘";
do
{ gotoxy(28,15); sel=getche( );}
while ( sel!='1' && sel!='2' && sel!='3' && sel!='4' && sel!='5' && sel!='6'&& sel!='0');

switch(sel)
{
case '1':plu(); break;
case '2':sub(); break;
case '3':amo(); break;
case '4':mul(); break;
case '5':ran(); break;
case '6':ord(); break;
case '0': break;
}
}
system("cls");
gotoxy(25,10);
cout<<"谢 谢 使 用 系 统 !"<<endl;
return 0;
}

void plu()//加法
{ char l;
system("cls"); // 清屏
setcolor(14,0); // 下面用黑底黄字
int a,b,i,j;
gotoxy(0,0);cout<<">>>>>> 矩阵加法 ";
gotoxy(0,2);cout<<"请输入矩阵的行数:";
cin>>a;
cout<<endl;
cout<<"请输入矩阵的列数:";
cin>>b;
cout<<endl;
double m[10][10],n[10][10];
cout<<"请输入第一个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*i+6); cin>>m[i][j];}
cout<<endl<<endl<<"请输入第二个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*a+2*i+7);cin>>n[i][j];}
cout<<endl<<">>>>>>>"<<endl<<"矩阵加法结果为:";
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,4*a+2*i+8);cout<<m[i][j]+n[i][j];}
gotoxy(0,6*a+9);
cout<<">>>>>>>>按任意键退出:";
l=getche();

}

void sub()//减法
{ char l;
system("cls"); // 清屏
setcolor(14,0); // 下面用黑底黄字
int a,b,i,j;
gotoxy(0,0);cout<<">>>>>矩阵减法";
gotoxy(0,2);cout<<"请输入矩阵的行数:";
cin>>a;
cout<<endl;
cout<<"请输入矩阵的列数:";
cin>>b;
cout<<endl;
double m[10][10],n[10][10];
cout<<"请输入第一个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*i+6); cin>>m[i][j];}
cout<<endl<<endl<<"请输入第二个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*a+2*i+7);cin>>n[i][j];}
cout<<endl<<">>>>>>>"<<endl<<"矩阵减法结果为:";
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,4*a+2*i+8);cout<<m[i][j]-n[i][j];}
gotoxy(0,6*a+9);
cout<<">>>>>>>>按任意键退出:";
l=getche();

}

void amo()//数乘
{ char h;
system("cls"); // 清屏
setcolor(14,0); // 下面用黑底黄字
int a,b,i,j;
gotoxy(0,0);cout<<">>>>>>矩阵数乘";
gotoxy(0,2);cout<<"请输入矩阵的行数:";
cin>>a;
cout<<endl;
cout<<"请输入矩阵的列数:";
cin>>b;
cout<<endl;
double m[10][10],c;
cout<<"请输入矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+20,2*i+6);cin>>m[i][j];}
cout<<endl<<"请输入与矩阵相乘的实数:";
cin>>c;
cout<<endl<<endl<<"矩阵数乘结果为:";
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(8*j+20,2*a+2*i+9);cout<<m[i][j]*c;}
gotoxy(0,4*a+12);
cout<<">>>>>>>按任意键退出:";h=getche();
}

void mul()//乘法
{
char k;
system("cls"); // 清屏
setcolor(14,0); // 下面用黑底黄字
int a,b,c,i,j,q;
gotoxy(0,0);cout<<">>>>>>矩阵乘法";
gotoxy(0,2);cout<<"请输入第一个矩阵的行数:";
cin>>a;
cout<<endl<<"请输入第一个矩阵的列数:";
cin>>b;
cout<<endl<<"则第二个矩阵的行数也为:"<<b;
cout<<endl<<endl<<"请输入第二个矩阵的列数:";
cin>>c;
cout<<endl;
double m[10][10],n[10][10],p[10][10]={0};
cout<<"请输入第一个矩阵:"<<endl;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{gotoxy(6*j+18,2*i+10); cin>>m[i][j];}
cout<<endl<<endl<<"请输入第二个矩阵:";
for(i=0;i<b;i++)
for(j=0;j<c;j++)
{gotoxy(6*j+18,2*a+2*i+11);cin>>n[i][j];}
cout<<endl<<">>>>>>>"<<endl<<"矩阵相乘结果为: ";
for(i=0;i<a;i++)
for(j=0;j<c;j++)
for(q=0;q<b;q++) p[i][j]=p[i][j]+m[i][q]*n[q][j];
for(i=0;i<a;i++)
for(j=0;j<c;j++)
{gotoxy(10*j+18,2*a+2*b+2*i+12);cout<<p[i][j];}
gotoxy(16,2*a+2*b+2*i+15);
cout<<">>>>>>>按任意键退出:";k=getche();

}
//===================================================行列式

float Fun(int n1,float a1[10][10]);
void ran()
{
system("cls"); // 清屏
setcolor(15,0); // 下面用黑底黄字
char k;
int n,i,j;
cout<<">>>>>矩阵行列式"<<endl<<endl<<"请输入矩阵阶数: ";
cin>>n;
cout<<endl<<"请输入矩阵:"<<endl;
float a[10][10];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{gotoxy(6*j+12,2*i+4);cin>>a[i][j];}
cout<<endl<<"行列式为: "<<Fun(n,a)<<endl<<endl;
cout<<">>>>>>按任意键退出:";
k=getche();

}
float Fun(int n1,float a1[10][10])//求行列式的递归函数
{
int i_1,j_1,c;//c为数组b的行
float b[10][10];
int p=0,q=0;
float sum=0;
if(n1==1) return a1[0][0];
for(i_1=0;i_1<n1;i_1++)
{
for(c=0;c<n1-1;c++)
{if(c<i_1) p=0;
else p=1;
for(j_1=0;j_1<n1-1;j_1++)
{b[c][j_1]=a1[c+p][j_1+1];}
}
if(i_1%2==0)
q=1;
else q=(-1);
sum=sum+a1[i_1][0]*q*Fun(n1-1,b);
}return sum;
}

//================================================================

void ord()
{
char g;
system("cls"); // 清屏
setcolor(15,0); // 下面用黑底黄字
int i,j,n;
gotoxy(0,0);cout<<">>>>>矩阵的逆";
gotoxy(0,2);cout<<"请输入矩阵的阶数:";
cin>>n;
cout<<endl;
cout<<"请输入矩阵:";
float l[10][10],m[10][10],p;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{gotoxy(4*j+12,2*i+4); cin>>l[i][j];}
if(Fun(n,l)==0) cout<<endl<<"该矩阵无逆!!!"<<endl;
else
{p=Fun(n,l);
cout<<endl<<"矩阵的逆为: ";
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{{float f[10][10];
int r,w,e,d;//e为数组f的行数
for(int j_1=0,e=0;j_1<n-1,e<n-1;j_1++,e++)
for(int i_1=0,d=0;i_1<n-1,d<n-1;i_1++,d++)
{if(e<i) r=0;else r=1;
if(d<j) w=0;else w=1;
f[i_1][j_1]=l[i_1+w][j_1+r];};
if((i+j)%2==0) m[i][j]=Fun(n-1,f)/p;
else m[i][j]=-Fun(n-1,f)/p;
};
gotoxy(9*j+12,2*n+2*i+4);cout<<m[i][j];};};
cout<<endl<<endl<<">>>>>>按任意键退出:";g=getche();
}

❺ C语言编程:编写一个函数求逆矩阵

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

voidMatrixOpp(double*A,intm,intn,double*invmat);
voidMatrixInver(double*A,intm,intn,double*invmat);
doubleSurplus(doubleA[],intm,intn);
intmatrix_inv(double*p,intnum,double*invmat);

voidMatrixOpp(doubleA[],intm,intn,double*invmat)
{
inti,j,x,y,k;
double*SP=NULL,*AB=NULL,*B=NULL,X;
SP=(double*)malloc(m*n*sizeof(double));
AB=(double*)malloc(m*n*sizeof(double));
B=(double*)malloc(m*n*sizeof(double));
X=Surplus(A,m,n);
X=1/X;

for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
for(k=0;k<m*n;k++)
B[k]=A[k];
{
for(x=0;x<n;x++)
B[i*n+x]=0;
for(y=0;y<m;y++)
B[m*y+j]=0;
B[i*n+j]=1;
SP[i*n+j]=Surplus(B,m,n);
AB[i*n+j]=X*SP[i*n+j];
}
}
MatrixInver(AB,m,n,invmat);
free(SP);
free(AB);
free(B);
}

voidMatrixInver(doubleA[],intm,intn,double*invmat)
{
inti,j;
double*B=invmat;

for(i=0;i<n;i++)
for(j=0;j<m;j++)
B[i*m+j]=A[j*n+i];
}

doubleSurplus(doubleA[],intm,intn)
{
inti,j,k,p,r;
doubleX,temp=1,temp1=1,s=0,s1=0;
if(n==2)
{
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if((i+j)%2)
temp1*=A[i*n+j];
else
temp*=A[i*n+j];
X=temp-temp1;
}
else
{
for(k=0;k<n;k++)
{
for(i=0,j=k;i<m,j<n;i++,j++)
temp*=A[i*n+j];
if(m-i)
{
for(p=m-i,r=m-1;p>0;p--,r--)
temp*=A[r*n+p-1];
}
s+=temp;
temp=1;
}

for(k=n-1;k>=0;k--)
{
for(i=0,j=k;i<m,j>=0;i++,j--)
temp1*=A[i*n+j];
if(m-i)
{
for(p=m-1,r=i;r<m;p--,r++)
temp1*=A[r*n+p];
}
s1+=temp1;
temp1=1;
}
X=s-s1;
}
returnX;
}

intmatrix_inv(double*p,intnum,double*invmat)
{
if(p==NULL||invmat==NULL)
{
return1;
}
if(num>10)
{
return2;
}
MatrixOpp(p,num,num,invmat);
return0;
}

intmain()
{
inti,j;
intnum;
double*arr=NULL;
double*result=NULL;
intflag;

printf("请输入矩阵维数: ");
scanf("%d",&num);
arr=(double*)malloc(sizeof(double)*num*num);
result=(double*)malloc(sizeof(double)*num*num);

printf("请输入%d*%d矩阵: ",num,num);
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{
scanf("%lf",&arr[i*num+j]);
}
}

flag=matrix_inv(arr,num,result);

if(flag==0)
{
printf("逆矩阵为: ");
for(i=0;i<num*num;i++)
{
printf("%lf ",*(result+i));
if(i%num==(num-1))
printf(" ");
}
}
elseif(flag==1)
{
printf("p/q为空 ");
}
else
{
printf("超过最大维数 ");
}

system("PAUSE");
free(arr);
free(result);
return0;
}


❻ 矩阵求逆编程

算法的大致思想是通过行列式初等变换来求。
代码如下:

private double[,] ReverseMatrix( double[,] dMatrix, int Level )
{
double dMatrixValue = MatrixValue( dMatrix, Level );
if( dMatrixValue == 0 ) return null;

double[,] dReverseMatrix = new double[Level,2*Level];
double x, c;
// Init Reverse matrix
for( int i = 0; i < Level; i++ )
{
for( int j = 0; j < 2 * Level; j++ )
{
if( j < Level )
dReverseMatrix[i,j] = dMatrix[i,j];
else
dReverseMatrix[i,j] = 0;
}

dReverseMatrix[i,Level + i ] = 1;
}

for( int i = 0, j = 0; i < Level && j < Level; i++, j++ )
{
if( dReverseMatrix[i,j] == 0 )
{
int m = i;
for( ; dMatrix[m,j] == 0; m++ );
if( m == Level )
return null;
else
{
// Add i-row with m-row
for( int n = j; n < 2 * Level; n++ )
dReverseMatrix[i,n] += dReverseMatrix[m,n];
}
}

// Format the i-row with "1" start
x = dReverseMatrix[i,j];
if( x != 1 )
{
for( int n = j; n < 2 * Level; n++ )
if( dReverseMatrix[i,n] != 0 )
dReverseMatrix[i,n] /= x;
}

// Set 0 to the current column in the rows after current row
for( int s = Level - 1; s > i;s-- )
{
x = dReverseMatrix[s,j];
for( int t = j; t < 2 * Level; t++ )
dReverseMatrix[s,t] -= ( dReverseMatrix[i,t]* x );
}
}

// Format the first matrix into unit-matrix
for( int i = Level - 2; i >= 0; i-- )
{
for( int j = i + 1 ; j < Level; j++ )
if( dReverseMatrix[i,j] != 0 )
{
c = dReverseMatrix[i,j];
for( int n = j; n < 2*Level; n++ )
dReverseMatrix[i,n] -= ( c * dReverseMatrix[j,n] );
}
}

double[,] dReturn = new double[Level, Level];
for( int i = 0; i < Level; i++ )
for( int j = 0; j < Level; j++ )
dReturn[i,j] = dReverseMatrix[i,j+Level];
return dReturn;
}

private double MatrixValue( double[,] MatrixList, int Level )
{
double[,] dMatrix = new double[Level, Level];
for( int i = 0; i < Level; i++ )
for( int j = 0; j < Level; j++ )
dMatrix[i,j] = MatrixList[i,j];
double c, x;
int k = 1;
for( int i = 0, j = 0; i < Level && j < Level; i++, j++ )
{
if( dMatrix[i,j] == 0 )
{
int m = i;
for( ; dMatrix[m,j] == 0; m++ );
if( m == Level )
return 0;
else
{
// Row change between i-row and m-row
for( int n = j; n < Level; n++ )
{
c = dMatrix[i,n];
dMatrix[i,n] = dMatrix[m,n];
dMatrix[m,n] = c;
}

// Change value pre-value
k *= (-1);
}
}

// Set 0 to the current column in the rows after current row
for( int s = Level - 1; s > i;s-- )
{
x = dMatrix[s,j];
for( int t = j; t < Level; t++ )
dMatrix[s,t] -= dMatrix[i,t]* ( x/dMatrix[i,j] );
}
}

double sn = 1;
for( int i = 0; i < Level; i++ )
{
if( dMatrix[i,i] != 0 )
sn *= dMatrix[i,i];
else
return 0;
}
return k*sn;
}

调用如下:

double[,] dMatrix = new double[3,3]{{0,1,2},{1,0,1},{4,2,1}};
double[,] dReturn = ReverseMatrix( dMatrix, 3 );
if( dReturn != null )
{
for( int i=0; i < 3; i++ )
Debug.WriteLine( string.Format( "{0} {1} {2}",
dReturn[i,0], dReturn[i,1],dReturn[i,2] ) );
}

❼ C语言 求矩阵的逆

//源程序如下#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<iostream.h>
#include<stdlib.h>
#include<math.h>
#define max 100void inputstyle(int *); //输入函数
void input(int **,int); //输入函数
long danx(int **,int);
int sgnx(int);
void martx(int **,int);int main(void)
{
int style=0,i=0;
int matrix[max][max],*p[max];
for(i=0;i<max;i++)*(p+i)=matrix[i]; //*(p+i)是指针,指向第i个字符串
char exit1=' ';
while(exit1!='E'&& exit1!='e'){ printf("求n阶矩阵的逆\n"); inputstyle(&style);
input(p,style);
printf("原矩阵为:\n");
for(i=0;i<style;i++){
for(int j=0;j<style;j++){
printf("%4d",matrix[i][j]);

}
printf("\n");
}

martx(p,style);
printf("\n");
printf("Exit=e Continue=Press any key\n");
cin>>exit1;
fflush(stdin);
printf("\n\n"); }
return(0);
} void input(int **p,int n){

for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("输入矩阵(%d行,%d列)元素:",j+1,i+1);
*(*(p+j)+i)=0;
scanf("%d",*(p+j)+i);
fflush(stdin);
}
}
}void inputstyle(int *style){
do{
printf("输入矩阵n*n阶数n(0<n<%d):",max);
fflush(stdin);
scanf("%d",style);
fflush(stdin);
}while(*style<=0 && *style>max);

}long danx(int **p,int n){
int i=0,j1=0,k1=0,j2=0,k2=0;
long sum=0;
int operate[max][max],*po[max];
for(i=0;i<max;i++)*(po+i)=operate[i]; if(n==1)return *(*(p+0)+0);
else{
for(i=0;i<n;i++){
for(j1=1,j2=0;j1<n;j1++,j2++){
k1=-1;k2=-1;
while(k2<n-1){
k1++;
k2++;
if(k1==i)k1++;
*(*(po+j2)+k2)=*(*(p+j1)+k1);
}
}
/*for(int i1=0;i1<n-1;i1++){
for(int h1=0;h1<n-1;h1++){
printf("(%d,%d)%d ",i1,h1,*(*(po+h1)+i1));

}
printf("\n");
}*/

sum+=*(*(p+0)+i) * sgnx(1+i+1) * danx(po,n-1);
}
return sum;
}
}int sgnx(int i){
if(i%2==0)return(1);
else return(-1);
}void martx(int **p,int n){
int i=0,j=0,j1=0,k1=0,j2=0,k2=0,num=0;
int tramform[max][max];
int operate[max][max],*po[max];
for(i=0;i<max;i++)*(po+i)=operate[i];
num=danx(p,n);
if(num==0)printf("矩阵不可逆\n");
else{
if(n==1)printf("矩阵的逆为: 1/%d\n",num);
else{
printf("矩阵的逆为: 系数 1/%d *\n",num);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
j1=-1;j2=-1;
while(j2<n-1){
j1++;j2++;
if(j1==j)j1++; k1=-1;k2=-1;
while(k2<n-1){
k1++;
k2++;
if(k1==i)k1++;
*(*(po+j2)+k2)=*(*(p+j1)+k1);
}
}

tramform[i][j]=sgnx(2+i+j) * danx(po,n-1);
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%4d",tramform[i][j]);
}
printf("\n");
}
}
}
}
//运行结果//希望对你有帮助

❽ 如何用C++编程求矩阵的逆

#define N 5 /*[注]:修改6为你所要的矩阵阶数*/
#include "stdio.h"
#include "conio.h"

/*js()函数用于计算行列式,通过递归算法实现*/
int js(s,n)
int s[][N],n;
{int z,j,k,r,total=0;
int b[N][N];/*b[N][N]用于存放,在矩阵s[N][N]中元素s[0]的余子式*/
if(n>2) {for(z=0;z<n;z++)
{for(j=0;j<n-1;j++)
for(k=0;k<n-1;k++)
if(k>=z) b[j][k]=s[j+1][k+1];
else b[j][k]=s[j+1][k];
if(z%2==0) r=s[0][z]*js(b,n-1); /*递归调用*/
else r=(-1)*s[0][z]*js(b,n-1);
total=total+r;
}
}
else if(n==2) total=s[0][0]*s[1][1]-s[0][1]*s[1][0];
return total;
}

/*n_1()函数用于求原矩阵各元素对应的余子式,存放在数组b[N][N]中,定义为float型*/
void n_1(s,b,n)
int s[][N],n;
float b[][N];
{int z,j,k,l,m,g,a[N][N];
for(z=0;z<n;z++)
{l=z;
for(j=0;j<n;j++)
{ m=j;
for (k=0;k<n-1;k++)
for(g=0;g<n-1;g++)
{ if(g>=m&&k<l) a[k][g]=s[k][g+1];
else if(k>=l&&g<m) a[k][g]=s[k+1][g];
else if(k>=l&&g>=m) a[k][g]=s[k+1][g+1];
else a[k][g]=s[k][g];
}
b[z][j]=js(a,n-1);
}
}
}

main()
{int a[N][N];
float b[N][N];
int r,z,j;
float temp;
//clrscr();
printf("Input original data:\n");
for(z=0;z<N;z++) /*输入所需要的数据,为整型数据*/
for(j=0;j<N;j++)
scanf("%d",&a[z][j]);
printf("\nPress Enter continue......");
getchar();
//gotoxy(1,1);
printf("The original matrix is:\n");
for(z=0;z<N;z++)/*打印原矩阵*/
{for(j=0;j<N;j++)
printf("%5d",a[z][j]);
printf("\n");
}
r=js(a,N); /*调用js()函数计算原矩阵的行列式值*/
printf("\nThe original matrix hanglieshi is:|A|==%d\n",r);
if (r==0) printf("Because |A|==0,the original matrix have no nijuzhen!"); /*判断条件:若|A|==0,则原矩阵无逆矩阵,反之则存在逆矩阵*/
else
{n_1(a,b,N); /*调用n_1()函数,得到原矩阵各元素对应的"余子式",存放在数组b[N][N]中*/
for(z=0;z<N;z++) /*求代数余子式,此时b[N][N]中存放的为原矩阵各元素对应的"代数余子式"*/
for(j=0;j<N;j++)
if((z+j)%2!=0 && b[z][j]!=0) b[z][j]=-b[z][j];
for(z=0;z<N;z++) /*对b[N][N]转置,此时b[N][N]中存放的为原矩阵的伴随矩阵*/
for(j=z+2;j<N;j++)
{temp=b[z][j];
b[z][j]=b[j][z];
b[j][z]=temp;
}
printf("Because |A|!=0,the original matrix have nijuzhen!\n");
printf("The bansuijuzhen A* is:\n");
for(z=0;z<N;z++)/* 打印伴随矩阵A* */
{for(j=0;j<N;j++)
printf("%4.0f\t",b[z][j]);
printf("\n");
}

for(z=0;z<N;z++) /*求逆矩阵,此时b[N][N]中存放的是原矩阵的逆矩阵*/
for(j=0;j<N;j++)
b[z][j]=b[z][j]/r;
printf("\nThe nijuzhen is:(A*)/|A|(|A|=%d)\n",r); /*打印逆矩阵*/
for(z=0;z<N;z++)
{for(j=0;j<N;j++)
printf("%8.3f",b[z][j]);
printf("\n");
}
}
}

❾ c语言编写一个子函数求矩阵的逆矩阵

#include<stdio.h>
#define N 10
int getA(int arcs[N][N],int n)//按第一行展开计算|A|
{
if(n==1)
{
return arcs[0][0];
}
int ans = 0;
int temp[N][N];
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
for(k=0;k<n-1;k++)
{
temp[j][k] = arcs[j+1][(k>=i)?k+1:k];

}
}
int t = getA(temp,n-1);
if(i%2==0)
{
ans += arcs[0][i]*t;
}
else
{
ans -= arcs[0][i]*t;
}
}
return ans;
}
void getAStart(int arcs[N][N],int n,int ans[N][N])//计算每一行每一列的每个元素所对应的余子式,组成A*
{
if(n==1)
{
ans[0][0] = 1;
return;
}
int i,j,k,t;
int temp[N][N];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n-1;k++)
{
for(t=0;t<n-1;t++)
{
temp[k][t] = arcs[k>=i?k+1:k][t>=j?t+1:t];
}
}

ans[j][i] = getA(temp,n-1);
if((i+j)%2 == 1)
{
ans[j][i] = - ans[j][i];
}
}
}
}

int main()
{
int arcs[N][N];
int astar[N][N];
int i,j;
int n;
while(scanf("%d",&n)!=EOF && n)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&arcs[i][j]);
}
}

int a = getA(arcs,n);
if(a==0)
{
printf("can not transform!\n");
}
else
{
getAStart(arcs,n,astar);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%.3lf ",(double)astar[i][j]/a);
}
printf("\n");
}
}
printf("\n");

}

return 0;
}

❿ 怎样用VB编程矩阵求逆

Function Rect_yu(A() As Double, L As Long, C() As Double) As Double '矩阵求逆
Dim T0 As Double
Dim T1 As Double
Dim T2 As Double
Dim T3 As Double
Dim B() As Double
Dim Num As Double
Dim Chay As Long
Dim Chax As Long
Chay = 0
Chax = 0
ReDim B(L - 1, L - 1)
Num = 0
Dim add As Double
add = 1 / Rect(A(), L)
For T0 = 0 To L
For T3 = 0 To L
For T1 = 0 To L - 1
If T1 < T0 Then
Chax = 0
Else
Chax = 1
End If
For T2 = 0 To L - 1
If T2 < T3 Then
Chay = 0
Else
Chay = 1
End If
B(T1, T2) = A(T1 + Chax, T2 + Chay)
Next T2
Next T1
'Rect(B(), L - 1) '调用求行列式值
C(T3, T0) = Rect(B(), L - 1) * add * ((-1) ^ (T0 + T3))
Next T3
Next T0
End Function

'当矩阵为:
'2 3 4
'5 6 7
'8 9 0
'那么求逆得一个矩阵为:
'-2.1 1.2 -0.1
'1.87 -1.07 0.20
'-0.1 0.2 -0.1

'A() As Double为A(L,L)的矩阵

'当L=2时可定义为

Dim A(2, 2) As Double
A(0, 0) = 2
A(0, 1) = 3
A(0, 2) = 4
A(1, 0) = 5
A(1, 1) = 6
A(1, 2) = 7
A(2, 0) = 8
A(2, 1) = 9
A(2, 2) = 0
Dim L As Long
L = 2
Dim C(2, 2) As Double

'可调用本函数(注:要加有Rect(B(), L - 1) "调用求行列式值)这个函数
Call Rect_yu(A(), L, C())
'C()为结果

热点内容
安卓手机微信图片怎么样下载原图 发布:2024-05-14 00:19:19 浏览:467
优酷安卓版在哪里下载 发布:2024-05-14 00:18:59 浏览:460
java常用接口 发布:2024-05-14 00:08:21 浏览:636
stl源码剖析侯捷 发布:2024-05-13 23:45:56 浏览:694
电脑哪个软件可以查看什么配置 发布:2024-05-13 23:22:28 浏览:639
五开手游模拟器要什么配置 发布:2024-05-13 23:22:23 浏览:37
小白源码搭建 发布:2024-05-13 23:19:57 浏览:822
为什么用安卓买的驾考宝典苹果 发布:2024-05-13 23:14:37 浏览:102
防火墙打开ftp端口 发布:2024-05-13 22:57:19 浏览:926
群晖搭建web服务器 发布:2024-05-13 22:57:04 浏览:534