5个不稳定版本

0.3.0 2022年11月13日
0.2.0 2021年12月6日
0.1.2 2021年2月2日
0.1.1 2021年1月17日
0.1.0 2021年1月15日

#30 in #stack-allocated


2 crate 中使用

MIT/Apache

13KB

vecrtix

Crates.io Version Docs.rs Latest Build Status

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

🚀 开始使用

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

cargo add vectrix

通过禁用默认的std功能,也支持no_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 是一个具有 2 行和 3 列的 Matrix<_, 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]);

调试

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

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]]

显示

显示实现将以传统的方括号格式打印矩阵。支持精度以及大多数其他格式化特性,如 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);

许可证

根据以下之一授权

根据您的选择。

依赖项

~1.5MB
~36K SLoC