📜  C ++程序将矩阵转换为稀疏矩阵(1)

📅  最后修改于: 2023-12-03 15:13:45.799000             🧑  作者: Mango

将矩阵转换为稀疏矩阵

稀疏矩阵是一种只包含极少数非零元素的矩阵,通常应用于占用存储空间较大的情况下。在C++中,我们可以使用链表等数据结构来实现矩阵到稀疏矩阵的转换。

实现思路

我们可以使用三个数组来存储矩阵的非零元素的行、列和值,这样每个非零元素都可以以一个三元组的形式进行表示。对于稀疏矩阵的每一行,我们也可以用一个链表来存储该行的非零元素。

具体实现如下:

  1. 对于给定的矩阵,遍历其中的每一个元素;
  2. 如果该元素为0,则跳过;
  3. 否则,将该元素的行、列、值分别存储到三个数组中;
  4. 对于每一行,将其对应的非零元素存储到一个链表中;
  5. 最后,将这些数组和链表组合起来即可得到稀疏矩阵。
代码实现
#include <iostream>
#include <vector>

using namespace std;

vector<int> row, col, val;  // 存储非零元素的行、列、值
vector<vector<int>> sparse;  // 存储转换后的稀疏矩阵

void create_sparse_matrix(vector<vector<int>> matrix) {
    int n = matrix.size();  // 矩阵的行数
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < matrix[i].size(); j++) {
            if (matrix[i][j] != 0) {
                row.push_back(i);
                col.push_back(j);
                val.push_back(matrix[i][j]);
            }
        }
    }
    int len = row.size();
    for (int i = 0; i < n; i++) {
        vector<int> tmp(len, 0);
        for (int j = 0; j < len; j++) {
            if (row[j] == i) {
                tmp[col[j]] = val[j];
            }
        }
        sparse.push_back(tmp);
    }
}

int main() {
    vector<vector<int>> matrix{{1, 0, 0},
                               {0, 0, 2},
                               {3, 0, 0}};
    create_sparse_matrix(matrix);
    for (int i = 0; i < sparse.size(); i++) {
        for (int j = 0; j < sparse[i].size(); j++) {
            cout << sparse[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
代码解析

上述代码中,我们使用了一个create_sparse_matrix()函数来将给定的矩阵转换为稀疏矩阵。该函数首先遍历矩阵的每一个元素,如果该元素不为0,则将其行、列、值分别存储到三个数组中。接下来,对于每一行,我们又遍历其中的所有非零元素,将它们存储到该行对应的链表中。最后,我们将该链表作为一行加入稀疏矩阵中即可。

在上述代码中,我们使用了两个矢量(即vector)来存储非零元素的行、列和值,并使用一个二维矢量(即vector of vector)来存储稀疏矩阵。在遍历完矩阵中的所有元素后,我们通过一个嵌套的for循环来构造稀疏矩阵。通过这种方法,我们可以有效地将大型稠密矩阵压缩,从而节省存储空间。

总结

在此,我们已经介绍了如何使用C++将矩阵转换为稀疏矩阵。实际上,该方法可以很方便地扩展到多维数组的情况下,并被广泛应用于计算机视觉、模式识别等领域。通过使用稀疏矩阵,我们可以在某些复杂的任务中显著减少存储开销,提高计算效率。