实现矩阵的转置:
1.将矩阵的行列值相互转换。
2.将每个三元组中的i和j交换。
3.重排三元组之间的次序便可实现矩阵的转置。
void TransposeSMatrix(TSMatrix M, TSMatrix &T)
{
// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
int p, q, col;
T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
if (T.tu)
{
q = 1;
for (col = 1; col <= M.nu; ++col)
for (p = 1; p <= M.tu; ++p)
if (M.data[p].j == 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;
++q;
}
}
return;
} // TransposeSMatrix
快速转置的原理是:如果能预先确定矩阵M中每一列(即T中每一行)的第一个非零元在b.data中(上面那图是b.data)恰当位置。那么在对a.data中的三元组一次做转置时,便可直接放到b.data中恰当的位置上去。
设两个向量:num和cpot
num[col]表示矩阵M中第col列中的非零元素个数。
cpot[col]指M中第col列的第一个非零元在b.data中的恰当位置。
有下面两个公式:
cpot[0]=0;
扫描二维码关注公众号,回复:
1794129 查看本文章
cpot[col]=copt[col-1]+num[col-1] 1<=col<a.nu
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1250
#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
typedef int ElemType;
typedef struct{
int i, j; //该非零元的行下标和列下标
ElemType e; //非零元对应的值
}Triple;
typedef struct{
Triple data[MAXSIZE]; //非零元三元组表
int mu, nu, tu; //矩阵的行数,列数,非零元个数
}TSMatrix;
void FastTransposeSMatrix(TSMatrix M, TSMatrix &T) //快速转置
{ //采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
T.mu = M.nu;
T.nu = M.mu;
T.tu = M.tu;
if(T.tu)
{
int col;
int num[100], cpot[100];
for (col = 0; col < M.nu; col++)
num[col] = 0; //num数组的初始化
for (int t = 0; t < M.tu; t++)
++num[M.data[t].j]; //求M中每一列含有的非零元个数
cpot[0] = 0;
for (col = 1; col < M.nu; col++)
cpot[col] = cpot[col - 1] + num[col - 1]; //求cpot向量
int q;
for (int p = 0; p < M.tu; p++)
{
col = M.data[p].j;
q = cpot[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;
++cpot[col];
}//for
}//if
return;
}//FastTransposeSMatrix
int main()
{
TSMatrix M;
TSMatrix T;
scanf("%d %d", &M.mu, &M.nu);
int x,y,z;
M.tu=0;
for (int i = 0; ; i++)
{
scanf("%d%d%d", &x, &y, &z);
if(x==0&&y==0&&z==0)break;
M.data[i].i=x;M.data[i].j=y;M.data[i].e=z;
M.tu++;
}
FastTransposeSMatrix(M, T);
for (int t = 0; t < T.tu; t++)
printf("%d %d %d\n", T.data[t].i, T.data[t].j, T.data[t].e);
return 0;
}
执行++cpot[col]之后从每一列的第一个元素移到了第二个元素。