Crates.io | triangle_matrix |
lib.rs | triangle_matrix |
version | 0.4.0 |
source | src |
created_at | 2024-05-22 13:33:44.25349 |
updated_at | 2024-06-03 06:12:40.611333 |
description | Triangle matrix indexing operations |
homepage | |
repository | https://github.com/cedtwo/triangle_matrix.git |
max_upload_size | |
id | 1247940 |
size | 55,688 |
Upper and lower triangle matrix indexing operations.
Provides indexing operations for one dimensional collections using
Index<usize>
. Requires implementing [Triangle
] for any Index<usize>
type, and optionally [TriangleMut
] for any IndexMut<usize>
type.
Usage requires delegation to the collection, and the axis length, 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
}
}
For all types, the indices i
and j
refer to rows and columns respectively.
The indices of a diagonal element (i == j
) are out of bounds for all types.
SimpleUpperTri
], [SimpleUpperTriMut
])Indexing operations for an upper triangle matrix with no diagonal elements.
Allows getting the element or one dimensional index for any i
and j
indices
where i < j
. Does not allow indexing into rows or columns outside of the
triangle.
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
])Indexing operations for a symmetric upper triangle matrix with no diagonal
elements. Allows getting the element or one dimensional index for any i
and
j
indices where any pair of (i, j)
indices is equal to the pair, (j, i)
.
Does not allow indexing into rows or columns outside of the triangle.
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
])Indexing operations for a lower triangle matrix with no diagonal elements.
Allows getting the element or one dimensional index for any i
and j
indices
where j < i
. Does not allow indexing into rows or columns outside of the
triangle.
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
])Indexing operations for a symmetric lower triangle matrix with no diagonal
elements. Allows getting the element or one dimensional index for any i
and
j
indices where any pair of (i, j)
indices is equal to the pair, (j, i)
.
Does not allow indexing into rows or columns outside of the triangle.
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);