c++实现多对角矩阵的压缩存储
时间: 2023-09-09 17:06:34 浏览: 90
多对角矩阵是一种特殊的稀疏矩阵,只有主对角线及其上下若干条对角线上有非零元素,其余元素均为零。因此,可以采用压缩存储方式来节省存储空间。常用的压缩存储方式有三对角矩阵、对称三对角矩阵和块对角矩阵等。
对于多对角矩阵,我们可以采用对角线压缩存储方式。具体来说,就是将矩阵中的每条对角线都保存在一个一维数组中,然后将这些数组按照对角线的位置排列起来,形成一个二维的压缩矩阵。这样,对于一个 $n\times n$ 的多对角矩阵,压缩后的存储空间为 $O(n)$。
下面是一个 C++ 实现多对角矩阵压缩存储的示例代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
class DiagonalMatrix {
private:
vector<int> diagonal; // 对角线数组
int n; // 矩阵维度
public:
DiagonalMatrix(int n) {
this->n = n;
diagonal.resize(2 * n - 1, 0); // 初始化对角线数组大小
}
void set(int i, int j, int value) {
if (i < 1 || i > n || j < 1 || j > n) {
cout << "Invalid index!" << endl;
return;
}
if (i == j) {
diagonal[n - 1 + i - 1] = value; // 主对角线
} else if (i - j == 1) {
diagonal[i - 2] = value; // 上一条对角线
} else if (j - i == 1) {
diagonal[n + j - 2] = value; // 下一条对角线
} else {
cout << "Invalid index!" << endl;
return;
}
}
int get(int i, int j) {
if (i < 1 || i > n || j < 1 || j > n) {
cout << "Invalid index!" << endl;
return 0;
}
if (i == j) {
return diagonal[n - 1 + i - 1]; // 主对角线
} else if (i - j == 1) {
return diagonal[i - 2]; // 上一条对角线
} else if (j - i == 1) {
return diagonal[n + j - 2]; // 下一条对角线
} else {
return 0;
}
}
};
int main() {
DiagonalMatrix mat(5);
mat.set(1, 1, 1);
mat.set(2, 2, 2);
mat.set(3, 3, 3);
mat.set(4, 4, 4);
mat.set(5, 5, 5);
mat.set(1, 2, 6);
mat.set(2, 3, 7);
mat.set(3, 4, 8);
mat.set(4, 5, 9);
cout << mat.get(1, 2) << endl; // output: 6
cout << mat.get(2, 3) << endl; // output: 7
cout << mat.get(3, 2) << endl; // output: 0 (非对角线元素)
return 0;
}
```
阅读全文