4 releases

new 0.1.0-rc.1 Jan 31, 2026
0.1.0-beta.1 Jan 27, 2026
0.1.0-alpha.2 Dec 22, 2025
0.1.0-alpha.1 Sep 29, 2025

#162 in Math

Download history 43/week @ 2025-10-11 40/week @ 2025-10-18 15/week @ 2025-10-25 4/week @ 2025-11-01 8/week @ 2025-11-08 8/week @ 2025-11-15 9/week @ 2025-11-22 7/week @ 2025-11-29 8/week @ 2025-12-06 7/week @ 2025-12-13 12/week @ 2025-12-20 11/week @ 2025-12-27 27/week @ 2026-01-03 2/week @ 2026-01-10 16/week @ 2026-01-17 33/week @ 2026-01-24

87 downloads per month
Used in 18 crates (8 directly)

MIT/Apache

5MB
103K SLoC

torsh-linalg

Linear algebra operations for ToRSh, leveraging scirs2-linalg for optimized implementations.

Overview

This crate provides comprehensive linear algebra functionality by wrapping scirs2-linalg with a PyTorch-compatible API:

  • Matrix Operations: Multiplication, decompositions, solving
  • Eigenvalue Problems: Eigenvalues, eigenvectors, SVD
  • Matrix Functions: Inverse, determinant, trace, norms
  • Specialized Solvers: Linear systems, least squares, Cholesky
  • Tensor Operations: Einstein summation, tensor contractions

Usage

Basic Matrix Operations

use torsh_linalg::prelude::*;
use torsh_tensor::prelude::*;

// Matrix multiplication
let a = randn(&[10, 20]);
let b = randn(&[20, 30]);
let c = linalg::matmul(&a, &b)?;

// Batch matrix multiplication
let batch_a = randn(&[32, 10, 20]);
let batch_b = randn(&[32, 20, 30]);
let batch_c = linalg::bmm(&batch_a, &batch_b)?;

// Matrix-vector multiplication
let matrix = randn(&[10, 20]);
let vector = randn(&[20]);
let result = linalg::mv(&matrix, &vector)?;

Decompositions

// LU decomposition
let (lu, pivots) = linalg::lu(&matrix)?;
let (p, l, u) = linalg::lu_factor(&matrix)?;

// QR decomposition
let (q, r) = linalg::qr(&matrix)?;

// Cholesky decomposition (for positive definite matrices)
let l = linalg::cholesky(&pos_def_matrix)?;

// Eigenvalue decomposition
let (eigenvalues, eigenvectors) = linalg::eig(&square_matrix)?;

// Singular Value Decomposition (SVD)
let (u, s, v) = linalg::svd(&matrix)?;
let (u_reduced, s_reduced, v_reduced) = linalg::svd(&matrix, false)?; // reduced SVD

Solving Linear Systems

// Solve Ax = b
let a = randn(&[10, 10]);
let b = randn(&[10, 5]);
let x = linalg::solve(&a, &b)?;

// Solve triangular system
let lower = linalg::tril(&a);
let x = linalg::solve_triangular(&lower, &b, true, false)?;

// Least squares solution
let a = randn(&[20, 10]); // overdetermined
let b = randn(&[20]);
let x = linalg::lstsq(&a, &b)?;

// Solve with Cholesky (for positive definite systems)
let x = linalg::cholesky_solve(&pos_def_matrix, &b)?;

Matrix Properties

// Determinant
let det = linalg::det(&square_matrix)?;

// Inverse
let inv = linalg::inv(&square_matrix)?;
let pinv = linalg::pinv(&matrix)?; // pseudo-inverse

// Matrix norms
let frobenius = linalg::norm(&matrix, "fro")?;
let nuclear = linalg::norm(&matrix, "nuc")?;
let spectral = linalg::norm(&matrix, 2)?;

// Condition number
let cond = linalg::cond(&matrix, None)?;

// Rank
let rank = linalg::matrix_rank(&matrix, None)?;

// Trace
let trace = linalg::trace(&square_matrix)?;

Advanced Operations

// Einstein summation
let result = linalg::einsum("ij,jk->ik", &[&a, &b])?;
let batch_result = linalg::einsum("bij,bjk->bik", &[&batch_a, &batch_b])?;

// Kronecker product
let kron = linalg::kron(&a, &b)?;

// Matrix exponential
let exp_matrix = linalg::matrix_exp(&square_matrix)?;

// Matrix power
let matrix_squared = linalg::matrix_power(&square_matrix, 2)?;
let matrix_sqrt = linalg::matrix_power(&pos_def_matrix, 0.5)?;

Special Matrix Constructors

// Identity matrix
let eye = linalg::eye(10, None, None)?;

// Diagonal matrix
let diag_vals = tensor![1.0, 2.0, 3.0, 4.0];
let diag_matrix = linalg::diag(&diag_vals)?;

// Extract diagonal
let diagonal = linalg::diag(&matrix)?;

// Vandermonde matrix
let x = tensor![1.0, 2.0, 3.0, 4.0];
let vander = linalg::vander(&x, None, true)?;

Batch Operations

All operations support batched inputs:

// Batch inverse
let batch_matrices = randn(&[32, 10, 10]);
let batch_inv = linalg::inv(&batch_matrices)?;

// Batch solve
let batch_a = randn(&[32, 10, 10]);
let batch_b = randn(&[32, 10, 5]);
let batch_x = linalg::solve(&batch_a, &batch_b)?;

// Batch eigenvalues
let batch_eigenvalues = linalg::eigvals(&batch_matrices)?;

Performance Considerations

This crate leverages scirs2-linalg which uses:

  • Optimized BLAS/LAPACK implementations
  • Multi-threading for large operations
  • GPU acceleration when available
  • Efficient memory layouts

Integration with SciRS2

All operations are implemented via scirs2-linalg, ensuring:

  • Consistent numerical behavior
  • Optimized performance
  • Hardware acceleration support
  • Compatibility with the scirs2 ecosystem

License

Licensed under either of

at your option.

Dependencies

~55MB
~1M SLoC