求助——稀疏矩阵运算器,谢谢
//稀疏矩阵
#include <iostream>
#include <iomanip>
using namespace std;
const int MAXSIZE = 1000;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef int ElemType;
typedef struct{
int row,col;
ElemType e;
}Triple;
typedef struct{
Triple data[MAXSIZE + 1];
int mu,nu,tu;
}TSMatrix;
Status CreateSMatrix(TSMatrix &M)
{//创建稀疏矩阵
cout << "请输入稀疏矩阵的行,列及非零元素的个数:" << endl;
cin >> M.mu >> M.nu >> M.tu;
if(M.tu > MAXSIZE)
{
cout << "错误,请重新输入:" << endl;
exit(1);
}
cout << "输入非零元素的行,列及值:" << endl;
for(int i = 1; i <= M.tu; i++)
cin >> M.data[i].row >> M.data[i].col >> M.data[i].e;
return OK;
}//CreateSMatrix
void DisplaySMatrix(TSMatrix M)
{//以三元组形式输出稀疏矩阵
for(int i = 1; i <= M.tu; i++)
{
cout << "M[" << M.data[i].row << "][" << M.data[i].col << "]=" << M.data[i].e << setw(5);
}
cout << endl;
}
void OutPutSMatrix(TSMatrix M)
{//输出矩阵,按标准格式输出
int m,n,k = 1;
for(m = 0; m < M.mu; m++)
{
for(n = 0; n < M.nu; n++)
{
if((M.data[k].row - 1) == m && (M.data[k].col - 1) == n)
{
cout << setw(4);
cout << M.data[k++].e;
}
else
{
cout << setw(4);
cout << "0";
}
}
cout<<endl;
}
}//OutPutSMatrix
void FastTransposeSMatrix(TSMatrix M)
{
TSMatrix T; //定义预转置的矩阵
T.tu=M.tu; T.mu=M.nu; T.nu=M.mu;
int * num = new int[M.nu];//分别记录矩阵M中第col列中非零元素的个数
int * cpot = new int[M.nu]; //M中第col列首个非零元在b.data中的位置
if(T.tu)
{
int i,j,t,p,q;
for(i = 0; i < M.nu; i++)
num[i] = 0;
for(t=1;t<=M.tu;t++)
++num[M.data[t].col];
cpot[1]=1;
for(i=2;i<=M.nu;i++)
cpot[i]=cpot[i-1]+num[i-1]; // 求出每一列中非零元素在三元组中出现的位置
for(p=1;p<=M.tu;p++)
{
j=M.data[p].col; q=cpot[j];
T.data[q].row=j; T.data[q].col=M.data[p].row;
T.data[q].e=M.data[p].e; ++cpot[j];
}
}
cout<<"输入矩阵的转置矩阵为"<<endl;
OutPutSMatrix(T);
}//FastTransposeSMatrix
TSMatrix Add(TSMatrix A,TSMatrix B)
{//三元组表示的稀疏矩阵加法
TSMatrix C;
C.mu = A.mu;C.nu = A.nu;C.tu = 0;
int pa = 1,pb = 1,pc = 1;
ElemType ce;
for(int x = 1; x <= A.mu; x++) //对矩阵的每一行进行加法
{
while(A.data[pa].row < x) pa++;
while(B.data[pb].row < x) pb++;
while(A.data[pa].row == x && B.data[pb].row == x)//行列值都相等的元素
{
if(A.data[pa].col == B.data[pb].col)
{
ce = A.data[pa].e + B.data[pb].e;
if(ce)
{
C.data[pc].row = x;
C.data[pc].col = A.data[pb].col;
C.data[pc].e = ce;
pa++;pb++;pc++;
}
}
else if(A.data[pa].col > B.data[pb].col)
{
C.data[pc].row = x;
C.data[pc].col = B.data[pb].col;
C.data[pc].e = B.data[pb].e;
pb++;pc++;
}
else
{
C.data[pc].row = x;
C.data[pc].col = A.data[pa].col;
C.data[pc].e = A.data[pa].e;
pa++;pc++;
}
}//while
while(A.data[pa].row == x) //插入A中剩余的元素(第x行)
{
C.data[pc].row = x;
C.data[pc].col = A.data[pa].col;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
while(B.data[pb].row == x) //插入B中剩余的元素(第x行)
{
C.data[pc].row = x;
C.data[pc].col = B.data[pb].col;
C.data[pc].e = B.data[pb].e;
pb++;pc++;
}
}//for
C.tu = pc;
return C;
}//TSMatrix_Add
TSMatrix Multiply(TSMatrix a,TSMatrix b)
{//稀疏矩阵的乘法 a*b
TSMatrix result;//存放运算结果的三元组
if(a.nu != b.mu)
{
cout << "两个矩阵的规格不同!" << endl;
return result;
}
int * rowSize = new int[b.mu]; //矩阵b各行非零元的个数
int * rowStart = new int[b.mu + 1]; //矩阵b各行在三元组开始的地方
ElemType * temp = new ElemType[b.nu]; //暂存每一行的计算结果
int i,Current,lastInResult,RowA,ColA,ColB;
for(i = 0; i < b.mu; i++) rowSize[i] = 0;
for(i = 0; i < b.tu; i++) rowSize[b.data[i].row]++;
rowStart[0] = 0;
for(i = 1; i <= b.mu; i++)
rowStart[i] = rowStart[i - 1] + rowSize[i - 1]; //计算b第i行非零元的起始位置
Current = 0;lastInResult = -1; //a扫描指针及result存指针
while(Current < a.tu) //生成result的当前行temp
{
RowA = a.data[Current].col;
for(i = 0; i < b.nu; i++) temp[i] = 0;
while(Current < a.tu && a.data[Current].row == RowA)
{
ColA = a.data[Current].col; //扫描到当前元素的列号
for(i = rowStart[ColA]; i < rowStart[ColA + 1]; i++)
{
ColB = b.data[i].col;
temp[ColB] += a.data[Current].e * b.data[i].e;
}
Current++;
}
for(i = 0; i < b.nu; i++)
if(temp[i] != 0) //将temp中的非零元压缩到result中去
{
lastInResult++;
result.data[lastInResult].row = RowA;
result.data[lastInResult].col = i;
result.data[lastInResult].e = temp[i];
}
}
result.mu = a.mu;result.nu = b.nu;
result.tu = lastInResult + 1;
delete[] rowSize;delete[] rowStart;delete[] temp;
return result;
}//Multiply
int main()
{
TSMatrix M;
CreateSMatrix(M);
DisplaySMatrix(M);
OutPutSMatrix(M);
FastTransposeSMatrix(M);
TSMatrix a;
CreateSMatrix(a);
OutPutSMatrix(a);
TSMatrix b;
CreateSMatrix(b);
OutPutSMatrix(b);
cout << "矩阵a+b=" << endl;
TSMatrix c;
c = Add(a,b);
OutPutSMatrix(c);
cout << "矩阵a*b=" << endl;
d = Multiply(a,b);
OutPutSMatrix(d);
return 0;
}
用三元组实现的稀疏矩阵,各位帮帮忙,加法和乘法结果都有错误……,查不出错误
谢谢!