001.稀疏矩阵的基础操作

稀疏矩阵有三种常见的存储格式

  1. COO格式:三元组\((i,j,a_{ij})\)
  2. CSR格式:行首元素索引+列标+元素
  3. CSC格式:列首元素索引+行标+元素

COO格式类模板

const int MaxSize = 100;
#include <iostream>
using namespace std;

//COO三元组定义
template<typename ElemType>
struct TupNode
{
    int r;       //行号
    int c;       //列号
    ElemType d;  //元素值
};

template<typename ElemType>
class TSMatrix
{
private:
    int rows;    //原矩阵的行数
    int cols;    //原矩阵的列数
    int nums;    //原矩阵非0元素个数
    TupNode<ElemType>* data; //三元组顺序表

public:
    // 构造函数 - 接受一维数组
    TSMatrix(ElemType* A, int M, int N)
    {
        // 计算非零元素个数
        nums = 0;
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++) {
                if (A[i * N + j] != 0) {
                    nums++;
                }
            }
        }

        data = new TupNode<ElemType>[MaxSize];
        rows = M;
        cols = N;

        // 填充三元组表
        int index = 0;
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++) {
                if (A[i * N + j] != 0) {
                    data[index].r = i + 1;  // 行号从1开始
                    data[index].c = j + 1;  // 列号从1开始
                    data[index].d = A[i * N + j];
                    index++;
                }
            }
        }
    }

    // 构造函数重载 - 接受二维数组
    template<int N>
    TSMatrix(ElemType A[][N], int M) : TSMatrix(&A[0][0], M, N) {}

    // 析构函数
    ~TSMatrix()
    {
        delete[] data;
    }

    // 拷贝构造函数
    TSMatrix(const TSMatrix& other)
    {
        rows = other.rows;
        cols = other.cols;
        nums = other.nums;
        data = new TupNode<ElemType>[nums];
        for (int i = 0; i < nums; i++) {
            data[i] = other.data[i];
        }
    }

    // 赋值运算符
    TSMatrix& operator=(const TSMatrix& other)
    {
        if (this != &other) {
            delete[] data;

            rows = other.rows;
            cols = other.cols;
            nums = other.nums;
            data = new TupNode<ElemType>[nums];
            for (int i = 0; i < nums; i++) {
                data[i] = other.data[i];
            }
        }
        return *this;
    }

    bool Value(ElemType x, int i, int j)
    {
        if (i > rows || i <= 0 || j > cols || j <= 0) return false;

        int k = 0;
        // 查找行和列
        while (k < nums && i > data[k].r) k++;
        while (k < nums && i == data[k].r && j > data[k].c) k++;

        if (k < nums && data[k].r == i && data[k].c == j) {
            // 元素已存在,更新值
            data[k].d = x;
            if (x == 0) {
                // 如果设置为0,移除该元素
                for (int k1 = k; k1 < nums - 1; k1++) {
                    data[k1] = data[k1 + 1];
                }
                nums--;
            }
        }
        else if (x != 0) {
            // 元素不存在,插入新元素
            if (nums >= MaxSize) {
                cerr << "Error: Too many non-zero elements" << endl;
                return false;
            }

            for (int k1 = nums; k1 > k; k1--) {
                data[k1] = data[k1 - 1];
            }
            data[k].r = i;
            data[k].c = j;
            data[k].d = x;
            nums++;
        }
        return true;
    }

    // 访问元素x=A[i][j]
    bool Assign(ElemType& x, int i, int j)
    {
        if (i > rows || i <= 0 || j > cols || j <= 0) return false;

        int k = 0;
        while (k < nums && i > data[k].r) k++;
        while (k < nums && i == data[k].r && j > data[k].c) k++;

        if (k < nums && data[k].r == i && data[k].c == j) {
            x = data[k].d;
        }
        else {
            x = 0;
        }
        return true;
    }

    void ShowElem()
    {
        if (nums == 0) {
            cout << "The data of TSMatrix is NULL" << endl;
        }
        else {
            for (int p = 0; p < nums; p++) {
                cout << "(" << data[p].r << "," << data[p].c << "," << data[p].d << ")" << endl;
            }
        }
    }
};
posted @ 2025-06-02 14:23  _P_D_X  阅读(16)  评论(0)    收藏  举报