聲明:圖片及內容基於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;
}