9 个不稳定版本 (3 个破坏性更新)
0.4.0 | 2024年6月3日 |
---|---|
0.3.0 | 2024年5月29日 |
0.2.4 | 2024年5月28日 |
0.1.1 | 2024年5月23日 |
#636 在 数据结构
56KB
1K SLoC
triangle_matrix
三角形矩阵类型。提供使用 Index<usize>
为一维集合提供索引操作的索引操作。要求为任何 Index<usize>
类型实现 Triangle
,并为任何 IndexMut<usize>
类型可选实现 TriangleMut
。使用要求委托给集合,以及轴长度,n
。
use crate::triangle_matrix::{Triangle, TriangleMut};
// A vector represented as a triangle matrix.
struct TriVec(usize, Vec<usize>);
impl Triangle for TriVec {
type Inner = Vec<usize>;
fn n(&self) -> usize {
self.0
}
fn inner(&self) -> &Self::Inner {
&self.1
}
}
impl TriangleMut for TriVec {
fn inner_mut(&mut self) -> &mut Self::Inner {
&mut self.1
}
}
三角形矩阵类型
对于所有类型,索引 i
和 j
分别表示行和列。对角线元素的索引(i == j
)对于所有类型都是越界的。
简单上三角矩阵(SimpleUpperTri
,SimpleUpperTriMut
)
为没有对角线的上三角矩阵提供的索引操作。允许获取任何 i
和 j
索引处的元素或一维索引,其中 i < j
。不允许对三角形之外的行或列进行索引。
use crate::triangle_matrix::SimpleUpperTri;
let n = 5;
let m = TriVec(n, Vec::from_iter(0..tri_num(n - 1)));
// Get the elements of rows 0..4.
assert_eq!(m.get_row(0).cloned().collect::<Vec<_>>(), [ 0, 1, 2, 3]);
assert_eq!(m.get_row(1).cloned().collect::<Vec<_>>(), [ 4, 5, 6]);
assert_eq!(m.get_row(2).cloned().collect::<Vec<_>>(), [ 7, 8]);
assert_eq!(m.get_row(3).cloned().collect::<Vec<_>>(), [ 9]);
assert_eq!(m.get_col_indices(2).collect::<Vec<_>>(), [1, 4]);
assert_eq!(m.get_col_indices(4).collect::<Vec<_>>(), [3, 6, 8, 9]);
assert_eq!(*m.get_element(0, 3), 2);
assert_eq!(*m.get_element(1, 3), 5);
assert_eq!(*m.get_element(2, 3), 7);
对称上三角矩阵(SymmetricUpperTri
,SymmetricUpperTriMut
)
为没有对角线的对称上三角矩阵提供的索引操作。允许获取任何 i
和 j
索引处的元素或一维索引,其中任何一对 (i, j)
索引都等于这对,(j, i)
。不允许对三角形之外的行或列进行索引。
use crate::triangle_matrix::SymmetricUpperTri;
let n = 5;
let m = TriVec(n, Vec::from_iter(0..tri_num(n - 1)));
// Get the elements of rows 0..5.
assert_eq!(m.get_row(0).cloned().collect::<Vec<_>>(), [ 0, 1, 2, 3]);
assert_eq!(m.get_row(1).cloned().collect::<Vec<_>>(), [0, 4, 5, 6]);
assert_eq!(m.get_row(2).cloned().collect::<Vec<_>>(), [1, 4, 7, 8]);
assert_eq!(m.get_row(3).cloned().collect::<Vec<_>>(), [2, 5, 7, 9]);
assert_eq!(m.get_row(4).cloned().collect::<Vec<_>>(), [3, 6, 8, 9 ]);
assert_eq!(m.get_col_indices(2).collect::<Vec<_>>(), [1, 4, 7, 8]);
assert_eq!(m.get_col_indices(4).collect::<Vec<_>>(), [3, 6, 8, 9 ]);
assert_eq!(*m.get_element(0, 3), 2);
assert_eq!(*m.get_element(3, 1), 5);
assert_eq!(*m.get_element(3, 2), 7);
简单下三角矩阵 (SimpleLowerTri
, SimpleLowerTriMut
)
无对角线元素的下三角矩阵的索引操作。允许获取任何i
和j
索引的元素或一维索引,其中j < i
。不允许对三角形外的行或列进行索引。
use crate::triangle_matrix::SimpleLowerTri;
let n = 5;
let m = TriVec(n, Vec::from_iter(0..tri_num(n - 1)));
// Get the elements of rows 1..4.
assert_eq!(m.get_row(1).cloned().collect::<Vec<_>>(), [0 ]);
assert_eq!(m.get_row(2).cloned().collect::<Vec<_>>(), [1, 2 ]);
assert_eq!(m.get_row(3).cloned().collect::<Vec<_>>(), [3, 4, 5 ]);
assert_eq!(m.get_row(4).cloned().collect::<Vec<_>>(), [6, 7, 8, 9 ]);
assert_eq!(m.get_col_indices(1).collect::<Vec<_>>(), [2, 4, 7]);
assert_eq!(m.get_col_indices(3).collect::<Vec<_>>(), [9]);
assert_eq!(*m.get_element(2, 1), 2);
assert_eq!(*m.get_element(3, 1), 4);
assert_eq!(*m.get_element(4, 1), 7);
对称下三角矩阵 (SymmetricLowerTri
, SymmetricLowerTriMut
)
无对角线元素的对称下三角矩阵的索引操作。允许获取任何i
和j
索引的元素或一维索引,其中任一对(i, j)
索引与另一对,(j, i)
索引相等。不允许对三角形外的行或列进行索引。
use crate::triangle_matrix::SymmetricLowerTri;
let n = 5;
let m = TriVec(n, Vec::from_iter(0..tri_num(n - 1)));
// Get the elements of rows 0..5.
assert_eq!(m.get_row(0).cloned().collect::<Vec<_>>(), [ 0, 1, 3, 6]);
assert_eq!(m.get_row(1).cloned().collect::<Vec<_>>(), [0, 2, 4, 7]);
assert_eq!(m.get_row(2).cloned().collect::<Vec<_>>(), [1, 2, 5, 8]);
assert_eq!(m.get_row(3).cloned().collect::<Vec<_>>(), [3, 4, 5, 9]);
assert_eq!(m.get_row(4).cloned().collect::<Vec<_>>(), [6, 7, 8, 9 ]);
assert_eq!(m.get_col_indices(2).collect::<Vec<_>>(), [1, 2, 5, 8]);
assert_eq!(m.get_col_indices(4).collect::<Vec<_>>(), [6, 7, 8, 9 ]);
assert_eq!(*m.get_element(0, 3), 3);
assert_eq!(*m.get_element(3, 1), 4);
assert_eq!(*m.get_element(3, 2), 5);