#file-io #matlab #mat #bindings #api-bindings #matio #wrapper

matio-rs

Rust对MATLAB MAT文件I/O库的包装

19个版本 (9个稳定版)

1.3.2 2024年3月13日
1.3.1 2023年3月10日
1.3.0 2023年2月28日
1.1.2 2022年12月29日
0.2.0 2022年7月11日

#211 in 数学

Download history 237/week @ 2024-03-11 98/week @ 2024-03-18 74/week @ 2024-03-25 107/week @ 2024-04-01 39/week @ 2024-04-08 46/week @ 2024-04-15 55/week @ 2024-04-22 71/week @ 2024-04-29 88/week @ 2024-05-06 50/week @ 2024-05-13 73/week @ 2024-05-20 40/week @ 2024-05-27 50/week @ 2024-06-03 51/week @ 2024-06-10 69/week @ 2024-06-17 57/week @ 2024-06-24

229 每月下载量
用于 19 个Crates(18个直接使用)

MIT 许可证

10MB
31K SLoC

C 22K SLoC // 0.1% comments FORTRAN Modern 3K SLoC // 0.1% comments Visual Studio Project 1.5K SLoC D 1K SLoC M4 1K SLoC // 0.4% comments Rust 750 SLoC // 0.2% comments Objective-C 697 SLoC C++ 608 SLoC // 0.1% comments Automake 585 SLoC // 0.2% comments Shell 207 SLoC // 0.1% comments Visual Studio Solution 112 SLoC TypeScript 7 SLoC Python 6 SLoC

Rust对MATLAB MAT文件I/O库的包装

此crate为MATIO:MATLAB MAT文件I/O C库提供绑定和包装


lib.rs:

MATIO提供Rust绑定和包装

此crate为MATIO:MATLAB MAT文件I/O C库提供绑定和包装

示例

保存到Mat文件

use matio_rs::MatFile;
MatFile::save(data_path)?
.var("a", 1i8)?
.var("b", 2f32)?
.var("c", &vec![3u16; 3])?;

然后将数据加载回Rust

let mat_file = MatFile::load(data_path)?;
let a: i8 = mat_file.var("a")?;
let b: f32 = mat_file.var("b")?;
let c: Vec<u16> = mat_file.var("c")?;

将数据保存到MATLAB结构体

use matio_rs::{MatFile, Mat, MayBeFrom};
let mat_a = Mat::maybe_from("fa", 123f64)?;
let b = vec![0i32, 1, 2, 3, 4];
let mat_v = Mat::maybe_from("fb", &b)?;
let data = vec![mat_a, mat_v];
let mat_struct = Mat::maybe_from("s", data)?;
let mat_file = MatFile::save(data_path)?;
mat_file.write(mat_struct);

然后将结构体字段加载回Rust变量

use matio_rs::{MatFile, Mat, MayBeInto};
let mat_file = MatFile::load(&data_path)?;
let mat: Mat = mat_file.var("s")?;
let a: f64 = mat
.field("fa")?
.get(0).unwrap()
.maybe_into()?;
let b: Vec<i32> = mat
.field("fb")?
.get(0).unwrap()
.maybe_into()?;

具有[MatIO] derive属性的Rust结构体可以像其他变量一样分发

use matio_rs::{MatFile, MatIO};

#[derive(Debug, Default, MatIO)]
struct SMat {
a: f64,
b: Vec<u32>,
s: Nested,
}
#[derive(Debug, Default, MatIO)]
struct Nested {
a: f64,
b: Vec<u32>,
}
let n = Nested {
a: 1f64,
b: vec![2, 3, 4, 5],
};
let a = SMat {
a: 1f64,
b: vec![2, 3, 4, 5],
s: n,
};
MatFile::save(&file)?.var("a", &a)?;
let aa: SMat = MatFile::load(file)?.var("a")?;

将Rust向量保存到3D MATLAB数组

use matio_rs::{MatFile, MatArray};
let data: Vec<_> = (0..24).collect();
MatFile::save(&file)?
.array("array", &data, vec![3, 4, 2])?;

nalgebra向量和矩阵可以通过提供nalgebra功能从和写入Mat文件

use matio_rs::MatFile;
let na_v = nalgebra::DVector::from_iterator(5, 0..5);
MatFile::save(&file).unwrap().var("na_v", &na_v).unwrap();
let v: nalgebra::DMatrix<i32> = MatFile::load(file).unwrap().var("na_v").unwrap();
use matio_rs::MatFile;
let na_m = nalgebra::DMatrix::from_iterator(3, 2, 0..6);
MatFile::save(&file).unwrap().var("na_m", &na_m).unwrap();
let m: nalgebra::DMatrix<i32> = MatFile::load(file).unwrap().var("na_m").unwrap();

依赖