用三元组表示稀疏矩阵,实现两个稀疏矩阵相加(C++)
时间: 2024-10-29 12:04:59 浏览: 42
在C++中,稀疏矩阵通常使用三元组(<行索引,列索引,值>)来存储,因为它们的数据大部分是零,这种数据结构被称为Compressed Sparse Row (CSR) 或 Compressed Sparse Column (CSC)。对于相加操作,我们可以创建一个新的三元组容器来保存结果,仅对非零元素进行累加。
以下是一个简单的示例,展示了如何使用CSR格式来实现两个稀疏矩阵`A`和`B`的相加:
```cpp
#include <vector>
#include <unordered_map>
// 定义稀疏矩阵的三元组
typedef std::pair<int, int> IndexPair;
struct SparseTriple {
IndexPair row_col;
double value;
};
// 稀疏矩阵表示
class SparseMatrix {
private:
std::vector<SparseTriple> non_zeros; // 存储非零元素
std::vector<int> row_ptr; // 每行第一个非零元素的索引
int rows, cols;
public:
SparseMatrix(int m, int n): rows(m), cols(n) {}
void add(SparseMatrix &other) {
if (rows != other.rows || cols != other.cols) {
throw std::invalid_argument("Matrices must have the same dimensions");
}
for (const auto& nz : other.non_zeros) {
auto it = findNonZero(nz.row_col);
if (it == non_zeros.end()) {
non_zeros.push_back(nz);
} else {
it->value += nz.value;
}
}
}
// 其他辅助函数...
private:
std::vector<SparseTriple>::iterator findNonZero(IndexPair idx) {
return std::lower_bound(non_zeros.begin(), non_zeros.begin() + row_ptr[idx.first], idx,
[](const SparseTriple& a, const IndexPair& b) { return a.row_col.first < b.first; });
}
};
```
在这个例子中,`add`方法遍历给定矩阵`B`的所有非零元素,如果当前行在`A`中不存在,则直接添加;如果存在,则更新对应位置的值。注意这个版本假设两个输入矩阵有相同的维度。
阅读全文