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

Apache-2.0

180KB
4.5K SLoC

ndstruct

CI crates.io Documentation License Rustc

用于存储和检索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等!)
  • 完整文档
  • 模糊测试
  • 无不安全代码

可选特性

  • allocstd
  • 反序列化/序列化(serde)
  • 并行迭代器(rayon)
  • 随机实例(rand)

Future

尽管CSR和COO是通用的稀疏结构,但它们对于某些情况来说还不够好,因此存在DIA、JDS、ELL、LIL、DOK等等。

如果对此有足够的兴趣,将来可能会添加一些提到的稀疏存储。

代数库

由于项目本身的独立责任和复杂性,这个项目不是,也不会成为代数库。此外,要实现这样一个库,需要对不同的算法、操作、分解、求解器和硬件进行大量的工作和研究。

替代方案

以下库中的一个可能更适合您

依赖关系

~110–690KB
~14K SLoC