一个矩阵加法

ttt9107 2011-04-15 07:56:31
#define MAXSIZE 20 // 非零元个数的最大值
typedef struct {
int i,j; // 行下标,列下标
ElemType e; // 非零元素值
}Triple;

typedef struct {
Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;


Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)
/* 三元组表示的稀疏矩阵加法: C=A+B */
{
if(A.mu!=B.mu||A.nu!=B.nu)
return ERROR;
int r,pa,pb,pc;
pa=pb=pc=1;
for (r=1;r<=A.mu&&pa<=A.tu&&pb<=B.tu;r++) { //对每一行处理
while(A.data[pa].i==r&&B.data[pb].i==r) {
if(A.data[pa].j==B.data[pb].j) {
C.data[pc].e=A.data[pa].e+B.data[pb].e;
if(C.data[pc].e) {
C.data[pc].i=r;
C.data[pc].j=A.data[pa].j;
pc++;
}
pa++;pb++;
}
if(A.data[pa].j<B.data[pb].j) {
C.data[pc].i=r;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
else {
C.data[pc].i=r;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
}
while(A.data[pa].i==r) {
C.data[pc].i=r;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
while(B.data[pb].i==r) {
C.data[pc].i=r;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
}
while(pa<=A.tu) { //处理A中剩余元素
C.data[pc].i=A.data[pa].i;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
while(pb<=B.tu) { //处理B中剩余元素
C.data[pc].i=B.data[pb].i;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
C.mu=A.mu;
C.nu=A.nu;
C.tu=pc-1;
}

程序运行错误,找不出原因,大家来看下....
...全文
154 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
simingwu 2011-06-21
  • 打赏
  • 举报
回复
好好学习
qq675927952 2011-04-16
  • 打赏
  • 举报
回复

#include "TSMatrix.h"
#include <iostream>
using namespace std;
/*输出三元组表*/
int printSMatrix(TSMatrix& M)
{
for(int i=1;i<=M.tu ;i++)
{
cout<<M.data[i].i<<" "<<M.data[i].j<<" "<<M.data[i].e<<endl;
}
cout<<endl;
return 0;
}

/*采用三元组顺序存储表示,求稀疏矩阵M的转置矩阵T,矩阵是按第一行第一列开始算的,比较慢的转置*/
int TransposeSMatrix(TSMatrix& M,TSMatrix& T)
{
T.mu = M.nu ;
T.nu = M.mu ;
T.tu = M.tu ;
if(T.tu)
{
int q =1; //转置后矩阵 每条记录 在三元组表的 位置
for(int col = 1;col<=M.nu ; ++col) //每列
{
for(int p=1 ; p<=M.tu ; ++p) //M的整个三元组表遍历
{
if(M.data[p].j==col)//M是第p个元素的列值等于col
{
T.data[q].j = M.data[p].i ;
T.data[q].i = M.data[p].j ;
T.data[q].e = M.data[p].e ;
++q;
}

}

}

}
return 0;
}

/*采用三元组顺序存储表示,求稀疏矩阵M的转置矩阵T,矩阵是按第一行第一列开始算的,快速转置*/
int FastTransposeSMatrix( TSMatrix& M,TSMatrix& T)
{
T.mu = M.nu ;
T.nu = M.mu ;
T.tu = M.tu ;
int* num = new int[M.nu+1] ; // num[col]用来表示矩阵M中第col 列中非0元的个数
int* cpos = new int [M.nu+1] ; //cpos[col]用来表示M中第col列的 第一个非0元在T的三元组表的恰当位置
if(T.tu)
{
memset(num,0, (M.nu+1)*sizeof(int) ); //初始化时每列非0元个数为0个

for(int t=1; t<=T.tu ; ++t) ++num[M.data[t].j]; //求每列非0行个数

cpos[1] = 1; //M中第一列 放的位置 在T的三元组表 应该是1

for(int col=2; col<= M.nu ;col++ ) cpos[col] = cpos[col-1] +num[col-1] ;

for(int p=1 ; p<= M.tu ;p++)
{
int col = M.data[p].j ;
int q = cpos[col] ;
T.data[q].i = M.data[p].j ;
T.data[q].j = M.data[p].i ;
T.data[q].e = M.data[p].e ;
++cpos[col] ;

}

}
delete []num ;
delete []cpos;
return 0;
}

/*稀疏矩阵乘法*/
int MultiSMatrix(TSMatrix& A,TSMatrix& B,ElemType** C)
{
// C是已经分配好空间的非压缩二维数组,行数为A.mu,列数为B.nu
// 计算 C = A*B

//算A,B的rpos向量
int* Anum = new int[A.mu+1] ; //A的每行非0元个数
int* Arpos = new int [A.mu+2] ; //A的各行第一个非0元的位置表
int* Bnum = new int [B.mu+1] ;
int* Brpos = new int [B.mu + 2] ; //B的各行第一个非0元的位置表


memset(Anum,0,sizeof(int)*(A.mu+1));
memset(Bnum,0,sizeof(int)*(B.mu+1));
for( int t=1;t<=A.tu ; ++t ) ++Anum[A.data[t].i] ;
for(int t=1 ; t<=B.tu ;++t ) ++Bnum[B.data[t].i] ;

Arpos[1] = 1;
Brpos[1] = 1;
for(int r = 2 ;r<=A.mu ;++r) Arpos[r] = Arpos[r-1] +Anum[r-1] ;
for(int r = 2 ;r<=B.mu ;++r) Brpos[r] = Brpos[r-1] +Bnum[r-1] ;

Arpos[A.mu+1]=A.tu+1; // 为了写代码的方便,Arpos[A.mu+1]当哨兵用
Brpos[B.mu+1] = B.tu+1; //
for( int i=1; i<=A.mu ; i++) //行遍历
{
for (int j=1; j<=B.nu; j++) C[i][j] = 0; //第i行清0
// 取A的第i行中的每一个非0元,与B的对应行相乘,累加到C的第i行中
for(int j=Arpos[i] ; j<Arpos[i+1] ;j++ )//j是A i行上的元素,为A中第i行 在三元组表 的位置
{
int k= A.data[j].j ; //k 为 A的三元组表中第j个元素的列下标,也就是第i行的某个元素的列下标
// 取出A的该非0元列 所对应的B的一行元素 ,即A的列必需和B的行下标相同
for (int s = Brpos[k]; s<Brpos[k+1]; s++ ) //s是B的某k行上的元素
{
int t = B.data[s].j ;
C[i][t] += A.data[j].e * B.data[s].e ;

}

}
}
delete []Anum;
delete []Bnum;
delete []Arpos;
delete []Brpos ;
return 0;
}
int main()
{
TSMatrix M ;
TSMatrix N ;

M.mu = 3 ;
M.nu = 4;
M.tu = 4;
M.data[1].i = 1;
M.data[1].j = 1;
M.data[1].e = 3;

M.data[2].i = 1;
M.data[2].j = 4;
M.data[2].e = 5;

M.data[3].i = 2;
M.data[3].j = 2;
M.data[3].e = -1;

M.data[4].i = 3;
M.data[4].j = 1;
M.data[4].e = 2;

cout<<"转置前的三元组表:"<<endl;
printSMatrix( M) ;
cout<<"比较慢的转置后的三元组表:"<<endl;
TransposeSMatrix( M,N);
printSMatrix( N) ;

cout<<endl<<"转置前的三元组表:"<<endl;
printSMatrix( M) ;
cout<<endl<<"带行向量的快速转置的三元组表:"<<endl;
FastTransposeSMatrix( M,N) ;
printSMatrix( N) ;


N.tu = 4;
N.mu = 4 ;
N.nu = 2;
N.data[1].i = 1;
N.data[1].j = 2;
N.data[1].e = 2;

N.data[2].i = 2;
N.data[2].j = 1;
N.data[2].e = 1;

N.data[3].i = 3;
N.data[3].j = 1;
N.data[3].e = -2;

N.data[4].i = 3;
N.data[4].j = 2;
N.data[4].e = 4;

cout<<"A矩阵的三元组:"<<endl;
printSMatrix( M) ;
cout<<"B矩阵的三元组:"<<endl;
printSMatrix( N) ;
cout<<"A*B后的矩阵:"<<endl;

int** C = new int* [M.mu+1] ;
for(int i=0;i<=M.mu ;i++)
C[i] = new int [N.nu+1] ;

MultiSMatrix(M, N,C);
for(int i=1;i<=M.mu ;i++)
{
for(int j=1;j<=N.nu ;j++)
cout<<C[i][j]<<" ";
cout<<endl;

}
for(int i=0;i<=M.mu ;i++)
delete C[i];
delete C;
system("pause");
return 0;
}

严老师数据结构的源代码.....
未注销 2011-04-15
  • 打赏
  • 举报
回复
#define MAXSIZE 20 // 非零元个数的最大值
typedef struct {
int i,j; // 行下标,列下标
ElemType e; // 非零元素值
}Triple;

typedef struct {
Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;


Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)
/* 三元组表示的稀疏矩阵加法: C=A+B */
{
if(A.mu!=B.mu||A.nu!=B.nu)
return ERROR;
int r,pa,pb,pc;
pa=pb=pc=1;
for (r=1;r<=A.mu&&pa<=A.tu&&pb<=B.tu;r++) { //对每一行处理
while(A.data[pa].i==r&&B.data[pb].i==r) {
if(A.data[pa].j==B.data[pb].j) {
C.data[pc].e=A.data[pa].e+B.data[pb].e;
if(C.data[pc].e) {
C.data[pc].i=r;
C.data[pc].j=A.data[pa].j;
pc++;
}
pa++;pb++;
}
if(A.data[pa].j<B.data[pb].j) {
C.data[pc].i=r;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
else {
C.data[pc].i=r;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
}
while(A.data[pa].i==r) {
C.data[pc].i=r;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
while(B.data[pb].i==r) {
C.data[pc].i=r;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
}
while(pa<=A.tu) { //处理A中剩余元素
C.data[pc].i=A.data[pa].i;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
while(pb<=B.tu) { //处理B中剩余元素
C.data[pc].i=B.data[pb].i;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
C.mu=A.mu;
C.nu=A.nu;
C.tu=pc-1;
}

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