Matamorph
A Rust library for seamless conversions between popular matrix libraries: ndarray, nalgebra, faer, and mdarray.
Features
The crate provides three types of conversions:
- Owned conversions : Create a new matrix with copied data
- Immutable reference conversions : Zero-copy read-only views
- Mutable reference conversions : Zero-copy read-write views
Usage
Add this to your Cargo.toml (for conversion between ndarray and faer):
[]
= { = "https://gitlab.com/starcluster/matamorph", = ["with-ndarray", "with-faer"]}
Example
Basic usage
use MataConvertOwn;
use MataConvertRef;
use MataConvertMut;
// Owned conversion (copies data): ndarray → nalgebra
let a = array!;
let b = a.to_nalgebra;
assert_eq!;
// Reference conversion (zero-copy): mdarray → faer
let c = tensor!;
let d = c.view.to_faer;
assert_eq!;
// Mutable reference conversion (zero-copy): ndarray → faer
let mut e = array!;
let mut f = e.view_mut.to_faer;
f = 0.0;
assert_eq!; // Original is modified
Memory Layout Considerations (nalgebra)
use MataConvertRef;
// ⚠️ Warning: conversions to nalgebra from row-major references are transposed!
let g = array!;
let h = g.view.to_nalgebra;
assert_eq!; // h is transposed: h[(row, col)] = g[(col, row)]
// But conversions FROM nalgebra preserve layout (no transposition)
let i = dmatrix!;
let i_view = i.view;
let j = i_view.to_ndarray;
assert_eq!; // No transposition
assert_eq!; // Same element accessed
// Similarly, conversions between column-major crates (faer ↔ nalgebra) preserve layout
let k = mat!;
let l = k.as_ref.to_nalgebra;
assert_eq!; // No transposition
assert_eq!; // Same element accessed
License
MIT OR Apache-2.0