#矩阵向量 #线性代数 #矩阵 #向量 #行列

无需std vectrix

使用const泛型实现的堆分配矩阵类型

6个版本

0.3.0 2022年11月13日
0.2.0 2021年12月6日
0.1.3 2021年3月27日
0.1.2 2021年2月2日
0.1.1 2021年1月17日

#450 in 数学

每月 40 下载

MIT/Apache

110KB
2K SLoC

vectrix

Crates.io Version Docs.rs Latest Build Status

此crate提供了一种使用const泛型实现的堆分配、固定大小的Matrix<T, M, N>类型。

🚀 入门指南

将此crate添加到您的Cargo清单中。

cargo add vectrix

no_std也通过禁用默认的std功能得到支持。

cargo add vectrix --no-default-features --features=macro

🤸 使用方法

类型

基本的Matrix<T, M, N>类型表示一个有M行和N列的矩阵。此类型由数组数组支持。数据以列主序存储。还提供了一些方便的别名,用于常见的矩阵,如向量。

提供宏以方便构建提供的类型。这些宏也可以在const上下文中使用。

  • 可以使用matrix!宏构建任何大小的新的Matrix

    let m = matrix![
        1, 3, 5;
        2, 4, 6;
    ];
    

    在上面的例子中,matrix 是一个 Matrix<_, 2, 3> 类型,有 2 行 3 列。

  • 可以使用 vector!row_vector! 宏分别构造列向量和行向量。

    let v = vector![1, 3, 3, 7];
    //  ^ type `Vector<_, 4>`
    assert_eq!(v, matrix![1; 3; 3; 7]);
    
    let v = row_vector![1, 3, 3, 7];
    //  ^^^^^^ type `RowVector<_, 4>`
    assert_eq!(v, matrix![1, 3, 3, 7]);
    

构造函数

以下列出了常用的构造函数。

访问元素

提供了三种元素访问方式。

  • usize 索引以列主序选择矩阵中的第 n 个元素。

    let m = matrix![
        1, 2, 3;
        4, 5, 6;
    ];
    assert_eq!(m[1], 4);
    
  • (usize, usize) 索引选择特定行和列位置的元素。

    let m = matrix![
        1, 2, 3;
        4, 5, 6;
    ];
    assert_eq!(m[(1, 0)], 4);
    
  • 对于小型向量,可以使用传统名称的组件访问器。

    let mut v = vector![1, 2, 3, 4, 0, 0];
    v.y = 3;
    v.w = 7;
    assert_eq!(v.x, 1);
    assert_eq!(v.y, 3);
    assert_eq!(v.z, 3);
    assert_eq!(v.w, 7);
    assert_eq!(v.a, 0);
    assert_eq!(v.b, 0);
    

访问行或列

您可以使用 .row().column() 方法获取特定行或列的引用。您可以使用 _mut 变体获取可变引用。

let mut m = matrix![
    1, 2, 3;
    4, 7, 6;
];
let row = m.row_mut(1);
row[1] = 5;
assert_eq!(m.column(1), &[2, 5]);

迭代

以下方法提供了逐元素、列主序的迭代。

  • .into_iter() → 消耗矩阵并返回每个元素的拥有迭代器。
  • .iter() → 返回一个遍历每个元素引用的迭代器。
  • .iter_mut() → 返回一个遍历每个元素可变引用的迭代器。

以下方法提供了对行和列的迭代。

切片表示

使用 .as_slice().as_mut_slice() 提供了底层数据的切片视图。

let mut m = matrix![
    1, 3, 5;
    2, 3, 6;
];
m.as_mut_slice()[3] = 4;
assert_eq!(m.as_slice(), &[1, 2, 3, 4, 5, 6]);

调试

Debug 实现将向量打印为列表,矩阵打印为按列主序的列表列表。

let v = vector![1.1, 2.0];
let m = matrix![1, 2; 3, 4];
println!("vector: {:.2?}", v);
println!("matrix: {:?}", m);

这将输出

vector: [1.10, 2.00]
matrix: [[1, 3], [2, 4]]

显示

Display 实现将矩阵按传统的方括号格式打印。支持精度以及大多数其他格式化特性,如 LowerHex

let cv = vector![1.1, 2.0];
let rv = row_vector![1.1, 2.0];
let m = matrix![1, 2; 3, 4];
println!("column vector: {:.2}", cv);
println!("row vector: {:.1}", rv);
println!("matrix: {:b}", m);

这将输出

column vector:
 ┌      ┐
 │ 1.10 │
 │ 2.00 │
 └      ┘

row vector:
 ┌          ┐
 │ 1.1  2.0 │
 └          ┘

matrix:
 ┌         ┐
 │  1   10 │
 │ 11  100 │
 └         ┘

操作

Matrix 实现了许多内置运算符。对于标量操作数,几乎所有的运算符都已实现,并且它们将操作应用于矩阵中的每个元素。一元运算符将执行等效操作。在以下示例中,矩阵中的每个元素都乘以 2。

let m = matrix![
    1, -3;
    3, -7;
];
let exp = matrix![
    2, -6;
    6, -14;
];
assert_eq!(m * 2, exp);

Matrix 支持具有相同大小的矩阵的加法和减法,用于逐元素加法和减法。在以下示例中,矩阵加到自身上。

let m = matrix![
    1, -3;
    3, -7;
];
let exp = matrix![
    2, -6;
    6, -14;
];
assert_eq!(m + m, exp);

许可证

许可以下之一

由您选择。

依赖项

~215KB