稀疏矩阵的转置(矩阵转置和快速转置)

实现矩阵的转置:

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;

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]之后从每一列的第一个元素移到了第二个元素。

猜你喜欢

转载自blog.csdn.net/zhao2018/article/details/80690811
今日推荐