稀疏矩阵转置中的快速转置就是记录目标矩阵每一行的开始位置,在对原始矩阵的每个元素进行转置时,只需根据元素的所在列和目标矩阵对应行的开始位置,就可确定目标元素的位置,进而进行原始元素和目标元素相应值得交换,具体c语言代码如下:
#include<iostream>
#define MAXSIZE 12500
typedef struct {
int i, j;
int e;
}Triple;//三维元素
typedef struct{
Triple data[MAXSIZE + 1];
int mu, nu, tu; //行、列、总数
}TSMatrix;//稀疏矩阵
//快速转置
int FastTransposeSMatrix(TSMatrix M, TSMatrix &T){
//求稀疏矩阵M的转置矩阵T
T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
//初始化M各列非零元素数目num,T矩阵各行开始位置cpot
int num[10] = { 0 }, cpot[10] = { 0 };
if (T.tu){
for (int col = 1; col <= M.mu; col++) num[col] = 0;
for (int t = 1; t <= M.nu; t++) ++num[M.data[t].j]; //求M各列非零元素数目num
cpot[1] = 1; //T矩阵第一行开始位置为1
//T矩阵各行开始位置等于上行开始位置加上上行非零元素数目;T矩阵的col行非零元素数目等于M矩 //阵col列非零元素数目
for (int col = 2; col <= T.nu; col++) cpot[col] = cpot[col - 1] + num[col - 1];
for (int p = 1; p < M.tu; p++){
int col = M.data[p].j; //将M矩阵元素的列转换为T矩阵的行
int q = cpot[col]; //定位T矩阵第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]++; //T矩阵第col行未赋值元素的开始位置前移
}//for
}//if
return 1;
}