您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > c语言求基本关联矩阵
矿井通风网络论程序作业学院:矿业学院专业:安全工程姓名:雷斌学号:1208010028年级:2012级任课教师:袁梅2015年5月6日这是个5,7图,以树T={e2,e4,e6,e7}在前余树弦在后的顺序,求B1,Cf,Sf下面是我所写程序,(是用C语言写的)#includestdio.h#includestdlib.h#includeconio.h#includemath.hintm,n;double**a,**b11,**b12,**zb11,**zb12,**nzb12,**c12,*C,*AA,*B,**sf,**s11,**cf,**B1;double*Q,*Z;voidCreate_Omr(intm,intn);//创建原始矩阵变量函数voidFree_mr();intbrinv(double*a,intn);voidbrmul(doublea[],doubleb[],intm,intn,intk,doublec[]);voidmain(){inti,j,M,k;intt=0;printf(输入m);scanf(%d,&m);printf(输入n);scanf(%d,&n);M=m-1;Create_Omr(m,n);//调用创建动态数组函数printf(输入起点Q[n]);for(i=0;in;i++)scanf(%lf,&Q[i]);printf(输入终点Z[n]);for(i=0;in;i++)scanf(%lf,&Z[i]);printf(开始计算各个矩阵\n);for(i=0;im;i++)for(j=0;jn;j++)a[i][j]=0.0;//初始化a的值全部置0for(j=0;jn;j++)//求关联矩阵的过程{i=(int)Q[j]-1;a[i][j]=1;}for(j=0;jn;j++){i=(int)Z[j]-1;a[i][j]=-1;}printf(输出关联矩阵B\n);for(i=0;im;i++){for(j=0;jn;j++)printf(%3d,(int)a[i][j]);printf(\n);}printf(输入基本关联矩阵B);scanf(%d,&k);for(i=0;im-1;i++)/////求基本关联矩阵Bk{if(i==(k-1)){for(j=0;jn;j++)B1[i][j]=a[k][j];t++;}elsefor(j=0;jn;j++)B1[i][j]=a[i+t][j];}printf(输出基本关联矩阵B%d\n,k);for(i=0;im-1;i++){for(j=0;jn;j++)printf(%3d,(int)B1[i][j]);printf(\n);}for(i=0;im-1;i++)//求B11for(j=0;jn-m+1;j++)b11[i][j]=B1[i][j];for(i=0;im-1;i++)//求B12for(j=n-m+1;jn;j++)b12[i][j-n+m-1]=B1[i][j];for(i=0;im-1;i++)//求-ZB11for(j=0;jn-m+1;j++)zb11[j][i]=-(int)b11[i][j];for(i=0;im-1;i++)//求ZB12for(j=0;jm-1;j++)zb12[j][i]=b12[i][j];/*从这里开始把二维数组接入一位数组,(因为动态二维数组分配的内存空间不是连续的,所以用一个一维数组记录他的数据好传给逆矩阵的调用函数)*/for(i=0;im-1;i++)for(j=0;jm-1;j++){AA[i*(m-1)+j]=zb12[i][j];//这里必须给AA和B赋值我把zb12赋值给它们不然是随机数B[i*(m-1)+j]=zb12[i][j];}i=brinv(AA,M);//求逆矩阵调用函数k=0;for(i=0;im-1;i++)//把所求得逆矩阵,从新变成二维数组,方便C12的计算for(j=0;jm-1;j++){nzb12[i][j]=AA[k];k++;}for(i=0;in-m+1;i++)//这里必须给c12赋0,不然求不出c12for(j=0;jm-1;j++)c12[i][j]=0.0;for(i=0;in-m+1;i++)//求c12的过程,用循环语句来计算矩阵的乘法{for(j=0;jm-1;j++){for(k=0;km-1;k++){c12[i][j]=c12[i][j]+zb11[i][k]*nzb12[k][j];//矩阵的乘法}}}for(i=0;in-m+1;i++)/*求cf矩阵的过程*/for(j=0;jn-m+1;j++)if(i==j)cf[i][j]=1.0;elsecf[i][j]=0.0;for(i=0;in-m+1;i++)for(j=0;jm-1;j++)cf[i][j+n-m+1]=c12[i][j];printf(独立回路矩阵cf:\n);//输出cf矩阵for(i=0;in-m+1;i++){for(j=0;jn;j++)printf(%3d,(int)cf[i][j]);printf(\n);}for(i=0;in-m+1;i++)//求s11矩阵的过程for(j=0;jm-1;j++)s11[j][i]=-c12[i][j];for(i=0;im-1;i++)////求sf矩阵的过程sf[i][i+n-m+1]=1;for(i=0;im-1;i++)for(j=0;jn-m+1;j++)sf[i][j]=s11[i][j];printf(独立割集矩阵sf:\n);for(i=0;im-1;i++)//输出sf矩阵{for(j=0;jn;j++)printf(%3d,(int)sf[i][j]);printf(\n);}}voidCreate_Omr(intm,intn)//创建各个矩阵{inti;printf(你输的是一个%d,%d图\n,m,n);a=(double**)malloc(m*sizeof(double));b11=(double**)malloc((m-1)*sizeof(double));b12=(double**)malloc((m-1)*sizeof(double));zb11=(double**)malloc((n-m+1)*sizeof(double));zb12=(double**)malloc((m-1)*sizeof(double));C=(double*)malloc((m-1)*(m-1)*sizeof(double));B=(double*)malloc((m-1)*(m-1)*sizeof(double));AA=(double*)malloc((m-1)*(m-1)*sizeof(double));cf=(double**)malloc((n-m+1)*sizeof(double));sf=(double**)malloc((m-1)*sizeof(double));s11=(double**)malloc((m-1)*sizeof(double));B1=(double**)malloc((m-1)*sizeof(double));nzb12=(double**)malloc((m-1)*sizeof(double));c12=(double**)malloc((n-m+1)*sizeof(double));Q=(double*)malloc(n*sizeof(double));Z=(double*)malloc(n*sizeof(double));for(i=0;im;i++)a[i]=(double*)malloc(n*sizeof(double));//动态分配矩阵列数组for(i=0;im-1;i++)b11[i]=(double*)malloc((n-m+1)*sizeof(double));//动态分配矩阵列数组for(i=0;im-1;i++){b12[i]=(double*)malloc((m-1)*sizeof(double));//动态分配矩阵列数组zb12[i]=(double*)malloc((m-1)*sizeof(double));//动态分配矩阵列数组nzb12[i]=(double*)malloc((m-1)*sizeof(double));//动态分配矩阵列数组s11[i]=(double*)malloc((n-m+1)*sizeof(double));//动态分配矩阵列数组sf[i]=(double*)malloc(n*sizeof(double));//动态分配矩阵列数组B1[i]=(double*)malloc(n*sizeof(double));//动态分配矩阵列数组}for(i=0;in-m+1;i++){zb11[i]=(double*)malloc((m-1)*sizeof(double));//动态分配矩阵列数组c12[i]=(double*)malloc((m-1)*sizeof(double));//动态分配矩阵列数组cf[i]=(double*)malloc(n*sizeof(double));//动态分配矩阵列数组}}intbrinv(double*a,intn)//求逆矩阵的函数{int*is,*js,i,j,k,l,u,v;doubled,p;is=malloc(n*sizeof(double));js=malloc(n*sizeof(double));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(pd){d=p;is[k]=i;js[k]=j;}}if(d+1.0==1.0){free(is);free(js);printf(err**notinv\n);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);}///注意,用malloc动态分配数组,本应该释放的,但为了程序短一点,所以就不释放了。不释放也不会影响程序的我是用动态分配储存空间的方法分配二维数组的(也就是矩阵),所以写程序是通用的。可以求所有m,n图(全过程不用改程序,求Bk也不用改),不只是5,7图。(我把我们上课做的作业6,9图,也输进去了结果也是对的)我的基本关联矩阵Bk是自己输的,输1,就是求B1,输2就是求B2,输3就是求B3,等等(下面运行所求BK也是对的),我想这些就
本文标题:c语言求基本关联矩阵
链接地址:https://www.777doc.com/doc-4813866 .html