7个不稳定版本 (3个破坏性版本)

0.16.0 2022年10月4日
0.15.0 2022年8月30日
0.2.0 2021年7月17日
0.1.0 2021年2月13日

#2 in #特征值

Download history 4611/week @ 2024-04-08 4874/week @ 2024-04-15 4344/week @ 2024-04-22 4069/week @ 2024-04-29 3577/week @ 2024-05-06 4659/week @ 2024-05-13 4301/week @ 2024-05-20 3650/week @ 2024-05-27 3577/week @ 2024-06-03 3977/week @ 2024-06-10 4139/week @ 2024-06-17 3637/week @ 2024-06-24 3241/week @ 2024-07-01 3580/week @ 2024-07-08 3875/week @ 2024-07-15 4271/week @ 2024-07-22

15,233 每月下载次数
用于 73 个crate(4个直接使用)

MIT/Apache

150KB
3.5K SLoC

线性代数扩展(LAX)

crates.io docs.rs

为ndarray-linalg crate实现提供LAPACK FFI的ndarray-free安全Rust包装器。这个crate负责

  • 链接到LAPACK共享/静态库
  • 使用Lapack特质根据标量类型调度到LAPACK例程

lib.rs:

LAPACK的安全Rust包装器,无外部依赖。

[Lapack]特质

这个crate提供LAPACK包装器作为特质。例如,提供了一般矩阵的LU分解,如下

pub trait Lapack {
    fn lu(l: MatrixLayout, a: &mut [Self]) -> Result<Pivot>;
}

参见[Lapack]获取详细信息。此特质已为[f32],[f64],[c32](f32的别名)和[c64](f64的别名)实现,你可以像使用f64::lu一样使用它。

use lax::{Lapack, layout::MatrixLayout, Transpose};

let mut a = vec![
  1.0, 2.0,
  3.0, 4.0
];
let mut b = vec![1.0, 2.0];
let layout = MatrixLayout::C { row: 2, lda: 2 };
let pivot = f64::lu(layout, &mut a).unwrap();
f64::solve(layout, Transpose::No, &a, &pivot, &mut b).unwrap();

当你要编写针对实数和复数矩阵的泛型算法时,可以使用此特质作为特质限制

use lax::{Lapack, layout::MatrixLayout, Transpose};

fn solve_at_once<T: Lapack>(layout: MatrixLayout, a: &mut [T], b: &mut [T]) -> Result<(), lax::error::Error> {
  let pivot = T::lu(layout, a)?;
  T::solve(layout, Transpose::No, a, &pivot, b)?;
  Ok(())
}

以下有几个类似的特质,以保持开发简单。它们被合并为一个特质[Lapack]。

线性方程,逆矩阵,条件数

根据输入矩阵的性质,使用几种类型的三角分解

  • [solve]模块为一般矩阵提供LU分解的方法。
  • [solveh]模块为对称/Hermitian不定矩阵的Bunch-Kaufman对角置换法提供方法。
  • [cholesky]模块为对称/Hermitian正定矩阵的Cholesky分解提供方法。

特征值问题

根据输入矩阵的性质,有几个类型的特征值问题API

  • [eig]模块为一般矩阵的特征值问题提供方法。
  • [eigh]模块为对称/Hermitian矩阵的特征值问题提供方法。
  • [eigh_generalized]模块为对称/Hermitian矩阵的广义特征值问题提供方法。

奇异值分解

  • [svd]模块为一般矩阵的奇异值分解(SVD)提供方法
  • [svddc] 通用矩阵奇异值分解(SVD)的划分征服算法模块
  • [least_squares] 使用SVD求解最小二乘问题的模块

依赖项

~73MB
~1M SLoC