Native MoonBit recursive MAT Level 5 reader, writer and scientific data bridge
| 能力 | v0.0.9 |
|---|---|
| MAT Level 5 读取 | 小端、大端;标准标签与小数据标签;多变量 |
| 压缩读取 | miCOMPRESSED;MoonBit 解码 stored/fixed/dynamic DEFLATE,验证 Adler-32 |
| MAT 写入 | 确定性的未压缩/压缩小端文件,固定创建描述,不嵌入时间戳 |
| 递归混合类型 | cell、struct 数组、char、legacy object(类名与字段数据);多维、空数组和交叉嵌套 |
| 字符 | 六种存储标签;中文、非 BMP;保留编码及原始存储单位,大小端读取 |
| CSC 稀疏 | 二维 double、logical、complex double;混合文件、容量保留、显式密集转换 |
| 数值类型 | float32/64;有符号、无符号 int8/16/32/64;logical |
| 复数 | float32、float64 的实部与虚部分开保留 |
| 形状 | 标量 [1,1]、行/列向量、多维和空数组,保持列优先存储 |
| 数据保真 | 同存储类型的 MAT 往返保留原始 IEEE 字节、NaN payload、负零和精确 64 位整数 |
| JSON 互通 | moonmatbridge/1 严格字段;64 位整数使用十进制字符串 |
| NumPy 互通 | 导出 NPY v1.0;读取 NPY 1/2/3,大小端与 C/Fortran 顺序,复数交错编码 |
| 数组处理 | 保留原始字节的切片、按轴取样、拼接、reshape、轴置换;混合文件按名称提取变量 |
| 根目录与按需构造 | roots / inspect_roots 返回根变量元数据;read_selected 保持请求顺序并验证未选变量 |
| 无损快照 | 严格 JSON + 原始十六进制字节;密集/CSC、NaN 编码、负零、容量与全局标记 |
| 科研差异 | 按变量名比较原始字节与元数据;全局样本额度、坐标、实/虚部计数和 CI 退出码 |
| 核心编译目标 | JS、wasm-gc、native 已验证 |
| 命令行 | Windows x64 原生 EXE;可选 Node.js 文件适配器 |
.\moonmat.exe version
.\moonmat.exe sample sample.mat
.\moonmat.exe info sample.mat
.\moonmat.exe roots sample.mat
.\moonmat.exe dump sample.mat sample.json
.\moonmat.exe pack sample.json from-json.mat
.\moonmat.exe npy sample.mat temperature temperature.npy
.\moonmat.exe from-npy temperature.npy temperature from-numpy.mat
.\moonmat.exe select sample.mat subset.mat temperature sample_id
.\moonmat.exe roundtrip sample.mat copy.mat
.\moonmat.exe transform sample.mat examples\transform-plan.json transformed.mat
.\moonmat.exe compress transformed.mat compressed.mat
.\moonmat.exe snapshot compressed.mat archive.json
.\moonmat.exe restore archive.json restored.mat
.\moonmat.exe diff compressed.mat restored.mat equality-report.json
.\moonmat.exe sparsify sample.mat temperature sparse.mat
.\moonmat.exe densify sparse.mat temperature dense.matnode scripts/cli.mjs info sample.matmoon add WeiR-h/moonmatbridge@0.0.9moon run src/examples/main --target js
moon run src/examples/main --target wasm-gc
moon run src/examples/main --target nativeimport {
"WeiR-h/moonmatbridge" @mat,
}let a = @mat.numeric_array(
"signal", @mat.Float64, [2, 2],
[Floating(1.0), Floating(2.0), Floating(3.0), Floating(4.0)],
)
let bytes = @mat.write_mat([a])
let file = @mat.read_mat(bytes)
let restored = file.get("signal").unwrap()
let position = restored.index([1, 0]) // 0-based coordinates; result is 1
let value = restored.value(position)
let numpy_bytes = @mat.write_npy(restored)import numpy as np
from scipy.io import loadmat, savemat
data = loadmat("sample.mat")
assert int(data["sample_id"][0, 0]) == 9007199254740993
temperature = np.load("temperature.npy", allow_pickle=False)
assert temperature.shape == (2, 3)
# 压缩和未压缩的 dense numeric MAT 都可读入 MoonMatBridge。
savemat("python.mat", {"signal": np.arange(12).reshape(3, 4)}, do_compression=True)python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
npm run check
npm test
npm run build
npm run build:native
npm run verify
npm run package
npm run verify:registrypub(all) struct CharArray {
name : String
shape : Array[Int]
encoding : CharEncoding
data : Bytes
is_global : Bool
} derive(Debug)pub(all) struct DocumentDifference {
content_equal : Bool
variable_order_changed : Bool
changed_variables : Int
variables : Array[VariableDifference]
} derive(Debug)pub(all) struct MatDocument {
description : String
little_endian : Bool
variables : Array[MatVariable]
} derive(Debug)fn MatDocument::convert_storage(self : MatDocument, name : String, sparse : Bool, limits? : Limits) -> Array[MatVariable] raise MatErrorfn MatDocument::select(self : MatDocument, names : Array[String]) -> Array[MatVariable] raise MatErrorpub(all) struct MatFile {
description : String
little_endian : Bool
arrays : Array[NumericArray]
} derive(Debug)pub(all) enum MatNode {
Numeric(NumericArray)
Csc(SparseArray)
Character(CharArray)
Cell(CellArray)
Structure(StructArray)
} derive(Debug)fn NumericArray::gather_axis(self : NumericArray, axis : Int, indices : Array[Int], limits? : Limits) -> NumericArray raise MatErrorfn NumericArray::permute_axes(self : NumericArray, axes : Array[Int], limits? : Limits) -> NumericArray raise MatErrorfn NumericArray::reshape(self : NumericArray, shape : Array[Int], limits? : Limits) -> NumericArray raise MatErrorfn NumericArray::slice(self : NumericArray, starts : Array[Int], counts : Array[Int], steps? : Array[Int], limits? : Limits) -> NumericArray raise MatErrorpub(all) struct VariableDifference {
name : String
status : String
metadata : Array[String]
real_differences : Int
imag_differences : Int
samples : Array[DifferenceSample]
truncated : Bool
} derive(Debug)fn compare_documents(left : MatDocument, right : MatDocument, max_samples? : Int, limits? : Limits) -> DocumentDifference raise MatErrorfn concat_arrays(name : String, arrays : Array[NumericArray], axis : Int, limits? : Limits) -> NumericArray raise MatErrorfn inspect_roots(bytes : Bytes, limits? : Limits, tree_limits? : TreeLimits) -> Array[MatRootInfo] raise MatErrorfn raw_array(name : String, dtype : DType, shape : Array[Int], real : Bytes, imag? : Bytes, is_global? : Bool, limits? : Limits) -> NumericArray raise MatErrorfn read_selected(bytes : Bytes, names : Array[String], limits? : Limits, tree_limits? : TreeLimits) -> MatTree raise MatErrorfn version() -> Stringfn write_document(arrays : Array[MatVariable], compressed? : Bool, limits? : Limits) -> Bytes raise MatErrorfn write_mat(arrays : Array[NumericArray], compressed? : Bool, limits? : Limits) -> Bytes raise MatErrorInstall
Download zipNative MoonBit recursive MAT Level 5 reader, writer and scientific data bridge