怎么实现矩阵的加法、乘法、转置、数乘运算。
C++<br>程序功能简介<br>亘据向量处理的程序:实现矩阵的加法、乘法、转置、数乘运算。<br>1设计要求 1、参照所给的源代码,改用单向链表表示n*n矩阵,其中n为用户可以输入的任意数,并用程序实现验证n*n矩阵的如下定理: A+(B+C)=(A+B)+C A+B=B+A 其中A、B、C分别为n*n矩阵 <br>2、所有的函数与相应的数据封装到类中,并改写主程序,使程序简化。 设计说明 1、本程序应用了很多方法。比如:模板,链表,运算符重载,友元函数,标准输入输出。2、在输入数据时,要严格按照题目提示进行输入,以免出错。<br>3、矩阵的输出形式是以三元组的形式(行号,列号,元素),比如:(1,1,5)表示矩阵中第一行的元素值是5. 4、应以大写字母表示矩阵,如矩阵A;以小写字母表示系数或变量.<br><br>小弟在此谢谢大家了[align=right][color=#000066][此贴子已经被作者于2007-9-16 16:59:21编辑过][/color][/align]
<P><STRONG>void MatrixChain(int *p,int n,int **m,int **s)<BR>{<BR> for(int i=1;i<=n;i++)<BR> m[i][i]=0;<BR> for(int r=2;r<=n;r++)<BR> for( i=1;i<=n-r+1;i++)<BR> {<BR> int j=i+r-1;<BR> m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];<BR> s[i][j]=i;<BR> for(int k=i+1;k<j;k++)<BR> {<BR> int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];<BR> if(t<m[i][j])<BR> {<BR> m[i][j]=t;<BR> s[i][j]=k;<BR> }<BR> }<BR> }<BR> <BR>}</STRONG></P>
<P><STRONG>void Traceback(int i,int j,int **s)<BR>{ <BR> <BR> if(i==j)return;<BR> Traceback(i,s[i][j],s);<BR> Traceback(s[i][j]+1,j,s);<BR> cout<<"让 A"<<i;//<<","<<s[i][j];<BR> cout<<"和 A"<<(s[i][j]+1)<<"相乘"<<endl;//<<","<<j<<"相乘"<<endl;<BR> <BR>}</STRONG></P>
<P><STRONG>void main()<BR>{</STRONG></P>
<P><STRONG> int n,*p;<BR> int j=1;<BR> cout<<"请输入矩阵的个数"<<endl;<BR> cin>>n;<BR> p=new int[n+1];</STRONG></P>
<P><STRONG> cout<<"请输入第一个矩阵的行数,然后按回车键"<<endl;<BR> cin>>p[0];<BR> cout<<"第"<<j<<"个矩阵是"<<endl;<BR> cout<<p[0]<<"*";<BR> cin>>p[1];<BR> // cout<<p[1]<<endl;<BR> cout<<endl;<BR> for(int i=2;i<n+1;i++)<BR> {</STRONG></P>
<P><STRONG> cout<<"第"<<i<<"个矩阵是:";<BR> cout<<p[i-1]<<"*";<BR> cin>>p[i];<BR> }<BR>// int p[]={30,35,15,5,10,20,25};<BR>// int m[6][6],s[6][6];<BR> <BR> int **m,**s;<BR> m=new int*[n];<BR> for( i=1;i<=n;i++)<BR> m[i]=new int[n];</STRONG></P>
<P><STRONG> s=new int*[n];<BR> for( i=1;i<=n;i++)<BR> s[i]=new int[n];<BR> <BR> MatrixChain(p,n,m,s);<BR> Traceback(1,n,s);<BR> <BR>}<BR>这是矩阵连乘的啊!呵呵!</STRONG></P> <P><STRONG>稀疏矩阵运算器<BR>#include "stdio.h"<BR>#include "stdlib.h"<BR>#define MAXSIZE 20<BR>#define MAXRC 50<BR>#define error 0<BR>typedef struct{int i,j;<BR> int e;} Triple ; <BR>typedef struct{<BR> Triple data[MAXSIZE+1];<BR> int rpos[MAXRC+1];<BR> int mu,nu,tu;<BR>} RLSMatrix ; </STRONG></P>
<P><STRONG>void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q)<BR>{ void PRINTF(RLSMatrix *Q);<BR> int x=1;<BR> int y=1;<BR> int z=1; <BR> Q->tu=0; <BR> Q->mu=A->mu;<BR> Q->nu=A->nu; <BR> while(x<=A->tu){if(A->data[x].i<B->data[y].i){<BR> Q->data[z].i=A->data[x].i;<BR> Q->data[z].j=A->data[x].j;<BR> Q->data[z].e=A->data[x].e; <BR> x++;z++;} <BR> else if(A->data[x].i==B->data[y].i){<BR> if(A->data[x].j>B->data[y].j){<BR> Q->data[z].i=B->data[y].i;<BR> Q->data[z].j=B->data[y].j;<BR> Q->data[z].e=B->data[y].e; <BR> y++;z++;}<BR> else if(A->data[x].j==B->data[y].j){<BR> if((Q->data[z].e=A->data[x].e+B->data[y].e)!=0)<BR> {Q->data[z].i=A->data[x].i;<BR> Q->data[z].j=A->data[x].j;<BR> x++;<BR> y++;<BR> z++;}<BR> else<BR> {x++;<BR> y++;}}<BR> else if(A->data[x].j<B->data[y].j){<BR> Q->data[z].i=A->data[x].i;<BR> Q->data[z].j=A->data[x].j;<BR> Q->data[z].e=A->data[x].e;<BR> x++;z++;}}<BR> else if(A->data[x].i>B->data[y].i){<BR> Q->data[z].i=B->data[y].i;<BR> Q->data[z].j=B->data[y].j;<BR> Q->data[z].e=B->data[y].e; <BR> y++;z++;}<BR> if(y>=B->tu)<BR> break;}//while<BR> if(x<=A->tu){<BR> while(x<=A->tu){<BR> Q->data[z].i=A->data[x].i;<BR> Q->data[z].j=A->data[x].j;<BR> Q->data[z].e=A->data[x].e;<BR> x++;z++; }}<BR> if(y<=B->tu){while(y<=B->tu){ <BR> Q->data[z].i=B->data[y].i;<BR> Q->data[z].j=B->data[y].j;<BR> Q->data[z].e=B->data[y].e;<BR> y++;z++;}}<BR> <BR>Q->tu=z; <BR>PRINTF(A);<BR>PRINTF(B);<BR>PRINTF(Q);}</STRONG></P>
<P><STRONG>void SUB(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q)<BR>{<BR> void PRINTF(RLSMatrix *Q);<BR> Q->tu=0;<BR> Q->mu=A->mu;<BR> Q->nu=A->nu;<BR> int x=1;<BR> int y=1;<BR> int z=1;<BR> while(x<=A->tu){if(A->data[x].i<B->data[y].i){<BR> Q->data[z].i=A->data[x].i;<BR> Q->data[z].j=A->data[x].j;<BR> Q->data[z].e=A->data[x].e; <BR> x++;z++;}<BR> else if(A->data[x].i==B->data[y].i)<BR> {if(A->data[x].j>B->data[y].j)<BR> { Q->data[z].i=B->data[y].i;<BR> Q->data[z].j=B->data[y].j;<BR> Q->data[z].e=0-B->data[y].e; <BR> y++;z++;}<BR> else if(A->data[x].j==B->data[y].j){<BR> if((Q->data[z].e=A->data[x].e-B->data[y].e)!=0)<BR> {Q->data[z].i=A->data[x].i;<BR> Q->data[z].j=A->data[x].j;<BR> x++;<BR> y++;<BR> z++;}<BR> else<BR> {x++;<BR> y++;}<BR> }<BR> else if(A->data[x].j<B->data[y].j)<BR> { Q->data[z].i=A->data[x].i;<BR> Q->data[z].j=A->data[x].j;<BR> Q->data[z].e=A->data[x].e;<BR> x++;z++;}<BR> }</STRONG></P>
<P><STRONG> else if(A->data[x].i>B->data[y].i)<BR> { Q->data[z].i=B->data[y].i;<BR> Q->data[z].j=B->data[y].j;<BR> Q->data[z].e=0-B->data[y].e; <BR> y++;z++;}<BR> if(y>=B->tu)<BR> break;<BR> }//while <BR> if(x<=A->tu){<BR> while(x<=A->tu){<BR> Q->data[z].i=A->data[x].i;<BR> Q->data[z].j=A->data[x].j;<BR> Q->data[z].e=A->data[x].e;<BR> x++;z++;}<BR> }<BR> if(y<=B->tu){<BR> while(y<=B->tu){ <BR> Q->data[z].i=B->data[y].i;<BR> Q->data[z].j=B->data[y].j;<BR> Q->data[z].e=0-B->data[y].e;<BR> y++;z++; }<BR> } <BR>Q->tu=z; <BR>PRINTF(A);<BR>PRINTF(B);<BR>PRINTF(Q);}</STRONG></P>
<P><STRONG>void MUL(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q)<BR>{ void PRINTF(RLSMatrix *Q); <BR> int ctemp[MAXRC];<BR> int tp,p,t,arow,brow,q,ccol,i; <BR> Q->mu=A->mu;<BR> Q->nu=B->nu;<BR> Q->tu=0;<BR> if(A->tu*B->tu!=0){<BR> for(arow=1;arow<=A->mu;++arow)<BR> { <BR> for(i=1;i<=Q->nu;i++)<BR> ctemp=0; <BR> Q->rpos[arow]=Q->tu+1;<BR> if(arow<A->mu)<BR> tp=A->rpos[arow+1];<BR> else<BR> tp=A->tu+1;<BR> for(p=A->rpos[arow];p<tp;++p){<BR> brow=A->data[p].j;<BR> if(brow<B->mu)<BR> t=B->rpos[brow+1];<BR> else<BR> t=B->tu+1;<BR> for(q=B->rpos[brow];q<t;++q){<BR> ccol=B->data[q].j;<BR> ctemp[ccol]+=A->data[p].e*B->data[q].e;}<BR> }<BR> for(ccol=1;ccol<=Q->nu;++ccol)<BR> {if(ctemp[ccol])<BR>{if(++Q->tu<=MAXSIZE)<BR> {Q->data[Q->tu].i=arow;<BR> Q->data[Q->tu].j=ccol;<BR> Q->data[Q->tu].e=ctemp[ccol];}<BR> }<BR> }<BR> }<BR>}</STRONG></P>
<P><STRONG>PRINTF(A);<BR>PRINTF(B);<BR>PRINTF(Q);}</STRONG></P>
<P><BR><STRONG>void PRINTF( RLSMatrix *A)<BR>{<BR>int arow,i=1,col;<BR>int z=0;<BR>for(arow=1;arow<=A->mu;arow++)<BR> { printf("\n");<BR>for(col=1;col<=A->nu;col++)<BR> { if(A->data.i==arow&&A->data.j==col&&i<=A->tu)<BR> printf("%-4d",A->data[i++].e);<BR> else printf("%-4d",z);}<BR>}<BR>printf("\n");}<BR> <BR>void main()<BR>{ void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q);<BR> void SUB(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q);<BR> void MUL(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q); <BR> int k,c,num[MAXRC];<BR>char cmd;<BR> RLSMatrix *A,*B,*Q; <BR> A=( RLSMatrix *)malloc(sizeof( RLSMatrix));<BR> B=( RLSMatrix *)malloc(sizeof( RLSMatrix));<BR> Q=( RLSMatrix *)malloc(sizeof( RLSMatrix));<BR>do{<BR>printf("请输入矩阵A的行数列数和非零元个数:");<BR> scanf("%d %d %d",&A->mu,&A->nu,&A->tu);<BR> printf("请输入矩阵A的非零元:");<BR> for(k=1;k<=A->tu;k++)<BR> scanf("%d %d %d",&A->data[k].i,&A->data[k].j,&A->data[k].e);<BR> for(k=1;k<=A->mu;k++)<BR>num[k]=0;<BR>for(k=1;k<=A->tu;k++)<BR>++num[A->data[k].i];<BR>A->rpos[1]=1;<BR>for(k=2;k<=A->mu;k++)<BR>A->rpos[k]=A->rpos[k-1]+num[k-1]; <BR> printf("请输入矩阵B的行数列数和非零元个数:");<BR> scanf("%d %d %d",&B->mu,&B->nu,&B->tu);<BR> printf("请输入矩阵B的非零元:");<BR> for(k=1;k<=B->tu;k++)<BR> scanf("%d %d %d",&B->data[k].i,&B->data[k].j,&B->data[k].e);</STRONG></P>
<P><STRONG> for(k=1;k<=B->mu;k++)<BR>num[k]=0;<BR>for(k=1;k<=B->tu;k++)<BR>++num[B->data[k].i];<BR>B->rpos[1]=1;<BR>for(k=2;k<=B->mu;k++)<BR>B->rpos[k]=B->rpos[k-1]+num[k-1]; <BR> getchar();<BR> printf("请输入要进行的操作:");<BR> c=getchar();<BR> if(c=='+')<BR> {<BR> if(A->mu==B->mu&&A->nu==B->nu)<BR> ADD(A,B,Q);}<BR> else if(c=='-')<BR> {<BR> if(A->mu==B->mu&&A->nu==B->nu)<BR> SUB(A,B,Q);}<BR> else if(c=='*')<BR> {<BR> if(A->nu==B->mu)<BR> MUL(A,B,Q);}<BR> else<BR> printf("error operation!");<BR> printf(" Y或y继续");<BR> scanf("%s",&cmd);<BR> }while(cmd=='Y'||cmd=='y');</STRONG><BR><STRONG>呵呵,回帖感谢一下吧!</STRONG><BR></P> <P>谢谢哈``</P>
页:
[1]
