CSR格式是C++中平衡内存、随机访问和乘法性能的首选稀疏矩阵表示,适用于行遍历多、列访问少的场景;其核心为row_ptr、col_indices和values三个数组,构建需两趟扫描或先COO后转换,避免频繁单点插入。

如何在c++中实现一个高效的稀疏矩阵? (压缩存储格式)

用 CSR 格式实现稀疏矩阵最实用

CSR(Compressed Sparse Row)是 C++ 中平衡内存、随机访问和乘法性能的首选压缩格式,尤其适合行遍历多、列访问少的场景(如大多数线性代数库和图算法)。它不支持高效列插入,但对已知非零结构的矩阵初始化和矩阵-向量乘非常快。

别直接手写 insert(),先用 COO 构建再转 CSR

频繁单点插入会破坏 CSR 的紧凑性,导致 O(n) 查找或 O(nnz) 重排。正确做法是:收集三元组 (row, col, value)std::vector,排序后去重(可选),最后一次性构建 CSR。

矩阵-向量乘 y = A·x 必须手写循环,别依赖 operator[]

CSR 的核心优势在 y[i] += values[k] * x[col_indices[k]] 这种无分支密集访存,而通用 operator()(i,j) 查找会退化成 O(nnz) 每次调用。

用 std::vector 管理内存,但避免 vector

std::vectorstd::vector 是 CSR 的标准选择;vector 是位压缩特化,不满足 RandomAccessIterator 要求,会导致 data() 失效、迭代器失效、无法传给 BLAS 接口。

CSR 的真正复杂点不在结构本身,而在构建阶段的排序/去重逻辑和乘法循环中对 row_ptr 边界的精确把握——这两处出错不会崩溃,但结果全错,且难以调试。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。