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 数学
每月 359 次下载
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