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 下载
110KB
2K SLoC
vectrix
此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
列的矩阵。此类型由数组数组支持。数据以列主序存储。还提供了一些方便的别名,用于常见的矩阵,如向量。
Matrix<T, M, N>
→ 一个具有M
行和N
列的泛型矩阵类型。Vector<T, M>
→ 一个有M
行的列向量。RowVector<T, N>
→ 一个有N
列的行向量。
宏
提供宏以方便构建提供的类型。这些宏也可以在const
上下文中使用。
-
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]);
构造函数
以下列出了常用的构造函数。
::zero()
→ 构造一个新的矩阵,填充T::zero()
。::identity()
→ 构造一个新的单位矩阵。::repeat(..)
→ 构造一个新的矩阵,填充提供的值。::repeat_with(..)
→ 构造一个新的矩阵,填充由提供的闭包计算出的值。::from_iter(..)
→ 从迭代器构造一个新的矩阵。::new(..)
→ 使用提供的组件构造一个新的向量。
访问元素
提供了三种元素访问方式。
-
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()
→ 返回一个遍历每个元素可变引用的迭代器。
以下方法提供了对行和列的迭代。
.iter_rows()
→ 返回一个遍历每行星引用的迭代器。.iter_rows_mut()
→ 返回一个遍历每行星可变引用的迭代器。.iter_columns()
→ 返回一个遍历每列引用的迭代器。.iter_columns_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);
许可证
许可以下之一
- Apache License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
依赖项
~215KB