2 个版本
0.1.1 | 2019 年 1 月 22 日 |
---|---|
0.1.0 | 2019 年 1 月 22 日 |
#959 in 科学
31KB
568 行
Rust 中的矩阵指数运算
本库包含 expm
,这是在 Rust 编程语言中实现 Al-Mohy 和 Higham 的算法 6.1 的一个实现。它计算矩阵的指数。有关更多信息,请参阅相关论文。
它使用了优秀的 rust-ndarray
库来存储矩阵。
示例用法
以下示例计算单位矩阵的指数。
重要:您需要显式链接到 BLAS + LAPACK 提供程序,例如 openblas_src
。请参阅 blas-lapack-rs
组织 中给出的解释。
extern crate openblas_src;
use approx::assert_ulps_eq;
#[test]
fn exp_of_unit() {
let n = 5;
let a = ndarray::Array2::eye(n);
let mut b = unsafe { ndarray::Array2::<f64>::uninitialized((n, n)) };
crate::expm(&a, &mut b);
for &elem in &b.diag() {
assert_ulps_eq!(elem, 1f64.exp(), max_ulps=1);
}
}
待办事项
在实现算法时,特别考虑了性能。因此,在 Expm
结构的初始设置之后,不再进行额外的分配,并且可以重复使用 Expm
来计算具有相同维度的矩阵的指数。
但是,代码分析可能会揭示改进它的方法。
- 分析代码并优化;
- 编写更多测试以验证算法对困难矩阵的适用性;
- 在计算 1-范数时调整参数
t
和itmax
(目前t=2
,itmax=5
,这是 Scipy 和 Matlab 所做的); - 确保在计算 Padé 系数时编译器执行常量传播;
- 测试 Padé 系数与其硬编码结果的对比;
- 评估是否在所有情况下都需要不安全块,或者是否可以删除。
依赖项
~5.5MB
~161K SLoC