| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 416 人关注过本帖
标题:稀疏矩阵的算术
取消只看楼主 加入收藏
linshijin
Rank: 2
来 自:厦门
等 级:论坛游民
帖 子:40
专家分:24
注 册:2010-12-8
结帖率:50%
收藏
 问题点数:0 回复次数:0 
稀疏矩阵的算术
程序代码:

#include<stdio.h>
#define MAXSIZE 400
typedef struct
{int i,j,e;}Triple;
typedef struct RLSMatrix
{Triple data[MAXSIZE+1];
int rpos[21];
int mu,nu,tu;
}RLSMatrix;
void main()
{
void AddSubtract(RLSMatrix,RLSMatrix,RLSMatrix *,char);
void MultSMatrix(RLSMatrix,RLSMatrix,RLSMatrix *);
void print(RLSMatrix);
char c;
int num,cnt=0;
Triple *p;
RLSMatrix M,N,Q;
RLSMatrix *s;
s=&Q;
printf("请输入你要做的运算('+'代表加法,'-'代表减法,'*'代表乘法)!\n");
scanf("%c",&c);
printf("请分别输入第一个矩阵的行数,列数以及非零元素个数!\n");
scanf("%d,%d,%d",&M.mu,&M.nu,&M.tu);
printf("请分别输入第二个矩阵的行数,列数以及非零元素个数!\n");
scanf("%d,%d,%d",&N.mu,&N.nu,&N.tu);
while((c=='*')&&(M.nu!=N.mu)||(c=='+'||c=='-')&&!((M.nu==N.nu)&&(M.mu==N.mu)))
{
    printf("输入有错,请重新输入!\n");
    printf("请分别输入第一个矩阵的行数,列数以及非零元素个数!\n");
    scanf("%d,%d,%d",&M.mu,&M.nu,&M.tu);
    printf("请分别输入第二个矩阵的行数,列数以及非零元素个数!\n");
    scanf("%d,%d,%d",&N.mu,&N.nu,&N.tu);
}
printf("请按行优先原则依次输入第一个稀疏矩阵的非零元素的行,列以及值!\n");
for(num=1;num<=M.tu;++num)
scanf("%d,%d,%d",&M.data[num].i,&M.data[num].j,&M.data[num].e);
printf("请按行优先原则依次输入第二个稀疏矩阵的非零元素的行,列以及值!\n");
for(num=1;num<=N.tu;++num)
scanf("%d,%d,%d",&N.data[num].i,&N.data[num].j,&N.data[num].e);
//请M,N矩阵对应的rpos数组,从下标0开始存储每一行的第一个非零元素在data数组中的位置,虚设一个rpos[mu+1]单元来指示矩阵最后一行非零元素的范围
M.rpos[0]=1;
for(num=1,p=M.data+1;num<=M.mu;++num)
{while(num==p->i)
{cnt++;
p++;}
M.rpos[num]=M.rpos[num-1]+cnt;
cnt=0;}
N.rpos[0]=1;
for(num=1,p=N.data+1;num<=N.mu;++num)
{while(num==p->i)
{cnt++;
p++;}
N.rpos[num]=N.rpos[num-1]+cnt;
cnt=0;}
if(c=='*')
     MultSMatrix(M,N,s);
else
    AddSubtract(M,N,s,c);
print(Q);
}

void AddSubtract(RLSMatrix M,RLSMatrix N,RLSMatrix *s,char c)
{s->mu=M.mu;
s->nu=M.nu;
s->tu=0;
int tp,t,cnt=1,arow;
for(arow=1;arow<=M.mu;++arow)
{s->rpos[arow-1]=s->tu+1;
tp=M.rpos[arow-1];
t=N.rpos[arow-1];
while(tp<M.rpos[arow]&&t<N.rpos[arow])
{if (M.data[tp].j<N.data[t].j)
{s->data[cnt++]=M.data[tp];
tp++;}
else if(N.data[t].j<M.data[tp].j)
{
s->data[cnt].i=N.data[t].i;
s->data[cnt].j=N.data[t].j;
s->data[cnt].e=(c=='+')?N.data[t].e:-N.data[t].e;
cnt++;
t++;}
else
{if((M.data[tp].e+N.data[t].e)!=0&&(c=='+')||(c=='-')&&(M.data[tp].e-N.data[t].e)!=0)
{s->data[cnt].i=N.data[t].i;
s->data[cnt].j=N.data[t].j;
s->data[cnt].e=(c=='+')?N.data[t].e+M.data[tp].e:M.data[tp].e-N.data[t].e;
cnt++;
}
tp++;
t++;
}}
while(tp<M.rpos[arow])
{s->data[cnt++]=M.data[tp];
tp++;}
while(t<N.rpos[arow])
{    s->data[cnt].i=N.data[t].i;
s->data[cnt].j=N.data[t].j;
s->data[cnt].e=(c=='+')?N.data[t].e:-N.data[t].e;
cnt++;
t++;}
s->tu=cnt-1;
}}

void MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *s)
{int p,q,arow,brow,ctemp[21],ccol;
s->mu=M.mu;
s->nu=N.nu;
s->tu=0;
for(arow=1;arow<=M.mu;++arow)
{for(p=1;p<=M.nu;p++)
ctemp[p]=0;
s->rpos[arow-1]=s->tu+1;
for(p=M.rpos[arow-1];p<M.rpos[arow];++p)
{brow=M.data[p].j;
for(q=N.rpos[brow-1];q<N.rpos[brow];++q)
{ccol=N.data[q].j;
ctemp[ccol]+=M.data[p].e*N.data[q].e;}}
for(ccol=1;ccol<=s->nu;++ccol)
    if(ctemp[ccol])
    {++s->tu;
s->data[s->tu].i=arow;
s->data[s->tu].j=ccol;
s->data[s->tu].e=ctemp[ccol];}
}}

void print(RLSMatrix Q)
{
int arow,brow,p=1;
for(arow=1;arow<=Q.mu;arow++)
{
for(brow=1;brow<=Q.nu;brow++)
{if(Q.data[p].j==brow&&Q.data[p].i==arow)
{printf(" %d",Q.data[p].e);
p++;}
else
    printf(" 0");
}
printf("\n");}
}


搜索更多相关主题的帖子: 算术 矩阵 
2010-12-08 23:53
快速回复:稀疏矩阵的算术
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018539 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved