您好,欢迎访问三七文档
实验一矩阵相乘与求逆一、实验要求1)请编出矩阵A和B相乘得到矩阵R的运算计算机程序,要求A和B的维数及数值可以通过键盘及数据文件输入,计算结果R可由屏幕及文件输出。2)将题一的程序改为子程序。3)查找有关的资料,读懂及调通矩阵求逆子程序,并改写为子程序。二、实验过程1)键盘输入矩阵A和B,屏幕上显示计算结果矩阵R。#includestdio.h#includestdlib.hintmain(){inti,j,k,m,n,p,q;printf(请输入A矩阵的行数:);scanf(%d,&m);printf(请输入A矩阵的列数:);scanf(%d,&n);printf(请输入B矩阵的行数:);scanf(%d,&p);printf(请输入B矩阵的列数:);scanf(%d,&q);if(n!=p)printf(请检查A矩阵的列数与B矩阵的行数是否一致!);else{double**matrixA,**matrixB,**matrixC;matrixA=(double**)malloc(sizeof(double*)*m);matrixA[0]=(double*)malloc(sizeof(double)*m*n);matrixB=(double**)malloc(sizeof(double*)*p);matrixB[0]=(double*)malloc(sizeof(double)*p*q);matrixC=(double**)malloc(sizeof(double*)*m);matrixC[0]=(double*)malloc(sizeof(double)*m*q);for(i=1;im;i++){matrixA[i]=matrixA[i-1]+n;}for(i=1;ip;i++){matrixB[i]=matrixB[i-1]+q;}for(i=1;im;i++){matrixC[i]=matrixC[i-1]+q;}printf(请输入A矩阵的数:\n);for(i=0;im;i++)for(j=0;jn;j++)scanf(%lf,&matrixA[i][j]);printf(\n输入的A矩阵是:\n);for(i=0;im;i++){for(j=0;jn;j++)printf(%7.3lf\t,matrixA[i][j]);printf(\n);}printf(请输入B矩阵的数:\n);for(i=0;ip;i++)for(j=0;jq;j++)scanf(%lf,&matrixB[i][j]);printf(\n输入的B矩阵是:\n);for(i=0;ip;i++){for(j=0;jq;j++)printf(%7.3lf\t,matrixB[i][j]);printf(\n);}for(i=0;im;i++)for(j=0;jq;j++)matrixC[i][j]=0;for(i=0;im;i++)for(j=0;jq;j++)for(k=0;kn;k++)matrixC[i][j]=matrixC[i][j]+matrixA[i][k]*matrixB[k][j];printf(\n矩阵A*B的结果是:\n);for(i=0;im;i++){for(j=0;jq;j++)printf(%7.3lf\t,matrixC[i][j]);printf(\n);}free(matrixA);free(matrixB);free(matrixC);}getchar();getchar();}运行的结果如下:2)实现文本的矩阵输入与计算结果的输出,并将相乘改为子程序。#includestdio.hintmain(){voidmatrix_mutipl(double**matrixA,double**matrixB,double**matrixC,intm,intn,intq);charch;intm=0,n=0,p=0,q=0,i=0,j=0,k=0;charinfileA[80],infileB[80],outfile[80];FILE*fpin1,*fpin2,*fpin3;double**matrixA,**matrixB,**matrixC;printf(EntertheinfileAname:\n);scanf(%s,infileA);if((fpin1=fopen(infileA,r))==NULL){printf(Can'topenfile%s\n,infileA);exit(0);}do{ch=fgetc(fpin1);if(ch=='\t')n++;if(ch=='\n')m++;}while(!feof(fpin1));n=(n+m)/m;printf(输入的矩阵A行与列数分别为:%d,%d\n,m,n);fclose(fpin1);fflush(stdin);matrixA=(double**)malloc(sizeof(double*)*m);matrixA[0]=(double*)malloc(sizeof(double)*m*n);for(i=1;im;i++){matrixA[i]=matrixA[i-1]+n;}for(i=0;im;i++)for(j=0;jn;j++)matrixA[i][j]=0;if((fpin1=fopen(infileA,r))==NULL){printf(Can'topenfile%s\n,infileA);exit(0);}do{ch=fgetc(fpin1);}while(!feof(fpin1)&&(ch'0'||ch'9'));if(feof(fpin1))exit(0);ungetc(ch,fpin1);do{i=k/n;j=k%n;fscanf(fpin1,%lf,&matrixA[i][j]);k++;}while(!feof(fpin1)&&km*n);fclose(fpin1);printf(输入的A矩阵为:\n);for(i=0;im;i++){for(j=0;jn;j++){printf(%lf,matrixA[i][j]);printf(\t);}printf(\n);}fflush(stdin);printf(EntertheinfileBname:\n);scanf(%s,infileB);if((fpin2=fopen(infileB,r))==NULL){printf(Can'topenfile%s\n,infileB);exit(0);}do{ch=fgetc(fpin2);if(ch=='\t')q++;if(ch=='\n')p++;}while(!feof(fpin2));q=(p+q)/p;printf(输入的矩阵B行与列数分别为:%d,%d\n,p,q);fclose(fpin2);fflush(stdin);matrixB=(double**)malloc(sizeof(double*)*p);matrixB[0]=(double*)malloc(sizeof(double)*p*q);for(i=1;ip;i++){matrixB[i]=matrixB[i-1]+q;}for(i=0;ip;i++)for(j=0;jq;j++)matrixB[i][j]=0;if((fpin2=fopen(infileB,r))==NULL){printf(Can'topenfile%s\n,infileB);exit(0);}do{ch=fgetc(fpin2);}while(!feof(fpin2)&&(ch'0'||ch'9'));if(feof(fpin2))exit(0);ungetc(ch,fpin2);k=0;do{i=k/q;j=k%q;fscanf(fpin2,%lf,&matrixB[i][j]);k++;}while(!feof(fpin2)&&kp*q);fclose(fpin2);printf(输入的B矩阵为:\n);for(i=0;ip;i++){for(j=0;jq;j++){printf(%lf,matrixB[i][j]);printf(\t);}printf(\n);}fflush(stdin);matrixC=(double**)malloc(sizeof(double*)*m);matrixC[0]=(double*)malloc(sizeof(double)*m*q);for(i=1;im;i++){matrixC[i]=matrixC[i-1]+q;}for(i=0;im;i++)for(j=0;jq;j++)matrixC[i][j]=0;matrix_mutipl((double**)matrixA,(double**)matrixB,(double**)matrixC,m,n,q);printf(矩阵A*B为:\n);for(i=0;im;i++){for(j=0;jq;j++){printf(%lf,*(*(matrixC+i)+j));printf(\t);}printf(\n);}fflush(stdin);printf(Entertheoutfilename:\n);scanf(%s,outfile);if((fpin3=fopen(outfile,w))==NULL){printf(Can'topenfile%s\n,outfile);exit(0);}for(i=0;im;i++){for(j=0;jq;j++){fprintf(fpin3,%lf,*(*(matrixC+i)+j));fprintf(fpin3,\t);}fprintf(fpin3,\n);}fflush(stdin);getchar();}voidmatrix_mutipl(double**matrixA,double**matrixB,double**matrixC,intm,intn,intq){intk=0,j=0,i=0;for(i=0;im;i++)for(j=0;jq;j++)for(k=0;kn;k++)*(*(matrixC+i)+j)=*(*(matrixC+i)+j)+*(*(matrixA+i)+k)*(*(*(matrixB+k)+j));}运行结果如下:文本文件1.dat和2.dat需要放在程序的同一文件夹下,否则需要说明路径。3)矩阵求逆子程序#includestdio.h#includemalloc.h#includemath.hvoidmain(){intinv(double*p,intn);doublea[4][4]={{1,2,0,0},{1,2,0,0},{0,0,3,0},{0,0,0,1}},*ab;ab=a[0];intn=4,i=0,j;i=inv(ab,n);if(i!=0)for(i=0;in;i++){putchar('\n');for(j=0;jn;j++)printf(%f,a[i][j]);}getchar();}intinv(double*p,intn){voidswap(double*a,double*b);int*is,*js,i,j,k,l;for(i=0;in;i++){putchar('\n');for(j=0;jn;j++)printf(%f,*(p+i*n+j));}puts(\n\n\n\n);doubletemp,fmax;is=(int*)malloc(n*sizeof(int));js=(int*)malloc(n*sizeof(int));for(k=0;kn;k++){fmax=0.0;for(i=k;in;i++)for(j=k;jn;j++){temp=fabs(*(p+i*n+j));if(tempfmax){fmax=temp;is[k]=i;js[k]=j;}}if((fmax
本文标题:系统辨识实验报告
链接地址:https://www.777doc.com/doc-5678556 .html