#triangle #matrix #index

triangle_matrix

三角形矩阵索引操作

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数据结构

MIT/Apache

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

三角形矩阵类型

对于所有类型,索引 ij 分别表示行和列。对角线元素的索引(i == j)对于所有类型都是越界的。

简单上三角矩阵(SimpleUpperTriSimpleUpperTriMut

为没有对角线的上三角矩阵提供的索引操作。允许获取任何 ij 索引处的元素或一维索引,其中 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);

对称上三角矩阵(SymmetricUpperTriSymmetricUpperTriMut

为没有对角线的对称上三角矩阵提供的索引操作。允许获取任何 ij 索引处的元素或一维索引,其中任何一对 (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)

无对角线元素的下三角矩阵的索引操作。允许获取任何ij索引的元素或一维索引,其中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)

无对角线元素的对称下三角矩阵的索引操作。允许获取任何ij索引的元素或一维索引,其中任一对(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);

无运行时依赖