【數據結構與算法】數組、矩陣的壓縮與存儲(稀疏矩陣的實現、加法、乘法)


聲明:圖片及內容基於https://www.bilibili.com/video/av97010411

特殊矩陣的壓縮和存儲

對稱矩陣的壓縮存儲

三角矩陣的壓縮存儲

對角矩陣的壓縮存儲

稀疏矩陣的壓縮和存儲

稀疏矩陣

三元組

十字鏈表

完整實例

定義三元組

typedef struct {
    int row, col;   //三元組的行號,列號
    int item;       //三元組的值
}Triple;

定義稀疏矩陣類

class TripleMatrix {
private:
    Triple data[MAX];  //非零元三元組
    int mu, nu, num; //矩陣的行數、列數和非零元個數
public:
    TripleMatrix();
    TripleMatrix(int m, int n);
    ~TripleMatrix();
    bool setItem(int row, int col, int item);//根據行號,列號,非零元再添加一個三元組
    int getItem(int row, int col);      //根據行號列號獲得矩陣元素值
    void printMatrix(); //按照矩陣方式打印稀疏矩陣
    void printTriple(); //打印三元組數組
    friend bool matrixAdd(TripleMatrix a, TripleMatrix b, TripleMatrix& result);  //稀疏矩陣加法
    friend bool matrixMulty(TripleMatrix a, TripleMatrix b, TripleMatrix& resultl); //稀疏矩陣乘法
};

構造函數

TripleMatrix::TripleMatrix() {      //無參構造
    this->mu = 0;
    this->nu = 0;
    this->num = 0;
}
TripleMatrix::TripleMatrix(int m,int n) {    //有參構造
    this->mu = m;
    this->nu = n;
    this->num = 0;
}

析構函數

TripleMatrix::~TripleMatrix() {}

插入三元組

bool TripleMatrix::setItem(int row, int col, int item) {
    if (row<1 || col<1 || row>mu || col>nu) return false;  //異常處理
    if (num == MAX) return false;
    if (item == 0) return true;
    int index = 0;
    while (index < num) {              //稀疏矩陣排列方式先行后列
        if (row > data[index].row)
            index++;
        else if (col > data[index].col)
            index++;
        else break;
    }
    if (row == data[index].row && col == data[index].col) { //行列均相等覆蓋原值
        data[index].item = item;
    }
    else {
        for (int i = num; i > index; i--) {   //index后面的元素向后移動,給新元素騰出位置
            data[i] = data[i - 1];
        }
        data[index].row = row;          //新元素加入矩陣
        data[index].col = col;
        data[index].item = item;
        num++;         //別忘了
    }
    return true;
}

獲得稀疏矩陣值

int TripleMatrix::getItem(int row,int col) {
    if (row > mu || col > nu) return 0;
    for (int i = 0; i < num; i++) {
        if (data[i].row == row && data[i].col == col)
            return data[i].item;
    }
    return 0;
}

打印稀疏矩陣

void TripleMatrix::printMatrix() {
    cout << "打印矩陣:\n" << endl;
    int index = 0;                 //記錄矩陣中三元組的下標 
    for (int i = 1; i <= mu; i++) {
        for (int j = 1; j <= nu; j++) {
            if (i == data[index].row && j == data[index].col) {
                cout << data[index].item << "\t";
                index++;       //別忘了
            }
            else cout << "0\t";
        }
        cout << endl;
    }
    cout << "矩陣共有" << mu << "行," << nu << "列," << "共" << num << "個非零元素" << endl;
    return;
}

打印三元組

void TripleMatrix::printTriple() {
    cout << "打印三元組數組:" << endl;
    cout<<"row\tcol\titem"<<endl;
    for (int i = 0; i <num; i++) {
        cout << data[i].row << "\t" << data[i].col << "\t" << data[i].item << endl;
    }
}

輸入元素

void inputMatrix(int m,int n,int num,TripleMatrix &triple) {
    int row, col, item;
    for (int i = 1; i <= num; i++) {
        cout << "請輸入行號,列號,非零元:";
        cin >> row >> col >> item;
        if (item != 0) {
            if (triple.setItem(row, col, item) == false) {
                cout << "輸入不合法" << endl;
                break;
            }
        }
    }
}

矩陣加法

bool matrixAdd(TripleMatrix a, TripleMatrix b, TripleMatrix& result) {
    if (a.mu != b.mu || b.mu != result.mu || a.nu != b.nu || b.nu != result.nu) return false;
    for (int i = 1; i <= a.mu;i++) {
        for (int j = 1; j <= a.nu; j++) {
            int item = a.getItem(i, j) + b.getItem(i, j);
            if (item != 0) {
                result.setItem(i, j, item);
            }
        }
    }
    return true;
}

矩陣乘法

bool matrixMulty(TripleMatrix a, TripleMatrix b, TripleMatrix& result) {
    if (a.nu != b.mu) return false;     //矩陣乘法,前一個矩陣的列=后一個矩陣的行
    result.mu = a.mu;                
    result.nu = b.nu;
    int i, j, k;
    for (i = 1; i <= a.mu; i++) {
        for (j = 1; j <= b.nu; j++) {
            int sum = 0;
            for (k = 1; k <= a.nu; k++) {
                sum += a.getItem(i, k) * b.getItem(k, j);
            }
            if(sum!=0)      //注意
            result.setItem(i, j, sum);
        }
    }
    return true;
 }

完整代碼

