#matrix #matrix-vector #vector #robotics #linear-algebra

无需std stack-algebra

适用于裸机应用的堆栈分配轻量级代数库

1个不稳定版本

0.1.0 2022年12月30日

#1015 in 数学

MIT/Apache

82KB
1.5K SLoC

stack-algebra

一个用于裸机应用的堆栈分配轻量级代数库。

概述

此包提供了一种编译时确定大小的堆栈分配矩阵类型。此库的主要目标是用于在Rust中构建机器人应用。这意味着几个方面

  1. 目标平台通常是裸机
  2. 矩阵的大小通常可以在编译时定义
  3. 问题解决不需要大矩阵或重型优化
  4. 用户不是Rust专家,但通常熟悉科学工具(例如Python或MATLAB)

如果提供简单的抽象和必要的代数例程,则可以在Rust中实现数值算法,使其更加高效和直观。此库是一个不断增长的集合,旨在满足这些需求。它主要基于vectrix的核心实现。

安装

使用cargo将此库添加到您的项目中(或手动添加到您的Cargo.toml

cargo add stack-algebra

然后通过以下方式导入到您的模块中

use stack_algebra::*; // or import just the items you need

用法

  • 可以使用matrix!宏创建新矩阵

    // 2-by-3 matrix 
    let m = matrix![
        1.0, 2.0, 3.0;
        4.0, 5.0, 6.0; // Semicolon here is optional
    ]; 
    
  • 可以使用vector!宏创建行/列向量

    // 1-by-3 row vector
    let r = vector![1.0, 2.0, 3.0]; 
    
    // 3-by-1 column vector
    let c = vector![1.0; 2.0; 3.0]; 
    
    // Vector to tuple conversion (for 3 or 4 element vectors)
    let (x, y, z) = r.into();
    
  • 使用eye!创建方阵单位矩阵

    let m = eye!(2); 
    let exp = matrix![
      1.0, 0.0;
      0.0, 1.0
    ];
    assert_eq!(m, exp);
    
  • 使用zeros!创建零值矩阵

    let m = zeros!(2); // Square 2-by-2 matrix
    let exp = matrix![
      0.0, 0.0;
      0.0, 0.0
    ];
    assert_eq!(m, exp);
    
    let m = zeros!(2,3); // 2-by-3 matrix
    let exp = matrix![
      0.0, 0.0, 0.0;
      0.0, 0.0, 0.0
    ];
    assert_eq!(m, exp);
    
  • 使用ones!创建包含1.0的矩阵(与zeros!用法相同)

  • 使用diag!创建给定条目的对角矩阵(大小最多为6x6)

    let m = diag!(1.0, 2.0, 3.0);
    let exp = matrix![
      1.0, 0.0, 0.0;
      0.0, 2.0, 0.0;
      0.0, 0.0, 3.0
    ];
    assert_eq!(m, exp);
    
  • 使用[i][(r,c)]访问单个元素

    let m = matrix![
        1.0, 2.0, 3.0;
        4.0, 5.0, 6.0
    ]; 
    
    assert_eq!(m[1], 4.0); // Using a single index assumes column-major order
    assert_eq!(m[(1,2)], 6.0);
    
  • 使用*/+-进行矩阵算术运算

    let m = matrix![
        1.0, 2.0;
        3.0, 4.0
    ];
    
    let exp = matrix![
        2.0, 4.0;
        6.0, 8.0
    ];
    
    assert_eq!(m + m, exp); // Add matrices
    
    let exp = matrix![
        2.0, 3.0;
        4.0, 5.0
    ];
    
    assert_eq!(m + 1.0, exp); // Add scalar to matrix (note scalar has to be behind the operator)
    
  • 使用.T()进行矩阵转置

    let m = matrix![
        1.0, 2.0;
        3.0, 4.0
    ];
    
    let exp = matrix![
        1.0, 3.0;
        2.0, 4.0
    ];
    
    assert_eq!(m.T(), exp); 
    
    
  • .norm() 用于计算 Frobenius 范数

      let m = matrix![
        1.0,-2.0;
       -3.0, 6.0;
      ];
      assert_relative_eq!(m.norm(), 7.0710678, max_relative = 1e-6);
    
  • .trace() 用于计算方阵对角线元素之和

      let m = matrix![
        9.0, 8.0, 7.0;
        6.0, 5.0, 4.0;
        3.0, 2.0, 1.0;
      ];
      assert_eq!(m.trace(), 15.0);
    
  • .det() 用于计算行列式(仅适用于方阵)

      let m = matrix![
        3.0, 7.0;
        1.0, -4.0;
      ];
      assert_eq!(m.det(), -19.0); 
    
  • .inv() 用于计算矩阵的逆(适用于可逆方阵)

      let m = matrix![
        6.0, 2.0, 3.0;
        1.0, 1.0, 1.0;
        0.0, 4.0, 9.0;
      ];
      let exp = matrix![
        0.20833333, -0.25, -0.04166667;
            -0.375,  2.25,      -0.125;
        0.16666667,  -1.0,  0.16666667;
      ];
      assert_relative_eq!(m.inv().unwrap(), exp, max_relative = 1e-6);
    

许可证

本项目根据 MIT 许可证和 Apache 许可证(版本 2.0)的条款进行分发。

有关详细信息,请参阅 LICENSE-APACHELICENSE-MIT

依赖项

约 2MB
约 47K SLoC