矩阵转置的两种算法

#include <cstdio>
#include <cstdlib>
//#define _OJ_
typedef struct Triple1
{
    int i1;
    int j1;
    int data;            //用三元组表来存储稀疏矩阵
} Triple1, *Triple;

typedef struct Matrix1
{
    Triple1 elem[100];
    int row;
    int colum;
    int cnt;            //压缩矩阵行数列数及非零数的个数
} Matrix1, *Matrix;

void
TansposeMatrix(Matrix M, Matrix T)
{
    int i, j, q;
    T->cnt = M->cnt;  T->row = M->colum;  T->colum = M->row;

    if(M->cnt > 0) {
     q = 1;
     for(i = 1;i <= T->row; i++) {      //0号位不用T中的行从小到大去寻找M中的列配对
        for(j = 1;j <= T->cnt; j++) {   //和elem中的数每一个j1配对
              if(i == M->elem[j].j1) {
             T->elem[q].i1   = M->elem[j].j1;
             T->elem[q].data = M->elem[j].data;
             T->elem[q].j1 = M->elem[j].i1;               q++;
             }
         }
      }
   }

}
// 当非零个数和row * colum 相同时候 复杂度为row * colum  * colum;仅仅适于cnt<<row * colum时

void
transposematrix1(Matrix M, Matrix T)
{
    int i, j, col, p;
    int num[100], cpot[100];
    T->row = M->colum;    T->colum = M->row;  T->cnt = M->cnt;

    if(T->cnt > 0) {               
     for(i = 1;i <= M->colum; i++)
     num[i] = 0;
     for(i = 1;i <= M->cnt; i++)
     ++num[M->elem[i].j1];      //计算M中每一列的非零元素个数

     cpot[0] = 1;
     for(j = 1;j <= M->colum; j++)
     cpot[j] = cpot[j - 1] + num[j - 1];   //计算每一列的第一个非零元素在elem的下标

     for(i = 1;i <= M->cnt; i++) {
     col = M->elem[i].j1;    p = cpot[col];
     T->elem[p].i1 = M->elem[i].j1;
     T->elem[p].j1 = M->elem[i].i1;
     T->elem[p].data = M->elem[i].data;    ++cpot[col];
     //计算完第一个后下标加一以便第n个非零元素计算
      }
   }

}
//复杂度为cnt + colum 当cnt = row * colum 和经典算法一样为row * colum;


int main(int argc, char const *argv[]) {
#ifndef _OJ_  //ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);
#endif

    int i;
    Matrix M, T;
    M = (Matrix) malloc (sizeof(Matrix1));
    T = (Matrix) malloc (sizeof(Matrix1));
    scanf("%d %d %d", &M->row, &M->colum, &M->cnt);

    printf("原矩阵如下:
");
    for(i = 1;i <= M->cnt; i++) {
    scanf("%d  %d  %d", &M->elem[i].i1,  &M->elem[i].j1, &M->elem[i].data);
    printf("%d %d %d
", M->elem[i].i1, M->elem[i].j1, M->elem[i].data);
    }

    TansposeMatrix(M, T);
    printf("稀疏矩阵的转置算法一如下所示:
");
    for(i = 1;i <= T->cnt; i++)
    printf("%d %d %d
", T->elem[i].i1, T->elem[i].j1, T->elem[i].data);

    transposematrix1(M, T);
    printf("稀疏矩阵的转置算法二如下所示:
");
    for(i = 1;i <= T->cnt; i++)
    printf("%d %d %d
", T->elem[i].i1, T->elem[i].j1, T->elem[i].data);

    return 0;
}
  

  

原文地址:https://www.cnblogs.com/airfand/p/5021679.html