#include<iostream>
using namespace std;
#define MAX 100
typedef struct {
    int row, col;   //三元組的行號,列號
    int item;       //三元組的值
}Triple;

class TripleMatrix {
private:
    Triple data[MAX];  //非零元三元組
    int mu, nu, num; //矩陣的行數、列數和非零元個數
public:
    TripleMatrix();
    TripleMatrix(int m, int n);
    ~TripleMatrix();
    bool setItem(int row, int col, int item);//根據行號,列號,非零元再添加一個三元組
    int getItem(int row, int col);      //根據行號列號獲得矩陣元素值
    void printMatrix(); //按照矩陣方式打印稀疏矩陣
    void printTriple(); //打印三元組數組
    friend bool matrixAdd(TripleMatrix a, TripleMatrix b, TripleMatrix& result);
    friend bool matrixMulty(TripleMatrix a, TripleMatrix b, TripleMatrix& resultl);
};
TripleMatrix::TripleMatrix() {
    this->mu = 0;
    this->nu = 0;
    this->num = 0;
}
TripleMatrix::TripleMatrix(int m,int n) {
    this->mu = m;
    this->nu = n;
    this->num = 0;
}
TripleMatrix::~TripleMatrix() {}
bool TripleMatrix::setItem(int row, int col, int item) {
    if (row<1 || col<1 || row>mu || col>nu) return false;
    if (num == MAX) return false;
    if (item == 0) return true;
    int index = 0;
    while (index < num) {              //稀疏矩陣排列方式先行后列
        if (row > data[index].row)
            index++;
        else if (col > data[index].col)
            index++;
        else break;
    }
    if (row == data[index].row && col == data[index].col) { //行列均相等覆蓋原值
        data[index].item = item;
    }
    else {
        for (int i = num; i > index; i--) {   //index后面的元素向后移動,給新元素騰出位置
            data[i] = data[i - 1];
        }
        data[index].row = row;          //新元素加入矩陣
        data[index].col = col;
        data[index].item = item;
        num++;         //別忘了
    }
    return true;
}
int TripleMatrix::getItem(int row,int col) {
    if (row > mu || col > nu) return 0;
    for (int i = 0; i < num; i++) {
        if (data[i].row == row && data[i].col == col)
            return data[i].item;
    }
    return 0;
}
void TripleMatrix::printMatrix() {
    cout << "打印矩陣:\n" << endl;
    int index = 0;                 //記錄矩陣中三元組的下標 
    for (int i = 1; i <= mu; i++) {
        for (int j = 1; j <= nu; j++) {
            if (i == data[index].row && j == data[index].col) {
                cout << data[index].item << "\t";
                index++;       //別忘了
            }
            else cout << "0\t";
        }
        cout << endl;
    }
    cout << "矩陣共有" << mu << "行," << nu << "列," << "共" << num << "個非零元素" << endl;
    return;
}
void TripleMatrix::printTriple() {
    cout << "打印三元組數組:" << endl;
    cout<<"row\tcol\titem"<<endl;
    for (int i = 0; i <num; i++) {
        cout << data[i].row << "\t" << data[i].col << "\t" << data[i].item << endl;
    }
}
void inputMatrix(int m,int n,int num,TripleMatrix &triple) {
    int row, col, item;
    for (int i = 1; i <= num; i++) {
        cout << "請輸入行號,列號,非零元:";
        cin >> row >> col >> item;
        if (item != 0) {
            if (triple.setItem(row, col, item) == false) {
                cout << "輸入不合法" << endl;
                break;
            }
        }
    }
}
bool matrixAdd(TripleMatrix a, TripleMatrix b, TripleMatrix& result) {
    if (a.mu != b.mu || b.mu != result.mu || a.nu != b.nu || b.nu != result.nu) return false;
    for (int i = 1; i <= a.mu;i++) {
        for (int j = 1; j <= a.nu; j++) {
            int item = a.getItem(i, j) + b.getItem(i, j);
            if (item != 0) {
                result.setItem(i, j, item);
            }
        }
    }
    return true;
}
bool matrixMulty(TripleMatrix a, TripleMatrix b, TripleMatrix& result) {
    if (a.nu != b.mu) return false;
    result.mu = a.mu;
    result.nu = b.nu;
    int i, j, k;
    for (i = 1; i <= a.mu; i++) {
        for (j = 1; j <= b.nu; j++) {
            int sum = 0;
            for (k = 1; k <= a.nu; k++) {
                sum += a.getItem(i, k) * b.getItem(k, j);
            }
            if(sum!=0)
            result.setItem(i, j, sum);
        }
    }
    return true;
 }
int main() {
    int m, n, num;
    cout << "請輸入第一個矩陣的行,列,非零元個數" << endl;
    cin >> m >> n >> num;
    TripleMatrix triple1(m, n);
    inputMatrix(m, n, num, triple1);
    //triple1.printTriple();
    triple1.printMatrix();

    cout << "請輸入第二個矩陣的行,列,非零元個數" << endl;
    cin >> m >> n >> num;
    TripleMatrix triple2(m, n);
    inputMatrix(m, n, num, triple2);
    //triple2.printTriple();
    triple2.printMatrix();


    /*TripleMatrix triple3(m, n);
    matrixAdd(triple1, triple2, triple3);
    triple3.printMatrix();*/

    TripleMatrix triple4;
    matrixMulty(triple1, triple2, triple4);
    triple4.printMatrix();

    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM