Github CI Crates.io docs.rs

Access Octave/MATLAB from Rust

As much as I hate to say it, there is a lot of useful code living in .m files. Sometimes it can be nice to access that code through Rust. There are at least two use cases I can think of: 1. Rapid Development: There might be a simple function in Octave that would require significant development effort to replicate in Rust. This crate serves as a stopgap measure to enable further development. 2. Robust Testing: We all know that the better option is to rewrite those nasty .m files in Rust so they're 🚀Blazingly Fast™️🚀! This create is still useful for testing purposes, allowing direction comparison to legacy Octave/MATLAB code.

Requirements

This crate uses a disgusting hack: Octave is run in the background in Docker. For that reason, you must have a working installation of Docker.

Example Usage

Let's say we need a function to compute prime numbers, but we're too lazy to write one ourselves. Let's make a thin wrapper around the Octave primes function! That function will look like this:

But hey, let's say we're even lazier! We love shortcuts around here: ``rust fn primes(less_than_n: usize) -> Vec<Vec<f64>> { mocktave::eval( // Start an evaluation &format!( // Format the command "x = primes({});", // This is where we callprimes` from Octave lessthann // Pass through the argument ) ) .get_matrix("x") // Extract the results matrix. .unwrap() // Unwrap to get the value
}

let allprimeslessthan100 = primes(100);

asserteq!(allprimeslessthan100, 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]]); rust let primes = mocktave::wrap("primes".into()); let allprimeslessthan_100: Vec = primes([100]);

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

Its important to note that this function is definitely NOT 🚀Blazingly Fast™️🚀, since it starts, runs, and closes a Docker container every time its run.