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 中使用
13KB
vecrtix
本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
列的矩阵。此类型由一个数组数组支持。数据按列主序存储。还提供了某些方便的别名,用于常见的矩阵,如向量。
Matrix<T, M, N>
→ 具有M行和N列的泛型矩阵类型。Vector<T, M>
→ 具有M行的列向量。RowVector<T, N>
→ 具有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]);
构造函数
以下列出了常用的构造函数。
::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]);
调试
调试实现将向量打印为列表,矩阵按照列主序打印为列表的列表。
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);
许可证
根据以下之一授权
- Apache License, Version 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- 麻省理工学院许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
根据您的选择。
依赖项
~1.5MB
~36K SLoC