Files
Data_Structure/OrigFiles/4_数组和矩阵/MatrixTrans/MatrixTrans.cpp

130 lines
3.1 KiB
C++

#include<iostream>//cout,cin
using namespace std;
struct MNode //三元组结点
{
int i,j; //行号,列号
int e; //非零元
};
struct TSMatrix
{
int mu,nu,tu; // 行数、列数、非零元个数
MNode *data; // 三元组表
};
TSMatrix MCreate(int d[][3],int m,int n,int k) //由三元组的二维数组生成行向量稀疏存储矩阵
{
TSMatrix M={m,n,k,NULL};
if(k!=0)
M.data=new MNode[k];
for(int i=0;i<k;i++)
{
M.data [i].i=d[i][0];
M.data [i].j=d[i][1];
M.data [i].e=d[i][2];
}
return M;
}//
void MDisp(TSMatrix a) //矩阵显示
{
MNode p;
int i,j,k=0,c=0;
p=a.data[k];
for(i=0;i<a.mu;i++)
{
for(j=0;j<a.nu;j++)
{
if(k<a.tu && p.i ==i && p.j ==j)
{
cout<<'\t'<<p.e;
k++;
if(k<a.tu ) p=a.data[k];
}
else
{
cout<<'\t'<<c;
}
}//for
cout<<endl;
cout<<endl;
}//for
}//MatrixDisp
//算法4.1 转置算法一
void MatrixTrans_1(TSMatrix A,TSMatrix &B)
{//
int col,p,q;
B.mu=A.nu;B.nu=A.mu;B.tu=A.tu; //B的行数、列数、非零元个数分别等于A的列数、行数和非零元个数
if(B.tu) // 矩阵B有非零元
{
q=0;
for(col=0;col<A.nu;++col) // 按列扫描A矩阵
for(p=0;p<A.tu;++p)
if(A.data[p].j==col) // col列有非零元
{
B.data[q].i=A.data[p].j; // 交换行、列号,生成转置元素
B.data[q].j=A.data[p].i;
B.data[q].e=A.data[p].e;
++q;
}
}
}
//算法4.2 快速转置
void MatrixTrans_2(TSMatrix A,TSMatrix &B)
{
int col,i,k,q;
int *num,*cpot;
B.mu=A.nu;B.nu=A.mu;B.tu=A.tu; //B的行数、列数、非零元个数分别等于A的列数、行数和非零元个数
num= new int[B.nu];
cpot=new int [B.nu];
if(B.tu) // 非零元个数不为零,实施转置
{
for(col=0;col<A.nu ;col++) //A中每一列非零元个数初始化为0
num[col]=0;
for(i=0;i<A.tu;i++) //求矩阵A中每一列非零元个数
num[A.data [i].j]++;
cpot[0]=0; //A中第0列首个非零元在B中的下标
for(col=1;col<=A.nu ;++col) // 求A中每一列首个非零元在B中的下标
cpot[col]=cpot[col-1]+num[col-1];
for(k=0;k<A.tu;++k) //扫描A的三元组表
{
col=A.data [k].j ; //当前三元组列号
q=cpot[col]; //当前三元组在B中的下标
B.data[q].i=A.data[k].j;
B.data [q].j =A.data [k].i;
B.data [q].e =A.data [k].e;
cpot[col]++; // 预置同一列下一个三元组在B中的下标
}//for
}//if
}//
void main()
{
TSMatrix ma,mb1,mb2;
int m1=4,n1=6,k1=6; //被乘矩阵行数,列数,非零元个数
int da[6][3]={{0,2,11},{0,4,12},{1,3,22},
{2,1,31}, {2,3,32},{3,0,41}}; //ma阵的非零元
ma=MCreate(da,m1,n1,k1); //生成三元组顺序存储的ma阵
cout<<"ma="<<endl;
MDisp(ma); //显示ma阵
mb1.data=new MNode[ma.tu];
mb2.data=new MNode[ma.tu];
cout<<"方法一:直接取,顺序存"<<endl; //用方法一转置矩阵
MatrixTrans_1(ma,mb1);
cout<<"mb="<<endl; //显示转置矩阵
MDisp(mb1);
cout<<"方法二:顺序取,直接存"<<endl; //用方法二转置矩阵
MatrixTrans_2(ma,mb2);
cout<<"mb="<<endl; //显示转置矩阵
MDisp(mb2);
}//