4个稳定版本
2.2.0 | 2023年10月21日 |
---|---|
2.1.0 | 2023年10月19日 |
2.0.0 | 2023年10月19日 |
1.0.0 | 2022年5月26日 |
#297 在 数据结构
每月下载量:24
180KB
4.5K SLoC
ndstruct
用于存储和检索N维数据的结构。好吧,不是任何 N ∈ ℕ
,而是任何可以适应您所使用的机器指针大小的自然数。例如,一个8位微控制器可以操作最多255维度的任何结构。
对于那些可能想知道为什么应该使用这个crate的人,这通常归结于空间效率、度量学和检索速度。以下片段显示了一些使用案例,其中_cube_of_vecs
是最不高效的。
let _vec_of_options: Vec<Option<i32>> = Default::default();
let _matrix_of_options: [Option<[Option<i32>; 8]>; 16] = Default::default();
let _cube_of_vecs: Vec<Vec<Vec<i32>>> = Default::default();
// The list worsens exponentially for higher dimensions
示例
use ndstruct::{coo::CooArray, csl::CslVec};
fn main() -> ndstruct::Result<()> {
// A CSL and COO cube.
//
// ___ ___
// / / /\
// /___/___/ /\
// / 1 / /\/2/
// /_1_/___/ /\/
// \_1_\___\/ /
// \___\___\/
let coo = CooArray::new([2, 2, 2], [([0, 0, 0], 1.0), ([1, 1, 1], 2.0)])?;
let mut csl = CslVec::default();
csl
.constructor()?
.next_outermost_dim(2)?
.push_line([(0, 1.0)].iter().copied())?
.next_outermost_dim(2)?
.push_empty_line()?
.next_outermost_dim(2)?
.push_empty_line()?
.push_line([(1, 2.0)].iter().copied())?;
assert_eq!(coo.value([0, 0, 0]), csl.value([0, 0, 0]));
assert_eq!(coo.value([1, 1, 1]), csl.value([1, 1, 1]));
Ok(())
}
支持的格式
- 压缩稀疏行(CSL)
- 坐标格式(COO)
- 密集型
特性
no_std
- 不同的存储方式(数组、Vec、Slice等!)
- 完整文档
- 模糊测试
- 无不安全代码
可选特性
alloc
和std
- 反序列化/序列化(serde)
- 并行迭代器(rayon)
- 随机实例(rand)
Future
尽管CSR和COO是通用的稀疏结构,但它们对于某些情况来说还不够好,因此存在DIA、JDS、ELL、LIL、DOK等等。
如果对此有足够的兴趣,将来可能会添加一些提到的稀疏存储。
代数库
由于项目本身的独立责任和复杂性,这个项目不是,也不会成为代数库。此外,要实现这样一个库,需要对不同的算法、操作、分解、求解器和硬件进行大量的工作和研究。
替代方案
以下库中的一个可能更适合您
依赖关系
~110–690KB
~14K SLoC