15个不稳定版本 (4个重大变更)

0.5.0 2023年9月9日
0.4.2 2023年8月6日
0.3.0 2021年2月20日
0.2.4 2020年11月19日
0.1.2 2020年5月28日

#623算法

Download history 34/week @ 2024-03-30 26/week @ 2024-04-06 91/week @ 2024-04-13 4/week @ 2024-04-20 7/week @ 2024-05-18 25/week @ 2024-05-25 12/week @ 2024-06-01 9/week @ 2024-06-08 2/week @ 2024-06-15 10/week @ 2024-06-29 54/week @ 2024-07-06

每月64次下载
3 crates 中使用

MIT/Apache

170KB
3.5K SLoC

Build Status Current Version Documentation License: MIT OR Apache-2.0

toodee

TooDee 是围绕可增长 Vec 的高性能轻量级二维包装。

TooDeeViewTooDeeViewMut 允许你围绕切片创建二维包装。

核心功能

  • 通过 data()data_mut() 获取对底层向量切片的原始访问。
  • 使用 view()view_mut() 创建性能优异的二维子集。
  • get_unchecked(Coordinate)get_unchecked_row(usize) 用于更快(不安全)访问单元格或行。
  • 大多数操作都针对 TooDeeTooDeeViewMut 结构体实现 - 下面将展示如何扩展此模式。
  • 使用索引获取/设置特定单元格,例如,let my_row = toodee[row]; my_row[col] = val;
  • 如果您愿意,可以使用 Coordinate 进行索引,例如,toodee[(col, row)] = val
  • 通过行索引(即,行主序)索引以访问行切片,例如,&toodee[row]
  • 迭代,任选方式 - rows()rows_mut()col()col_mut()cells()cells_mut()
  • #[no_std]兼容。
  • 可以从&[T]创建一个新的TooDeeView,或者从一个&mut [T]创建一个TooDeeViewMut
  • insert_col()remove_col()insert_row()remove_row()具有良好性能的实现。

特性

copy,默认包含

CopyOps trait提供了在相同2D数组内复制数据或从一个数组复制到另一个数组的各种操作。其中许多操作命名与它们的切片对应项类似,例如copy_from_slice()copy_from_toodee()

translate,默认包含

TranslateOps trait提供了常见的转换算法,包括

  • translate_with_wrap(),一种在垂直和水平方向上移动数据的方法。
  • flip_rows(),即关于中心行的数据镜像转换。
  • flip_cols(),即关于中心列的数据镜像转换。

sort,默认包含

SortOps trait提供了高效的实现,包括

  • sort_by_row()操作,有稳定和不稳定的变体。
  • sort_by_col()操作,有稳定和不稳定的变体。

serde,默认包含

TooDee对象的序列化和反序列化。可以序列化TooDeeViewTooDeeViewMut,但必须反序列化到TooDee结构中。

构建您自己的2D算法

SortOps这样的trait包含额外的算法。这些trait通过扩展已经为TooDeeTooDeeViewMut实现过的TooDeeOpsMut trait来定义。我建议采取同样的方法,因为这样您实现的算法将适用于这两个结构。此外,如果需要,可以覆盖trait的默认实现。

新trait的实现可能看起来像这样

pub trait FooOps<T> : TooDeeOpsMut<T> {

    fn foo(&mut self) -> Bar {
        ...
        return bar;
    }
}

上面的代码将提供一个默认的 foo() 实现,如果需要可以覆盖。然后只需声明 TooDeeTooDeeOpsMut 都实现了 FooOps

impl<T> FooOps<T> for TooDeeViewMut<'_, T> {}

impl<T> FooOps<T> for TooDee<T> {}

一旦实现可用,只需调用方法即可,例如:

let bar = my_toodee.foo();
let bar_view = my_toodee_mut_view.foo();

编码愉快 😄

待办事项

  • 路径查找算法?
  • 图像/位图算法?!

动机

类似的库确实存在,但它们缺乏性能、灵活性或功能。

以下是一个小型功能比较表

存储顺序支持的 Structs可增长?可变视图?原始数据访问?遍历行切片?备注
toodee::TooDee行主序任何东西 (Sized)
图像::ImageBuffer行主序图像::像素适用于图像处理 - 请参阅 imageproc 包。
图像::SubImage行主序图像::像素
网格::Grid行主序克隆TooDee 类似,但功能不那么丰富。
array2d::Array2D行主序克隆
imgref::Img行主序任何东西 (Sized)
nalgebra::矩阵列主序标量用于向量/矩阵运算。

目标

  • 高性能和良好的灵活性,但受限于使用 1-D 向量。
  • 适用于图像处理,但不仅限于这个领域。
  • 提供非平凡 2D 操作的稳定实现。

非目标

  • GPU 集成

许可证

根据您的选择,许可为以下任一项:

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的任何贡献,均应按上述方式双重许可,不得附加任何额外条款或条件。

依赖关系

~0.4–1MB
~23K SLoC