用c语言编程,求解逆矩阵

Python011

用c语言编程,求解逆矩阵,第1张

#include <stdio.h>#include <stdlib.h>#include <malloc.h>void MatrixOpp(double *A, int m, int n, double* invmat)void MatrixInver(double *A, int m, int n, double* invmat)double Surplus(double A[], int m, int n)int matrix_inv(double* p, int num, double* invmat)void MatrixOpp(double A[], int m, int n, double* invmat){ int i, 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 = 0i <mi++) for (j = 0j <nj++) { for (k = 0k <m * nk++) B[k] = A[k] { for (x = 0x <nx++) B[i * n + x] = 0 for (y = 0y <my++) 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)}void MatrixInver(double A[], int m, int n, double* invmat){ int i, j double *B = invmat for (i = 0i <ni++) for (j = 0j <mj++) B[i * m + j] = A[j * n + i]}double Surplus(double A[], int m, int n){ int i, j, k, p, r double X, temp = 1, temp1 = 1, s = 0, s1 = 0 if (n == 2) { for (i = 0i <mi++) for (j = 0j <nj++) if ((i + j) % 2) temp1 *= A[i * n + j] else temp *= A[i * n + j] X = temp - temp1 } else { for (k = 0k <nk++) { for (i = 0, j = ki <m, j <ni++, j++) temp *= A[i * n + j] if (m - i) { for (p = m - i, r = m - 1p >0p--, r--) temp *= A[r * n + p - 1] } s += temp temp = 1 } for (k = n - 1k >= 0k--) { for (i = 0, j = ki <m, j >= 0i++, j--) temp1 *= A[i * n + j] if (m - i) { for (p = m - 1, r = ir <mp--, r++) temp1 *= A[r * n + p] } s1 += temp1 temp1 = 1 } X = s - s1 } return X}int matrix_inv(double* p, int num, double* invmat){ if (p == NULL || invmat == NULL) { return 1 } if (num >10) { return 2 } MatrixOpp(p, num, num, invmat) return 0}int main(){ int i, j int num double *arr=NULL double *result=NULL int flag printf("请输入矩阵维数:\n") scanf("%d",&num) arr=(double *)malloc(sizeof(double)*num*num) result=(double *)malloc(sizeof(double)*num*num) printf("请输入%d*%d矩阵:\n", num, num) for (i = 0i <numi++) { for (j = 0j <numj++) { scanf("%lf", &arr[i * num + j]) } } flag = matrix_inv(arr, num, result) if(flag==0) { printf("逆矩阵为:\n") for (i = 0i <num * numi++) { printf("%lf\t ", *(result + i)) if (i % num == (num - 1)) printf("\n") } } else if(flag==1) { printf("p/q为空\n") } else { printf("超过最大维数\n") } system("PAUSE") free(arr) free(result) return 0}

下面是实现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=0k<=n-1k++)

{ d=0.0

for (i=ki<=n-1i++)

for (j=kj<=n-1j++)

{ l=i*n+jp=fabs(a[l])

if (p>d) { d=pis[k]=ijs[k]=j}

}

if (d+1.0==1.0)

{ free(is)free(js)printf("err**not inv\n")

return(0)

}

if (is[k]!=k)

for (j=0j<=n-1j++)

{ u=k*n+jv=is[k]*n+j

p=a[u]a[u]=a[v]a[v]=p

}

if (js[k]!=k)

for (i=0i<=n-1i++)

{ u=i*n+kv=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=0j<=n-1j++)

if (j!=k)

{ u=k*n+ja[u]=a[u]*a[l]}

for (i=0i<=n-1i++)

if (i!=k)

for (j=0j<=n-1j++)

if (j!=k)

{ u=i*n+j

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

}

for (i=0i<=n-1i++)

if (i!=k)

{ u=i*n+ka[u]=-a[u]*a[l]}

}

for (k=n-1k>=0k--)

{ if (js[k]!=k)

for (j=0j<=n-1j++)

{ u=k*n+jv=js[k]*n+j

p=a[u]a[u]=a[v]a[v]=p

}

if (is[k]!=k)

for (i=0i<=n-1i++)

{ u=i*n+kv=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=0i<=m-1i++)

for (j=0j<=k-1j++)

{ u=i*k+jc[u]=0.0

for (l=0l<=n-1l++)

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

for (j=0j<=3j++)

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

i=brinv(a,4)

if (i!=0)

{ printf("MAT A IS:\n")

for (i=0i<=3i++)

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

printf("%13.7e ",b[i][j])

printf("\n")

}

printf("\n")

printf("MAT A- IS:\n")

for (i=0i<=3i++)

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

printf("%13.7e ",a[i][j])

printf("\n")

}

printf("\n")

printf("MAT AA- IS:\n")

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

for (i=0i<=3i++)

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

printf("%13.7e ",c[i][j])

printf("\n")

}

}

}