5次发布

0.1.4 2023年5月3日
0.1.3 2023年4月23日
0.1.2 2023年3月18日
0.1.1 2023年3月12日
0.1.0 2023年3月12日

#219 in 科学

每月44次下载
topopt中使用

MIT/Apache

200KB
1K SLoC

Github CI Crates.io docs.rs

从Rust访问Octave/MATLAB

尽管我不愿意说,但有很多有用的代码生活在.m文件中。有时通过Rust访问这些代码可能会很方便。我想到了至少两种用例

  1. 快速开发:在Octave中可能有一个简单的函数,要将其复制到Rust中需要大量的开发工作。这个crate可以作为临时解决方案,以支持进一步的开发。
  2. 稳健的测试:我们都知道,更好的选择是将那些讨厌的.m文件重写为Rust,使它们🚀飞快™️🚀!这个crate仍然用于测试目的,允许与旧版的Octave/MATLAB代码进行直接比较。

要求

这个crate使用一个令人厌恶的漏洞:Octave在Docker中在后台运行。因此,您必须有一个可工作的Docker安装。

示例用法

假设我们需要一个计算素数的函数,但我们太懒惰自己编写一个。让我们用Octave的primes函数创建一个薄包装器!该函数将如下所示

但是,嘿,假设我们更懒惰!我们这里喜欢快捷方式

fn primes(less_than_n: usize) -> Vec<Vec<f64>> {
    mocktave::eval(                // Start an evaluation
            &format!(              // Format the command
                "x = primes({});", // This is where we call `primes` from Octave
                less_than_n        // Pass through the argument
            )
        )
        .get_matrix("x")           // Extract the results matrix. 
        .unwrap()                  // Unwrap to get the value     
}

let all_primes_less_than_100 = primes(100);

assert_eq!(all_primes_less_than_100, 
           vec![vec![2.0, 3.0, 5.0, 7.0, 11.0, 13.0, 17.0, 19.0, 23.0, 
                     29.0, 31.0, 37.0, 41.0, 43.0, 47.0, 53.0, 59.0, 
                     61.0, 67.0, 71.0, 73.0, 79.0, 83.0, 89.0, 97.0]]);
let primes = mocktave::wrap("primes".into());
let all_primes_less_than_100: Vec<usize> = primes([100]);

assert_eq!(all_primes_less_than_100, vec![2_usize, 3, 5, 7,
    11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
    71, 73, 79, 83, 89, 97]);

需要注意的是,这个函数肯定不是 🚀飞快™️🚀,因为它每次运行时都会启动、运行和关闭一个Docker容器。

依赖关系

~2–15MB
~160K SLoC