8个版本 (5个稳定版)
2.2.1 | 2023年12月3日 |
---|---|
2.1.1 | 2021年12月11日 |
2.0.0 | 2021年4月30日 |
1.0.4 | 2021年3月1日 |
0.1.2 | 2020年12月13日 |
#168 in 数据结构
每月52次下载
110KB
2K SLoC
Simple Grid
我注意到我在许多个人项目中反复实现了相同的2D网格结构,所以我决定将其做成一个库。此数据结构并不试图成为最快的或最好的2D网格实现,但它使用简单且没有依赖。
示例用法
创建网格并访问其单元格
use simple_grid::Grid;
let grid = Grid::new(10, 10, (1..=100).collect::<Vec<u32>>());
assert_eq!(grid.get((5, 2)).unwrap(), &26);
println!("{}", grid.to_pretty_string());
// prints:
// 1 2 3 4 5 6 7 8 9 10
// 11 12 13 14 15 16 17 18 19 20
// 21 22 23 24 25 26 27 28 29 30
// 31 32 33 34 35 36 37 38 39 40
// 41 42 43 44 45 46 47 48 49 50
// 51 52 53 54 55 56 57 58 59 60
// 61 62 63 64 65 66 67 68 69 70
// 71 72 73 74 75 76 77 78 79 80
// 81 82 83 84 85 86 87 88 89 90
// 91 92 93 94 95 96 97 98 99 100
遍历单元格
let grid = Grid::new(10, 10, (1..=100).collect::<Vec<u32>>());
let elements_in_row_3: Vec<u32> = grid.row_iter(3).copied().collect();
assert_eq!(
elements_in_row_3,
vec![31, 32, 33, 34, 35, 36, 37, 38, 39, 40]
);
let elements_in_column_7: Vec<u32> = grid.column_iter(7).copied().collect();
assert_eq!(
elements_in_column_7,
vec![8, 18, 28, 38, 48, 58, 68, 78, 88, 98]
);
修改内容
let mut grid = Grid::new(10, 10, (1..=100).collect::<Vec<u32>>());
// get a mutable reference to a cell
*grid.get_mut((8, 2)).unwrap() = 1000;
assert_eq!(grid.get((8, 2)).unwrap(), &1000);
// can also access directly via the index operator
grid[(5,5)] = 1001;
assert_eq!(grid.get((5, 5)).unwrap(), &1001);
序列化/反序列化
此功能仅在启用serde
功能时可用。
线性代数
linalg
功能包括一些对线性代数有用的方法
算术运算
let grid1 = Grid::new(2, 2, vec![1, 2, 3, 4]);
let grid2 = Grid::new(2, 2, vec![1, 0, 1, 0]);
let sum = grid1 + grid2;
assert_eq!(sum, Grid::new(2, 2, vec![2, 2, 4, 4]));
逆、转置等。
let grid = Grid::new(3, 3, vec![3., 0., 2., 2., 0., -2., 0., 1., 1.]);
let inverse = grid.inverse().unwrap();
for (actual, expected) in inverse
.cell_iter()
.zip(Grid::new(3, 3, vec![0.2, 0.2, 0., -0.2, 0.3, 1.0, 0.2, -0.3, 0.]).cell_iter())
{
let diff = actual - expected;
assert!(diff < 0.000001);
}
高斯消元法
以解决以下系统
2x+y-z= 8
-3x-y+2z= -11
-2x+y+2z= -3
// the equation system represented as a Grid where the rightmost column is the right side of the equal signs
let mut grid = Grid::new(
4,
3,
vec![2., 1., -1., 8., -3., -1., 2., -11., -2., 1., 2., -3.],
);
let solution = grid.gaussian_elimination();
assert_eq!(solution.unwrap_single_solution(), vec![2., 3., -1.]))
给出解 x = 2, y = 3, z = -1
依赖关系
~205KB