注册 登录
编程论坛 C++ Builder

怎么实现矩阵的加法、乘法、转置、数乘运算。

smokeryiyi 发布于 2007-09-16 16:57, 5769 次点击
C++
程序功能简介
亘据向量处理的程序:实现矩阵的加法、乘法、转置、数乘运算。
1设计要求 1、参照所给的源代码,改用单向链表表示n*n矩阵,其中n为用户可以输入的任意数,并用程序实现验证n*n矩阵的如下定理: A+(B+C)=(A+B)+C A+B=B+A 其中A、B、C分别为n*n矩阵
2、所有的函数与相应的数据封装到类中,并改写主程序,使程序简化。 设计说明 1、本程序应用了很多方法。比如:模板,链表,运算符重载,友元函数,标准输入输出。2、在输入数据时,要严格按照题目提示进行输入,以免出错。
3、矩阵的输出形式是以三元组的形式(行号,列号,元素),比如:(1,1,5)表示矩阵中第一行的元素值是5. 4、应以大写字母表示矩阵,如矩阵A;以小写字母表示系数或变量.

小弟在此谢谢大家了

[此贴子已经被作者于2007-9-16 16:59:21编辑过]

3 回复
#2
风致2007-09-24 22:38

#include "iostream.h"

void MatrixChain(int *p,int n,int **m,int **s)
{
for(int i=1;i<=n;i++)
m[i][i]=0;
for(int r=2;r<=n;r++)
for( i=1;i<=n-r+1;i++)
{
int j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(int k=i+1;k<j;k++)
{
int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t<m[i][j])
{
m[i][j]=t;
s[i][j]=k;
}
}
}

}

void Traceback(int i,int j,int **s)
{

if(i==j)return;
Traceback(i,s[i][j],s);
Traceback(s[i][j]+1,j,s);
cout<<"让 A"<<i;//<<","<<s[i][j];
cout<<"和 A"<<(s[i][j]+1)<<"相乘"<<endl;//<<","<<j<<"相乘"<<endl;

}

void main()
{

int n,*p;
int j=1;
cout<<"请输入矩阵的个数"<<endl;
cin>>n;
p=new int[n+1];

cout<<"请输入第一个矩阵的行数,然后按回车键"<<endl;
cin>>p[0];
cout<<"第"<<j<<"个矩阵是"<<endl;
cout<<p[0]<<"*";
cin>>p[1];
// cout<<p[1]<<endl;
cout<<endl;
for(int i=2;i<n+1;i++)
{

cout<<"第"<<i<<"个矩阵是:";
cout<<p[i-1]<<"*";
cin>>p[i];
}
// int p[]={30,35,15,5,10,20,25};
// int m[6][6],s[6][6];

int **m,**s;
m=new int*[n];
for( i=1;i<=n;i++)
m[i]=new int[n];

s=new int*[n];
for( i=1;i<=n;i++)
s[i]=new int[n];

MatrixChain(p,n,m,s);
Traceback(1,n,s);

}
这是矩阵连乘的啊!呵呵!

#3
风致2007-09-24 22:46

稀疏矩阵运算器
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 20
#define MAXRC 50
#define error 0
typedef struct{int i,j;
int e;} Triple ;
typedef struct{
Triple data[MAXSIZE+1];
int rpos[MAXRC+1];
int mu,nu,tu;
} RLSMatrix ;

void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q)
{ void PRINTF(RLSMatrix *Q);
int x=1;
int y=1;
int z=1;
Q->tu=0;
Q->mu=A->mu;
Q->nu=A->nu;
while(x<=A->tu){if(A->data[x].i<B->data[y].i){
Q->data[z].i=A->data[x].i;
Q->data[z].j=A->data[x].j;
Q->data[z].e=A->data[x].e;
x++;z++;}
else if(A->data[x].i==B->data[y].i){
if(A->data[x].j>B->data[y].j){
Q->data[z].i=B->data[y].i;
Q->data[z].j=B->data[y].j;
Q->data[z].e=B->data[y].e;
y++;z++;}
else if(A->data[x].j==B->data[y].j){
if((Q->data[z].e=A->data[x].e+B->data[y].e)!=0)
{Q->data[z].i=A->data[x].i;
Q->data[z].j=A->data[x].j;
x++;
y++;
z++;}
else
{x++;
y++;}}
else if(A->data[x].j<B->data[y].j){
Q->data[z].i=A->data[x].i;
Q->data[z].j=A->data[x].j;
Q->data[z].e=A->data[x].e;
x++;z++;}}
else if(A->data[x].i>B->data[y].i){
Q->data[z].i=B->data[y].i;
Q->data[z].j=B->data[y].j;
Q->data[z].e=B->data[y].e;
y++;z++;}
if(y>=B->tu)
break;}//while
if(x<=A->tu){
while(x<=A->tu){
Q->data[z].i=A->data[x].i;
Q->data[z].j=A->data[x].j;
Q->data[z].e=A->data[x].e;
x++;z++; }}
if(y<=B->tu){while(y<=B->tu){
Q->data[z].i=B->data[y].i;
Q->data[z].j=B->data[y].j;
Q->data[z].e=B->data[y].e;
y++;z++;}}

Q->tu=z;
PRINTF(A);
PRINTF(B);
PRINTF(Q);}

