#线性代数 #几何 #数值方法

linear_isomorphic

一套用于抽象线性类型特征的特质

8 个版本

0.2.4 2024 年 8 月 20 日
0.2.2 2024 年 8 月 14 日
0.2.0 2024 年 7 月 29 日
0.1.3 2024 年 6 月 23 日

#391 in 数学

Download history 181/week @ 2024-06-17 89/week @ 2024-06-24 135/week @ 2024-07-29 1/week @ 2024-08-05 223/week @ 2024-08-12

每月 359 次下载

MIT/Apache

8KB
135

线性同构

此crate定义了一个特质,用于识别何时可以将类型视为线性对象。许多算法可以通用于多种类型,但通常crates会重复实现自己的线性代数类型以确保某些功能。

此crate旨在允许算法对向量类型的特定表示保持无知。例如,许多几何运算可以在不知道维度或向量类型的情况下执行

use linear_isomorphic::*;

pub fn point_segment_distance<Vec>(start: &Vec, end: &Vec, point: &Vec) -> f32
where
    Vec: VectorSpace<Scalar = f32>,
{
    let dir = *end - *start;
    let t = (*point - *start).dot(&dir) / dir.norm_squared();

    let t = t.clamp(0.0, 1.0);

    let closest = *start + dir * t;

    (closest - *point).norm()
}

甚至数值多元微积分

use std::{
    fmt::Debug,
    ops::{AddAssign, Div, Mul},
};
use linear_isomorphic::*;

pub fn numerical_derivative<T, F>(x: f32, f: &F) -> T
where
    T: LinAlg<f32>,
    f32: Mul<T, Output = T>,
    F: Fn(f32) -> T,
{
    let mul = <f32 as Mul<f32>>::mul;
    let h = mul(1e-3, f32::max(f32::abs(x), 1.0));
    
    let denom = h + h;
    let num = f(x + h) - f(x - h);

    <T as Div<f32>>::div(num, denom)
}

欢迎提出使此crate中定义的特质更健壮的建议。

依赖项

~465KB