以三元组顺序表表示和实现稀疏矩阵,实现矩阵的转置,以行逻辑链接存储方式表示稀疏矩阵,实现矩阵相乘
时间: 2024-03-12 22:48:33 浏览: 102
稀疏矩阵(采用三元组表顺序存储)
1. 三元组顺序表表示稀疏矩阵
稀疏矩阵是指矩阵中大部分元素为0的矩阵。为了节省存储空间,可以使用三元组顺序表来表示稀疏矩阵。三元组顺序表包含三个元素:行号、列号和元素值。一个稀疏矩阵可以用一个三元组顺序表来表示。
示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 稀疏矩阵最大元素个数
typedef struct {
int row; // 行号
int col; // 列号
int val; // 元素值
} Triple; // 三元组
typedef struct {
Triple data[MAX_SIZE + 1]; // 存储三元组的数组
int row, col, num; // 稀疏矩阵的行数、列数和非零元素个数
} TSMatrix; // 三元组顺序表表示的稀疏矩阵
void CreateMatrix(TSMatrix *M, int row, int col) {
M->row = row;
M->col = col;
M->num = 0;
printf("请输入稀疏矩阵的元素:\n");
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= col; j++) {
int val;
scanf("%d", &val);
if (val != 0) {
M->num++;
M->data[M->num].row = i;
M->data[M->num].col = j;
M->data[M->num].val = val;
}
}
}
}
void PrintMatrix(TSMatrix M) {
printf("稀疏矩阵的三元组表示为:\n");
for (int i = 1; i <= M.num; i++) {
printf("(%d, %d, %d)\n", M.data[i].row, M.data[i].col, M.data[i].val);
}
}
int main() {
TSMatrix M;
int row, col;
printf("请输入稀疏矩阵的行数和列数:");
scanf("%d %d", &row, &col);
CreateMatrix(&M, row, col);
PrintMatrix(M);
return 0;
}
```
2. 矩阵转置
矩阵的转置是指将矩阵的行和列互换得到的新矩阵。对于稀疏矩阵,我们可以通过交换每个非零元素的行号和列号来实现转置。
示例代码:
```c
void TransposeMatrix(TSMatrix M, TSMatrix *T) {
T->row = M.col;
T->col = M.row;
T->num = M.num;
if (T->num == 0) {
return;
}
int q = 1;
for (int col = 1; col <= M.col; col++) {
for (int p = 1; p <= M.num; p++) {
if (M.data[p].col == col) {
T->data[q].row = M.data[p].col;
T->data[q].col = M.data[p].row;
T->data[q].val = M.data[p].val;
q++;
}
}
}
}
```
3. 行逻辑链接存储方式表示稀疏矩阵
行逻辑链接存储方式是指用两个一维数组来表示稀疏矩阵。第一个数组存储每一行的非零元素个数和第一个非零元素的位置,第二个数组存储每一个非零元素的列号和元素值。
示例代码:
```c
#define MAX_COL 50 // 稀疏矩阵最大列数
typedef struct {
int col; // 列号
int val; // 元素值
} Node; // 链表结点
typedef struct {
Node data[MAX_COL + 1];
int num; // 非零元素个数
} Row; // 链表行
typedef struct {
Row row[MAX_SIZE + 1]; // 存储每一行的链表
int row_num, col_num; // 稀疏矩阵的行数和列数
int row_pos[MAX_SIZE + 1]; // 存储每一行的第一个非零元素在 data 数组中的位置
} RLSMatrix; // 行逻辑链接存储方式表示的稀疏矩阵
void CreateMatrix(RLSMatrix *M, int row, int col) {
M->row_num = row;
M->col_num = col;
printf("请输入稀疏矩阵的元素:\n");
for (int i = 1; i <= row; i++) {
M->row_pos[i] = 0;
int num = 0;
for (int j = 1; j <= col; j++) {
int val;
scanf("%d", &val);
if (val != 0) {
num++;
M->row[i].data[num].col = j;
M->row[i].data[num].val = val;
}
}
M->row[i].num = num;
}
for (int i = 2; i <= row; i++) {
M->row_pos[i] = M->row_pos[i - 1] + M->row[i - 1].num;
}
}
void PrintMatrix(RLSMatrix M) {
printf("稀疏矩阵的行逻辑链接存储方式表示为:\n");
for (int i = 1; i <= M.row_num; i++) {
printf("%d ", M.row[i].num);
for (int j = 1; j <= M.row[i].num; j++) {
printf("(%d, %d) ", M.row[i].data[j].col, M.row[i].data[j].val);
}
printf("\n");
}
}
int main() {
RLSMatrix M;
int row, col;
printf("请输入稀疏矩阵的行数和列数:");
scanf("%d %d", &row, &col);
CreateMatrix(&M, row, col);
PrintMatrix(M);
return 0;
}
```
4. 矩阵相乘
矩阵相乘是指将两个矩阵相乘得到的新矩阵。对于稀疏矩阵,我们可以先将其转换为行逻辑链接存储方式,然后使用一些简单的算法来实现矩阵相乘。
示例代码:
```c
void MatrixMultiply(RLSMatrix A, RLSMatrix B, RLSMatrix *C) {
if (A.col_num != B.row_num) {
printf("矩阵不满足相乘条件!\n");
return;
}
for (int i = 1; i <= A.row_num; i++) {
for (int j = 1; j <= B.col_num; j++) {
int sum = 0;
for (int k = 1; k <= A.row[i].num; k++) {
int col = A.row[i].data[k].col;
int val1 = A.row[i].data[k].val;
for (int p = 1; p <= B.row[col].num; p++) {
if (B.row[col].data[p].col == j) {
int val2 = B.row[col].data[p].val;
sum += val1 * val2;
break;
}
}
}
if (sum != 0) {
C->row[i].data[++C->row[i].num].col = j;
C->row[i].data[C->row[i].num].val = sum;
}
}
if (C->row[i].num != 0) {
C->row_pos[i] = C->row_pos[i - 1] + C->row[i - 1].num;
}
}
C->row_num = A.row_num;
C->col_num = B.col_num;
}
```
以上是稀疏矩阵的表示和操作的简单介绍,实际上这些操作还有很多细节需要注意。如果想更深入地了解稀疏矩阵的表示和操作,可以参考相关的教材和论文。
阅读全文