矩阵快速转置算法 当稀疏矩阵以三元组形式存储在计算机中时,转置会破坏掉原有矩阵的顺序性,比如原来矩阵的存储中,依次是:第一行第一个非零元素、第一行第二个非零元素~~~但是简单的交换行和列会破坏掉这些结构。矩阵的快速转置算法可以解决上述问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXSIZE 100 typedef struct { int i, j; float e; }Triple; typedef struct { Triple data[MAXSIZE + 1 ]; int rowNum, colNum, allNum; }TSMatrix; TSMatrix* FastTransposeSMatrix (TSMatrix M, TSMatrix *T) { int num[MAXSIZE] = {0 }; int cpot[MAXSIZE]; for (int i = 1 ; i <= M.allNum; i++) { num[M.data[i].j]++; } cpot[1 ] = 1 ; for (int i = 2 ; i <= M.colNum; i++) { cpot[i] = num[i - 1 ] + cpot[i - 1 ]; } T->rowNum = M.colNum; T->colNum = M.rowNum; T->allNum = M.allNum; for (int elem = 1 ; elem <= M.allNum; elem++) { int col = M.data[elem].j; int row = M.data[elem].i; T->data[cpot[col]].e = M.data[elem].e; T->data[cpot[col]].i = col; T->data[cpot[col]].j = row; cpot[col]++; } return T; } void PrintMatrix (TSMatrix M) { printf ("行数: %d, 列数: %d, 非零元素个数: %d\n" , M.rowNum, M.colNum, M.allNum); for (int i = 1 ; i <= M.allNum; i++) { printf ("(%d, %d) : %.2f\n" , M.data[i].i, M.data[i].j, M.data[i].e); } } int Exists (TSMatrix M, int row, int col) { for (int i = 1 ; i <= M.allNum; i++) { if (M.data[i].i == row && M.data[i].j == col) { return 1 ; } } return 0 ; } int main () { srand (time (NULL )); TSMatrix M; M.rowNum = 5 ; M.colNum = 5 ; M.allNum = 0 ; for (int i = 1 ; i <= 10 ; i++) { int row, col; do { row = rand () % M.rowNum + 1 ; col = rand () % M.colNum + 1 ; } while (Exists (M, row, col)); float value = (float )(rand () % 100 ) / 10 ; M.allNum++; M.data[M.allNum].i = row; M.data[M.allNum].j = col; M.data[M.allNum].e = value; } printf ("原始矩阵:\n" ); PrintMatrix (M); TSMatrix T; FastTransposeSMatrix (M, &T); printf ("\n转置后的矩阵:\n" ); PrintMatrix (T); return 0 ; }