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

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

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

#include

<stdlibh>

#include

<mathh>

#include

<stdioh>

int

brinv(double

a[],

int

n)

{

int

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

double

d,p;

is=malloc(nsizeof(int));

js=malloc(nsizeof(int));

for

(k=0;

k<=n-1;

k++)

{

d=00;

for

(i=k;

i<=n-1;

i++)

for

(j=k;

j<=n-1;

j++)

{

l=in+j;

p=fabs(a[l]);

if

(p>d)

{

d=p;

is[k]=i;

js[k]=j;}

}

if

(d+10==10)

{

free(is);

free(js);

printf("errnot

inv

");

return(0);

}

if

(is[k]!=k)

for

(j=0;

j<=n-1;

j++)

{

u=kn+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=in+k;

v=in+js[k];

p=a[u];

a[u]=a[v];

a[v]=p;

}

l=kn+k;

a[l]=10/a[l];

for

(j=0;

j<=n-1;

j++)

if

(j!=k)

{

u=kn+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=in+j;

a[u]=a[u]-a[in+k]a[kn+j];

}

for

(i=0;

i<=n-1;

i++)

if

(i!=k)

{

u=in+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=kn+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=in+k;

v=in+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=ik+j;

c[u]=00;

for

(l=0;

l<=n-1;

l++)

c[u]=c[u]+a[in+l]b[lk+j];

}

return;

}

int

main()

{

int

i,j;

static

double

a[4][4]={

{02368,02471,02568,12671},

{11161,01254,01397,01490},

{01582,11675,01768,01871},

{01968,02071,12168,02271}};

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("%137e

",b[i][j]);

printf("

");

}

printf("

");

printf("MAT

A-

IS:

");

for

(i=0;

i<=3;

i++)

{

for

(j=0;

j<=3;

j++)

printf("%137e

",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("%137e

",c[i][j]);

printf("

");

}

}

}

参考资料:

C常用算法程序集-徐士良

#include<stdioh>

#include<mathh>

#include<timeh>

main(){

int a;

int i,j,NR,NC;

printf("input row -- m value:\n");

scanf("%d",&NR);

printf("input column -- n value:\n");

scanf("%d",&NC);

a = (int ) malloc(sizeof(int ) NR);

for (j=0;j<NR;j++){

a[j] = (int ) malloc(sizeof(int) NC);

}

srand((unsigned)time(NULL));

for (j=0;j<NR;j++) for (i=0;i<NC;i++) {a[j][i] = rand()%2;}

for (j=0;j<NR;j++) {

for (i=0;i<NC;i++) printf("%d ",a[j][i]);

printf("\n");

};

}

#define MAX 50

#define M MAX

#define N MAX

#define T MAX

#define S MAX

int Mult(double a[][N],int m,int n,double b[][T]int s,int t,double c[][T]) {

int i,j,k;

if(n != s) {

printf("两矩阵相乘,左矩阵的列数与右矩阵的行数必须相等。\n");

return 0;

}

int c;

tmpm_Mat = new double [tmpm_Rows];

for(int i = 0;i < tmpm_Rows;i++) tmpm_Mat[i] = new double[tmpm_Cols];

for(i = 0; i < m; ++i) {

for(j = 0; j < n; ++j) {

c[i][j] = 0;

for(k = 0; k < t; ++k)

c[i][j] += c[i][k]  c[k][j];

}

}

return 1;

}

1,若程序定义为三行三列的矩阵,并在主函数中键盘赋值。请编写函数juzhen(int a[][3],int n),函数功能是:使矩阵左下角元素中的值乘以例如:若矩阵中的值为:

1 9 7

2 3 8

4 5 6

n=3,则矩阵值变为:

1 9 7

6 9 8

12 15 18

注:二维数组下三角元素每行最后元素的列标和该列的列号一致

#include <stdioh>

int juzhen(int a[][3],int n)

{

int i,j;

for (i=1;i<3;i++)

for (j=0;j<=i;j++)

a[i][j]=a[i][j]n;

}

main()

{

int i,j,a[3][3],m;

clrscr();

printf("please enter 9 numbers :\n");

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

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

scanf("%d",&a[i][j]);

printf("the old ju zhen is:\n");

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

{

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

printf("%3d",a[i][j]);

printf("\n");

}

printf("please enter a int number:\n");

scanf("%d",&m);

juzhen (a,m);

printf("the new ju zhen is:\n");

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

{

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

printf("%3d",a[i][j]);

printf("\n");

}

}

2,请编写函数juzhen,该函数的功能是:将三行四列矩阵x乘以四行三列矩阵y,结果放在三行三列矩阵中。矩阵相乘的基本方法是:矩阵Xy中行列下标分别为i,j的元素的值,是矩阵X中第i行上四个元素与矩阵Y中第j列上四个元素对应相乘的积。

X和Y矩阵原型可运行后看到!

#include <conioh>

#include <stdioh>

void juzhen (int a[3][4],int b[4][3],int ab[3][3])

{

int i,j,z;

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

for (j=0;j<4;j++)

for (z=0;z<3;z++)

ab[i][z]=ab[i][z]+a[i][j]b[j][z];/此得为要填写的内容/

}

main()

{

int x[3][4]={1,0,1,1,2,1,0,1,1,2,0,3};

int y[4][3]={1,1,1,0,0,0,2,1,1,1,1,3};

int xy[3][3]={0},i,j;

clrscr();

juzhen (x,y,xy);

printf("x ju zhen is:\n");

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

{

for (j=0;j<4;j++)

printf("%3d",x[i][j]);

printf("\n");

}

printf("y ju zhen is:\n");

for (i=0;i<4;i++)

{

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

printf("%3d",y[i][j]);

printf("\n");

}

printf("xy ju zhen is:\n");

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

{

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

printf("%3d",xy[i][j]);

printf("\n");

}

}

由于你没有说要求,我就写了两个,这是两道比较精典的求c语言矩阵乘法程序

#include<stdioh>

int main()

{

int N,a[100][100],i,j,sum;

float average;

    printf("请输入N:\n");

    scanf("%d",&N);

    for(i=0;i<N;i++)

    {

        for(j=0;j<N;j++)

        {

            a[i][j]=iN+j;

        }

    }

    sum=0;

    j=N-1;

    for(i=0;i<N;i++)

    {

        sum=sum+a[i][j];

        j--;

    }

// average=10sum/N;//10将整型转化为浮点型

  average=(float)sum/N;//或直接强制类型转换

    for(i=0;i<N;i++)

    {

        for(j=0;j<N;j++)

        {

            printf("%3d",a[i][j]);

        }

        printf("\n");

    }

    printf("\n");

    printf("次对角线元素之和平均值=%02f\n",average);

    return 0;

}

运行结果如图:

1、首先在电脑中,打开Dev-c++软件,点击“新建源代码”,如下图所示。

2、具体程序如下,如下图所示。

3、此次的程序最终目的是求出3x3的整型矩阵对角线元素之和,所以要向计算机输入3x3矩阵中的所有元素。

4、其次要对输入的矩阵的元素进行放置于相应的位置,以便于之后的计算其对角元素之和。

5、最后需要向计算机指出要计算机计算出哪些元素之和,和需要计算元素的具体位置在哪儿。

6、程序写完之后,点击运行即可求出所要求出的结果了。

我的代码逻辑是:

矩阵行指针初值指向每行首地址,迭代依次取所有行指针指向值组成新行,所有行指针自增。最终组合新的矩阵。

#include <stdioh>

#include <malloch>

int getList(int row,int clo);//获取矩阵地址空间

void setNum(int nList,int n);//填写数值

void prtList(int nList,int row,int clo);//打印矩阵

int zz(int nList,int row,int clo);//转置函数

int main()

{

    int row,clo,nList=NULL,nListSave=NULL;

    printf("输入矩阵行列数:");

    scanf("%d%d",&row,&clo);

    nList=getList(row,clo);

    setNum(nList,rowclo);

    printf("输入的矩阵为:\n");

    prtList(nList,row,clo);

    printf("转置后的矩阵为:\n");

    nListSave=zz(nList,row,clo);

    free(nList);

    nList=nListSave;

    prtList(nList,clo,row);

    return 0;

}

int zz(int nList,int row,int clo)

{

    int nSave=NULL,listSave=NULL,listp=nList,p=NULL,i,j;

    nSave=(int )malloc(sizeof(int)rowclo);

    listSave=(int )malloc(sizeof(int)clo);//倒置后的矩阵

    p=nSave;

    for(j=0;j<clo;j++)

    {

        for(i=0;i<row;i++)

        {

            p++=listp[i];

            listp[i]=listp[i]+1;

        }

    }

    for(i=0;i<clo;i++)

        listSave[i]=&nSave[irow];

    for(i=0;i<row;i++)

        free(nList[i]);//释放原矩阵行空间

    return  listSave;

}

void prtList(int nList,int row,int clo)

{

    int i,j;

    for(i=0;i<row;i++)

    {

        for(j=0;j<clo;j++)

            printf("%d ",nList[i][j]);

        printf("\n");

    }

}

void setNum(int nList,int n)

{

    int p=nList[0];

    printf("填写矩阵中%d个数值:\n",n);

    while(n-->0)

        scanf("%d",p++);

}

int getList(int row,int clo)

{

    int nums,nList,i;

    nums=(int )malloc(sizeof(int)rowclo);

    nList=(int )malloc(sizeof(int)row);

    for(i=0;i<row;i++)

        nList[i]=&nums[iclo];

    return nList;

}

以上就是关于用c语言怎么编写输入一个矩阵求其逆矩阵的程序全部的内容,包括:用c语言怎么编写输入一个矩阵求其逆矩阵的程序、创建一个m*n的01矩阵 完整的c语言程序、C语言编程求矩阵乘积等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9316170.html

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

发表评论

登录后才能评论

评论列表(0条)

保存