Skip to content

numeris

A mostly self-contained numerical algorithms library with minimal external dependencies.

numeris is suitable for use on embedded microprocessors with no operating system or heap allocation (no-std), while still taking advantage of SIMD instructions to be highly performant on more capable hardware. The same code compiles and runs correctly in both environments.

Numeris API reference is here

Alpha software

APIs are unstable and may change without notice before 1.0.

Feature Highlights

Area What's included
Matrix Stack-allocated Matrix<T, M, N> with const-generic dimensions; DynMatrix<T> for runtime sizes
Linear Algebra LU, Cholesky, QR, SVD, symmetric eigendecomposition, real Schur decomposition
ODE Fixed-step RK4 + 7 adaptive Runge-Kutta solvers + RODAS4 stiff solver
Optimization Brent, Newton, BFGS, Gauss-Newton, Levenberg-Marquardt
State Estimation EKF, UKF, SR-UKF, CKF, RTS smoother, batch least-squares
Interpolation Linear, Hermite, Lagrange, cubic spline, bilinear
Special Functions gamma, lgamma, digamma, beta, betainc, incomplete gamma, erf
Statistics 10 distributions (Normal, Gamma, Beta, Student's t, Poisson, …)
Digital Control Butterworth/Chebyshev IIR filters, PID controller
Quaternion Unit quaternion rotations, SLERP, Euler angles, rotation matrices
SIMD NEON (aarch64), SSE2/AVX/AVX-512 (x86_64) — always-on, no feature flag

Quick Start

Add to Cargo.toml:

[dependencies]
numeris = "0.2"
use numeris::{Matrix, Vector};

// Solve Ax = b
let a = Matrix::new([
    [2.0_f64, 1.0, -1.0],
    [-3.0, -1.0,  2.0],
    [-2.0,  1.0,  2.0],
]);
let b = Vector::from_array([8.0, -11.0, -3.0]);
let x = a.solve(&b).unwrap(); // x = [2, 3, -1]

// Cholesky decomposition
let spd = Matrix::new([[4.0_f64, 2.0], [2.0, 3.0]]);
let inv = spd.cholesky().unwrap().inverse();

// Symmetric eigendecomposition
let sym = Matrix::new([[4.0_f64, 1.0], [1.0, 3.0]]);
let eig = sym.eig_symmetric().unwrap();
let vals = eig.eigenvalues();   // sorted ascending
let vecs = eig.eigenvectors();  // columns = eigenvectors

// Quaternion rotation
use numeris::Quaternion;
let q = Quaternion::from_axis_angle(
    &Vector::from_array([0.0, 0.0, 1.0]),
    std::f64::consts::FRAC_PI_2,
);
let v = Vector::from_array([1.0, 0.0, 0.0]);
let rotated = q * v; // ≈ [0, 1, 0]
  • Getting Started — installation, feature flags, first examples
  • Module docs — detailed pages for each module (use the top tabs)
  • Performance — SIMD tiers, benchmark numbers vs. nalgebra and faer
  • No-std / Embedded — usage without std or heap allocation
  • Design — architectural decisions and trait hierarchy
  • API Reference ↗ — full rustdoc on docs.rs