2 个不稳定版本
0.2.0 | 2023年3月29日 |
---|---|
0.1.0 | 2023年3月12日 |
#1341 在 数学
每月 21 次下载
41KB
870 行
cayley - Rust 中的泛型、栈分配线性代数
cayley 是一个填补小空白的库:它提供了一个 泛型矩阵类型,其数据在栈上分配。这使得 cayley 即使在非常大的规模上也非常快速。它还处理矩阵的稍微复杂的操作,例如求矩阵的行列式和逆。这些计算目前还没有进行很好的优化,但至少它们是存在的。cayley 以 Arthur Cayley 的名字命名,他是介绍矩阵乘法的著名数学家。
该库的一个重要特性(在写作本文时也是其最大的缺点)是它使用了 generic_const_exprs
功能。这是实验性 Rust,但它允许一个 类型安全的维度系统。以矩阵乘法为例,一个 4x3 的矩阵不能与一个 7x5 的矩阵相乘。我没有找到其他能够 在编译时 检查这一点的库。cayley 可以。尝试执行不可能的矩阵操作的代码是无法编译的。障碍在于 Rust 的类型推断目前还不完全支持泛型常量表达式(尚不支持),因此用户必须显式地标注 Matrix 类型的维度,如下所示
use cayley::Matrix;
let m1: Matrix<f64, 2, 3> = Matrix::ones(2, 3);
let m2: Matrix<f64, 3, 2> = Matrix::from_closure(3, 2, |x, y| (x + y) as f64);
let m3: m1 * m2; // compile-time multiplication checks!
如上例所示,cayley 的矩阵是 泛型 的。库的设计考虑了尽可能多的类型灵活性。例如,为了使两种不同类型的矩阵 T
和 Q
可乘,必须存在一个 'tensor type' R
,以便在 T 上存在 Mul<Q, Output = R>
的实现,在 R
上存在 Add
的实现。对于合理的数值类型,这些实现由 num_traits
库自动处理(顺便提一下,这个库还处理了 cayley 中的许多数学逻辑)。
贡献
我只是一个来自比利时的17岁高中生,喜欢在空闲时间编写代码。如果你愿意帮忙,请随时。
依赖项
~155KB