Skip to main content

Crate mdarray_linalg_nalgebra

Crate mdarray_linalg_nalgebra 

Source
Expand description

§mdarray_linalg_nalgebra

nalgebra backend for mdarray_linalg.

This crate provides the Nalgebra struct that implements the linear algebra traits defined by mdarray_linalg, delegating computations to the pure-Rust nalgebra library. Nalgebra is particularly efficient for small matrices thanks to its extensive use of compile-time dimension optimizations.

Backend implementation modules are private. Use Nalgebra together with the operation traits from mdarray_linalg::prelude::*.

§Scope

The Nalgebra backend covers:

  • Level 1 — vector operations: dot, dotc, norm2, norm1, add_to_scaled
  • Level 2 — matrix-vector & outer product: matvec, outer
  • Level 3 — matrix multiplication: matmul
  • Tensor contractioncontract_all, contract_n, contract_pairs, contract
  • Eigenvalue decompositioneig, eig_full, eig_values, eigh
  • Schur decompositionschur, schur_complex
  • SVDsvd, svd_thin, svd_s
  • LU decompositionlu, det, inv
  • Cholesky decompositioncholesky
  • QR decompositionqr
  • Linear system solvingsolve
  • Argmaxargmax, argmax_abs

§Setup

Add the dependencies to your project:

cargo add mdarray mdarray-linalg mdarray-linalg-nalgebra

§Example

All operations are accessed through the Nalgebra backend via the traits from mdarray_linalg::prelude::*:

use mdarray::array;
use mdarray_linalg::prelude::*;
use mdarray_linalg::eig::EigDecomp;
use mdarray_linalg::svd::SVDDecomp;
use mdarray_linalg_nalgebra::Nalgebra;

// ----- Matrix multiplication -----
let a = array![[1., 2.], [3., 4.]];
let b = array![[5., 6.], [7., 8.]];

let c = Nalgebra::default().matmul(&a, &b).eval();
assert_eq!(c, array![[19., 22.], [43., 50.]]);

// ----- Eigenvalue decomposition -----
let mut a = array![[1., 2.], [3., 4.]];
let EigDecomp {
    eigenvalues: lambda,
    right_eigenvectors,
    ..
} = Nalgebra::default().eig(&mut a.clone()).expect("Eigenvalue decomposition failed");

println!("Eigenvalues: {:?}", lambda);

// ----- SVD -----
let mut a = array![[1., 2.], [3., 4.]];
let SVDDecomp { s, u, vt } = Nalgebra::default().svd(&mut a).expect("SVD failed");
println!("Singular values: {:?}", s);

// ----- Argmax -----
let x = array![1., 5., 3., 8., 2.];
let idx = Nalgebra::default().argmax(&x).unwrap();
assert_eq!(idx, vec![3]);

// ----- Tensor contraction -----
let t1 = array![[1., 2.], [3., 4.]].into_dyn();
let t2 = array![[5., 6.], [7., 8.]].into_dyn();

let scalar = Nalgebra::default().contract_all(&t1, &t2);
assert_eq!(scalar, 70.0);

Note: Decomposition routines (eig, svd, lu, etc.) destroy the input matrix. Always pass a clone if you need the original data.

§Currently supported types

f32, f64, Complex<f32>, Complex<f64>.

Structs§

Nalgebra
Nalgebra backend.