#matrix #exponential #ndarray #linalg

expm

Higham 和 Al-Mohy,2009 年实现的 expm 矩阵指数函数

2 个版本

0.1.1 2019 年 1 月 22 日
0.1.0 2019 年 1 月 22 日

#959 in 科学

MIT/Apache

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-范数时调整参数 titmax(目前 t=2itmax=5,这是 Scipy 和 Matlab 所做的);
  • 确保在计算 Padé 系数时编译器执行常量传播;
  • 测试 Padé 系数与其硬编码结果的对比;
  • 评估是否在所有情况下都需要不安全块,或者是否可以删除。

依赖项

~5.5MB
~161K SLoC