C语言实现稀疏矩阵相加算法
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;
}
代码说明:
TSMatrix结构体定义了稀疏矩阵的三元组顺序表存储结构,包含data指针指向三元组表、m和n表示矩阵的行数和列数、len表示非零元素个数。TSMatrixAdd函数实现稀疏矩阵相加功能。- 首先判断两个矩阵是否同阶,如果不同阶则返回
false。 - 使用两个指针
pa和pb分别指向 A 和 B 矩阵的第一个非零元素,使用pc指针指向 C 矩阵的第一个非零元素。 - 循环遍历 A 和 B 矩阵中的非零元素,按照行列号从小到大的顺序比较两个矩阵中当前元素的大小,将较小的元素加入 C 矩阵。
- 如果两个矩阵中当前元素相等,则将它们的元素值相加,如果和不为零,则将和加入 C 矩阵。
- 最后将 A 和 B 矩阵中剩余的元素加入 C 矩阵,更新 C 矩阵的非零元素个数,返回
true。
原文地址: http://www.cveoy.top/t/topic/nIKp 著作权归作者所有。请勿转载和采集!