001.稀疏矩阵的基础操作
稀疏矩阵有三种常见的存储格式
- COO格式:三元组\((i,j,a_{ij})\)
- CSR格式:行首元素索引+列标+元素
- 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;
}
}
}
};

浙公网安备 33010602011771号