#线性代数 #线性 #代数 #矩阵 #变换 #向量 #no-alloc

no-std adv_linalg_lib

Adv_LinAlg过程宏的核心库

2个版本

0.1.1 2023年9月3日
0.1.0 2023年8月29日

#1298 in 数学


用于 adv_linalg

MIT/Apache

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.
}

选择何时使用或不使用内部可变性可以有助于减少分配内存的时间。

后缀

目前有三个后缀

  1. 切片
  2. simd(计划/夜间)
  3. 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