當前位置:首頁 » 編程軟體 » 編程矩陣求逆

編程矩陣求逆

發布時間: 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-05 09:43:10 瀏覽:839
ps存儲顯示不含通道 發布:2024-05-05 09:32:35 瀏覽:102
如何用安卓做一個識物界面表 發布:2024-05-05 09:29:28 瀏覽:98
如何編譯linux內核模塊 發布:2024-05-05 09:27:25 瀏覽:168
為什麼apple驗證無法連接伺服器 發布:2024-05-05 09:20:35 瀏覽:660
linuxscript 發布:2024-05-05 09:19:49 瀏覽:324
asp編程詞典 發布:2024-05-05 09:09:50 瀏覽:526
引流群控腳本 發布:2024-05-05 08:42:14 瀏覽:178
sql測試題和答案 發布:2024-05-05 08:42:09 瀏覽:893
https加密鏈接 發布:2024-05-05 08:28:35 瀏覽:445