void SUB(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q)
{
void PRINTF(RLSMatrix *Q);
Q->tu=0;
Q->mu=A->mu;
Q->nu=A->nu;
int x=1;
int y=1;
int z=1;
while(x<=A->tu){if(A->data[x].i<B->data[y].i){
Q->data[z].i=A->data[x].i;
Q->data[z].j=A->data[x].j;
Q->data[z].e=A->data[x].e;
x++;z++;}
else if(A->data[x].i==B->data[y].i)
{if(A->data[x].j>B->data[y].j)
{ Q->data[z].i=B->data[y].i;
Q->data[z].j=B->data[y].j;
Q->data[z].e=0-B->data[y].e;
y++;z++;}
else if(A->data[x].j==B->data[y].j){
if((Q->data[z].e=A->data[x].e-B->data[y].e)!=0)
{Q->data[z].i=A->data[x].i;
Q->data[z].j=A->data[x].j;
x++;
y++;
z++;}
else
{x++;
y++;}
}
else if(A->data[x].j<B->data[y].j)
{ Q->data[z].i=A->data[x].i;
Q->data[z].j=A->data[x].j;
Q->data[z].e=A->data[x].e;
x++;z++;}
}

else if(A->data[x].i>B->data[y].i)
{ Q->data[z].i=B->data[y].i;
Q->data[z].j=B->data[y].j;
Q->data[z].e=0-B->data[y].e;
y++;z++;}
if(y>=B->tu)
break;
}//while
if(x<=A->tu){
while(x<=A->tu){
Q->data[z].i=A->data[x].i;
Q->data[z].j=A->data[x].j;
Q->data[z].e=A->data[x].e;
x++;z++;}
}
if(y<=B->tu){
while(y<=B->tu){
Q->data[z].i=B->data[y].i;
Q->data[z].j=B->data[y].j;
Q->data[z].e=0-B->data[y].e;
y++;z++; }
}
Q->tu=z;
PRINTF(A);
PRINTF(B);
PRINTF(Q);}

void MUL(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q)
{ void PRINTF(RLSMatrix *Q);
int ctemp[MAXRC];
int tp,p,t,arow,brow,q,ccol,i;
Q->mu=A->mu;
Q->nu=B->nu;
Q->tu=0;
if(A->tu*B->tu!=0){
for(arow=1;arow<=A->mu;++arow)
{
for(i=1;i<=Q->nu;i++)
ctemp=0;
Q->rpos[arow]=Q->tu+1;
if(arow<A->mu)
tp=A->rpos[arow+1];
else
tp=A->tu+1;
for(p=A->rpos[arow];p<tp;++p){
brow=A->data[p].j;
if(brow<B->mu)
t=B->rpos[brow+1];
else
t=B->tu+1;
for(q=B->rpos[brow];q<t;++q){
ccol=B->data[q].j;
ctemp[ccol]+=A->data[p].e*B->data[q].e;}
}
for(ccol=1;ccol<=Q->nu;++ccol)
{if(ctemp[ccol])
{if(++Q->tu<=MAXSIZE)
{Q->data[Q->tu].i=arow;
Q->data[Q->tu].j=ccol;
Q->data[Q->tu].e=ctemp[ccol];}
}
}
}
}

PRINTF(A);
PRINTF(B);
PRINTF(Q);}


void PRINTF( RLSMatrix *A)
{
int arow,i=1,col;
int z=0;
for(arow=1;arow<=A->mu;arow++)
{ printf("\n");
for(col=1;col<=A->nu;col++)
{ if(A->data.i==arow&&A->data.j==col&&i<=A->tu)
printf("%-4d",A->data[i++].e);
else printf("%-4d",z);}
}
printf("\n");}

void main()
{ void ADD(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q);
void SUB(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q);
void MUL(RLSMatrix *A,RLSMatrix *B,RLSMatrix *Q);
int k,c,num[MAXRC];
char cmd;
RLSMatrix *A,*B,*Q;
A=( RLSMatrix *)malloc(sizeof( RLSMatrix));
B=( RLSMatrix *)malloc(sizeof( RLSMatrix));
Q=( RLSMatrix *)malloc(sizeof( RLSMatrix));
do{
printf("请输入矩阵A的行数列数和非零元个数:");
scanf("%d %d %d",&A->mu,&A->nu,&A->tu);
printf("请输入矩阵A的非零元:");
for(k=1;k<=A->tu;k++)
scanf("%d %d %d",&A->data[k].i,&A->data[k].j,&A->data[k].e);
for(k=1;k<=A->mu;k++)
num[k]=0;
for(k=1;k<=A->tu;k++)
++num[A->data[k].i];
A->rpos[1]=1;
for(k=2;k<=A->mu;k++)
A->rpos[k]=A->rpos[k-1]+num[k-1];
printf("请输入矩阵B的行数列数和非零元个数:");
scanf("%d %d %d",&B->mu,&B->nu,&B->tu);
printf("请输入矩阵B的非零元:");
for(k=1;k<=B->tu;k++)
scanf("%d %d %d",&B->data[k].i,&B->data[k].j,&B->data[k].e);

for(k=1;k<=B->mu;k++)
num[k]=0;
for(k=1;k<=B->tu;k++)
++num[B->data[k].i];
B->rpos[1]=1;
for(k=2;k<=B->mu;k++)
B->rpos[k]=B->rpos[k-1]+num[k-1];
getchar();
printf("请输入要进行的操作:");
c=getchar();
if(c=='+')
{
if(A->mu==B->mu&&A->nu==B->nu)
ADD(A,B,Q);}
else if(c=='-')
{
if(A->mu==B->mu&&A->nu==B->nu)
SUB(A,B,Q);}
else if(c=='*')
{
if(A->nu==B->mu)
MUL(A,B,Q);}
else
printf("error operation!");
printf(" Y或y继续");
scanf("%s",&cmd);
}while(cmd=='Y'||cmd=='y');

呵呵,回帖感谢一下吧!

#4
smokeryiyi2007-10-11 14:46

谢谢哈``

1