2个版本
0.1.1 | 2023年9月3日 |
---|---|
0.1.0 | 2023年8月29日 |
#1298 in 数学
用于 adv_linalg
25KB
483 行
Adv_LinAlg_Lib
⚠️ 该库目前正在建设中!设计可能会更改!⚠️
adv_linalg
线性代数框架的骨干。
用法
Cargo.toml
adv_linalg_lib = "0.1"
#![no_std] 兼容特性
如果您需要仅使用core
软件包的库版本,只需将此库导入为这样
Cargo.toml
adv_linalg_lib = { version = "0.1", features=["no_std"] }
请注意,这将极大地简化库结构,并且该软件包的依赖项不一定使用#![no_std]
。
基本类型
简单来说,这是一个线性代数库。它具有两种主要类型
- Vector
- Matrix
这些类型是标准库中Vec<T>
类型的简单封装。
大多数开发者只需要这两种类型。
然而,对于需要优化运行时性能的用户,该库提供了两种选项
- 使用框架
adv_linalg
与该库一起使用,以实现自动编译时优化(推荐) - 手动使用**高级类型**
实际上,adv_linalg只是将
adv_linalg_lib
用作“幽灵”类型系统。
要了解更多信息,请阅读有关高级类型的说明
高级类型
对于只需要简单工具的开发者,只需知道本节是可选的。
此软件包中的每个类型要么是“Vector”,要么是“Matrix”。所有类型都包含其名称中的基础。
类型的功能由其可选的
前缀
只有一个前缀:Mut。
Mut
这明确表示允许内部可变性。
点击此处了解“内部可变性”
要了解内部可变性,首先了解“内部不可变性”。
内部不可变性意味着类型的内部是不可变的。这强制执行以下规则:如果数据发生了变异,则它是一个不同的向量。
换句话说,要更改数据,则需要分配。
以下是从常规可变性到内部可变性的示例代码
fn main() {
// MUTABILITY TYPES
// initial value
let mut std_vec = vec![1, 2, 3];
// Example of mutability that follows `interior
// immutability`.
// We essentially "overwrite" the variable.
std_vec = std_vec.iter().map(|val| val + 1).collect();
// Example of only 'interior mutability'.
// Imagine the next three lines as a single operation.
// We are reusing the already allocated memory.
{
std_vec[0] = std_vec[0] + 1;
std_vec[1] = std_vec[1] + 1;
std_vec[2] = std_vec[2] + 1;
}
// Exterior mutability "overwrote the varaiable", utilizing an entire new heap allocation in the process.
// Interior mutability "overwrote the memory", reusuing the already allocated memory.
}
选择何时使用或不使用内部可变性可以有助于减少分配内存的时间。
后缀
目前有三个后缀
- 切片
- simd(计划/夜间)
- gpu(计划)
切片
现有向量的一个子部分视图。这仅仅是Vec的一个切片。
示例
use adv_linalg_lib::vector;
use adv_linalg_lib::vectors::{Vector, VectorSlice};
fn main() {
let vector: Vector<u32> = vector![1, 2, 3];
let vector_slice: VectorSlice<'_, u32> = vector.as_slice(1..vector.len());
assert_eq!(
vector_slice.to_vector(), vector![2, 3]
)
}
simd
⚠️设计仍在建设中,是夜间版本。⚠️
此功能仍在设计过程中。产生的方案将使用core::simd::Simd
。因此,当设计实现时,需要使用nightly
编译,直到Rust稳定core::simd::Simd
。
gpu
⚠️设计仍在建设中。⚠️
此功能仍在设计过程中。产生的方案将支持OpenCL。
一些高级类型示例
- MutVector
- MatrixSlice
- MutVectorSimd
许可证
本软件的最终许可描述在SPDX 2.1许可证表达式“MIT OR Apache-2.0”下。
请参阅根目录下的文件'LICENSE.md'
、'LICENSE-MIT'
和'LICENSE-APACHE'
以获取更多详细信息
依赖项
~290–750KB
~18K SLoC