C语言实现稀疏矩阵相加算法

假设同阶的稀疏矩阵 A 和 B 均以三元组顺序表 TSMatrix 为存储结构,试写出矩阵相加的算法 BOOL TSMatrixAdd(TSMatrix A, TSMatrix B, TSMatrix&C),结果放在三元组顺序表 C 中。

首先判断两个矩阵是否同阶,如果不同阶则不能相加,返回 false。然后按照行列号从小到大的顺序遍历 A、B 两个矩阵中的非零元素,分别将它们相加得到 C 矩阵中的对应元素,最后返回 true

具体实现如下:

typedef struct {
    int i, j; // 非零元素的行列下标
    int e; // 非零元素的值
} Triple;

typedef struct {
    Triple *data; // 三元组表
    int m, n, len; // 矩阵的行数、列数和非零元素个数
} TSMatrix;

// 矩阵相加
BOOL TSMatrixAdd(TSMatrix A, TSMatrix B, TSMatrix &C) {
    if (A.m != B.m || A.n != B.n) { // 判断是否同阶
        return false;
    }
    int pa = 0, pb = 0, pc = 0;
    C.m = A.m;
    C.n = A.n;
    C.len = 0;
    C.data = (Triple *) malloc(sizeof(Triple) * (A.len + B.len)); // 分配存储空间
    while (pa < A.len && pb < B.len) { // 按照行列号从小到大的顺序遍历A、B矩阵
        if (A.data[pa].i < B.data[pb].i || (A.data[pa].i == B.data[pb].i && A.data[pa].j < B.data[pb].j)) { // A矩阵中当前元素更小
            C.data[pc++] = A.data[pa++]; // 将A矩阵中当前元素加入C矩阵
        } else if (A.data[pa].i > B.data[pb].i || (A.data[pa].i == B.data[pb].i && A.data[pa].j > B.data[pb].j)) { // B矩阵中当前元素更小
            C.data[pc++] = B.data[pb++]; // 将B矩阵中当前元素加入C矩阵
        } else { // A、B矩阵中当前元素相等
            int sum = A.data[pa].e + B.data[pb].e;
            if (sum != 0) { // 如果和不为0,则将它加入C矩阵
                Triple t = {A.data[pa].i, A.data[pa].j, sum};
                C.data[pc++] = t;
            }
            pa++;
            pb++;
        }
    }
    while (pa < A.len) { // 将A矩阵中剩余的元素加入C矩阵
        C.data[pc++] = A.data[pa++];
    }
    while (pb < B.len) { // 将B矩阵中剩余的元素加入C矩阵
        C.data[pc++] = B.data[pb++];
    }
    C.len = pc; // 更新C矩阵中的非零元素个数
    return true;
}

代码说明:

  1. TSMatrix 结构体定义了稀疏矩阵的三元组顺序表存储结构,包含 data 指针指向三元组表、mn 表示矩阵的行数和列数、len 表示非零元素个数。
  2. TSMatrixAdd 函数实现稀疏矩阵相加功能。
  3. 首先判断两个矩阵是否同阶,如果不同阶则返回 false
  4. 使用两个指针 papb 分别指向 A 和 B 矩阵的第一个非零元素,使用 pc 指针指向 C 矩阵的第一个非零元素。
  5. 循环遍历 A 和 B 矩阵中的非零元素,按照行列号从小到大的顺序比较两个矩阵中当前元素的大小,将较小的元素加入 C 矩阵。
  6. 如果两个矩阵中当前元素相等,则将它们的元素值相加,如果和不为零,则将和加入 C 矩阵。
  7. 最后将 A 和 B 矩阵中剩余的元素加入 C 矩阵,更新 C 矩阵的非零元素个数,返回 true
C语言实现稀疏矩阵相加算法

原文地址: http://www.cveoy.top/t/topic/nIKp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录