如何用MATLAB求逆矩阵

如何用MATLAB求逆矩阵,第1张

第一步:启动MATLAB。

第二步:输入‘clear’和‘clc’代码。(清屏)

第三步:根据你的需求设置一个矩阵。(图中示例设置为矩阵A=[1 2 3 4 ],‘A’可以定义为你需要的任何字母

第四步:用代码B=inv(A),‘B’可以定义为你需要的其他字母,inv()里的字母为你需要求逆的矩阵。

第五步:验证自己求解的逆,两个矩阵的乘积为单位阵,则求逆正确。

//源程序如下#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=0i<maxi++)*(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=0i<stylei++){

for(int j=0j<stylej++){

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=0i<ni++){

for(int j=0j<nj++){

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=0i<maxi++)*(po+i)=operate[i]if(n==1)return *(*(p+0)+0)

else{

for(i=0i<ni++){

for(j1=1,j2=0j1<nj1++,j2++){

k1=-1k2=-1

while(k2<n-1){

k1++

k2++

if(k1==i)k1++

*(*(po+j2)+k2)=*(*(p+j1)+k1)

}

}

/*for(int i1=0i1<n-1i1++){

for(int h1=0h1<n-1h1++){

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=0i<maxi++)*(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=0i<ni++){

for(j=0j<nj++){

j1=-1j2=-1

while(j2<n-1){

j1++j2++

if(j1==j)j1++ k1=-1k2=-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=0i<ni++){

for(j=0j<nj++){

printf("%4d",tramform[i][j])

}

printf("\n")

}

}

}

}

//运行结果//希望对你有帮助

下面是实现Gauss-Jordan法实矩阵求逆。

#include

<stdlib.h>

#include

<math.h>

#include

<stdio.h>

int

brinv(double

a[],

int

n)

{

int

*is,*js,i,j,k,l,u,v

double

d,p

is=malloc(n*sizeof(int))

js=malloc(n*sizeof(int))

for

(k=0

k<=n-1

k++)

{

d=0.0

for

(i=k

i<=n-1

i++)

for

(j=k

j<=n-1

j++)

{

l=i*n+j

p=fabs(a[l])

if

(p>d)

{

d=p

is[k]=i

js[k]=j}

}

if

(d+1.0==1.0)

{

free(is)

free(js)

printf("err**not

inv

")

return(0)

}

if

(is[k]!=k)

for

(j=0

j<=n-1

j++)

{

u=k*n+j

v=is[k]*n+j

p=a[u]

a[u]=a[v]

a[v]=p

}

if

(js[k]!=k)

for

(i=0

i<=n-1

i++)

{

u=i*n+k

v=i*n+js[k]

p=a[u]

a[u]=a[v]

a[v]=p

}

l=k*n+k

a[l]=1.0/a[l]

for

(j=0

j<=n-1

j++)

if

(j!=k)

{

u=k*n+j

a[u]=a[u]*a[l]}

for

(i=0

i<=n-1

i++)

if

(i!=k)

for

(j=0

j<=n-1

j++)

if

(j!=k)

{

u=i*n+j

a[u]=a[u]-a[i*n+k]*a[k*n+j]

}

for

(i=0

i<=n-1

i++)

if

(i!=k)

{

u=i*n+k

a[u]=-a[u]*a[l]}

}

for

(k=n-1

k>=0

k--)

{

if

(js[k]!=k)

for

(j=0

j<=n-1

j++)

{

u=k*n+j

v=js[k]*n+j

p=a[u]

a[u]=a[v]

a[v]=p

}

if

(is[k]!=k)

for

(i=0

i<=n-1

i++)

{

u=i*n+k

v=i*n+is[k]

p=a[u]

a[u]=a[v]

a[v]=p

}

}

free(is)

free(js)

return(1)

}

void

brmul(double

a[],

double

b[],int

m,int

n,int

k,double

c[])

{

int

i,j,l,u

for

(i=0

i<=m-1

i++)

for

(j=0

j<=k-1

j++)

{

u=i*k+j

c[u]=0.0

for

(l=0

l<=n-1

l++)

c[u]=c[u]+a[i*n+l]*b[l*k+j]

}

return

}

int

main()

{

int

i,j

static

double

a[4][4]={

{0.2368,0.2471,0.2568,1.2671},

{1.1161,0.1254,0.1397,0.1490},

{0.1582,1.1675,0.1768,0.1871},

{0.1968,0.2071,1.2168,0.2271}}

static

double

b[4][4],c[4][4]

for

(i=0

i<=3

i++)

for

(j=0

j<=3

j++)

b[i][j]=a[i][j]

i=brinv(a,4)

if

(i!=0)

{

printf("MAT

A

IS:

")

for

(i=0

i<=3

i++)

{

for

(j=0

j<=3

j++)

printf("%13.7e

",b[i][j])

printf("

")

}

printf("

")

printf("MAT

A-

IS:

")

for

(i=0

i<=3

i++)

{

for

(j=0

j<=3

j++)

printf("%13.7e

",a[i][j])

printf("

")

}

printf("

")

printf("MAT

AA-

IS:

")

brmul(b,a,4,4,4,c)

for

(i=0

i<=3

i++)

{

for

(j=0

j<=3

j++)

printf("%13.7e

",c[i][j])

printf("

")

}

}

}参考资料:C常用算法程序集-徐士良


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11020950.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存