跳转至

稀疏矩阵的转置

下面程序实现稀疏矩阵的转置运算,假设稀疏矩阵A采用三元组表示。 编写一个函数计算其转置矩阵B,要求B也用三元组表示。

(不会做的时候就画图看看)

C
 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
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 12500  //假设非零元个数的最大值为12500

typedef int ElemType;

typedef struct {
    int row, col;      /* 元素所在的行、列号 */
    ElemType e;        /* 非零数据元素 */
} Triple;

typedef struct {
    Triple data[MAXSIZE + 1];  /* 使用数组存储每一个非零元的三元组 */
    int mu, nu, tu;            /* nu, mu 为矩阵的行、列数,tu 为非零元的个数 */
} TSMatrix;

void TransposeMatrix(TSMatrix A, TSMatrix* B)
/* A 是稀疏矩阵的三元组形式,B 是存放 A 的转置矩阵的三元组数组 */
{
    int i, j, k;
    B->mu = A.nu; // 将矩阵 A 的行数赋值给矩阵 B 的列数
    B->nu = A.mu; // 将矩阵 A 的列数赋值给矩阵 B 的行数
    B->tu = A.tu; // 将矩阵 A 的非零元素个数赋值给矩阵 B 的非零元素个数

    if (B->tu > 0) { // 首先检查矩阵 B 的非零元素个数是否大于零
        j = 1; 
        // 在转置操作中,首先用变量 j 初始化为1,表示目前存储到矩阵 B 的第一个非零元素。
        // 然后,通过 for 循环遍历矩阵 B 的每一列(k 表示当前列的索引)。

        for (k = 1; k <= A.nu; k++) {  // 对于 A 中的每一列
            for (i = 1; i <= A.tu; i++) {  // 在 A 中找到对应列的非零元素
                // 在每一列的循环内部,通过嵌套的 for 循环遍历矩阵 A 中的非零元素。
                // 检查矩阵 A 中当前元素的列号是否等于当前列索引 k。
                if (A.data[i].col == k) {  // 如果该非零元素的列号与当前列相同,说明该非零元素需要被转置到矩阵 B 中的当前列。
                    // 将该非零元素的行号赋值给矩阵 B 中的当前元素的行号
                    // 将该非零元素的值赋值给矩阵 B 中的当前元素的值
                    B->data[j].row = A.data[i].col;
                    B->data[j].col = A.data[i].row;
                    B->data[j].e = A.data[i].e;
                    j++;  // 将非零元素存入 B,并增加 B 中非零元素的计数
                    // 并将索引 j 增加1,指向下一个要存储的非零元素
                }
            }
        }
    }
}


int main() {
    TSMatrix A, B;

    // 初始化稀疏矩阵 A
    A.mu = 3;  // 行数
    A.nu = 4;  // 列数
    A.tu = 4;  // 非零元个数
    A.data[1].row = 1; A.data[1].col = 1; A.data[1].e = 3;
    A.data[2].row = 2; A.data[2].col = 2; A.data[2].e = 7;
    A.data[3].row = 2; A.data[3].col = 4; A.data[3].e = 9;
    A.data[4].row = 3; A.data[4].col = 4; A.data[4].e = 5;

    // 转置矩阵 A,并将结果存储在矩阵 B 中
    TransposeMatrix(A, &B);

    // 输出转置后的矩阵 B
    printf("转置后的矩阵 B:\n");
    for (int i = 1; i <= B.tu; i++) {
        printf("(%d, %d, %d) \n", B.data[i].row, B.data[i].col, B.data[i].e);
    }
    printf("\n");

    return 0;
}