Struct sparse_bin_mat::SparseBinMat [−][src]
pub struct SparseBinMat { /* fields omitted */ }Expand description
A sparse binary matrix optimized for row operations.
Implementations
Creates a new matrix with the given number of columns and list of rows .
A row is a list of the positions where the elements have value 1.
Example
let matrix = SparseBinMat::new(4, vec![vec![0, 1, 2], vec![0, 2, 3]]);
assert_eq!(matrix.number_of_rows(), 2);
assert_eq!(matrix.number_of_columns(), 4);
assert_eq!(matrix.number_of_elements(), 8);Panic
Panics if a position in a row is greater or equal the number of columns, a row is unsorted or a row contains duplicate.
Creates a new matrix with the given number of columns and list of rows or returns an error if a position in a row is greater or equal the number of columns, a row is unsorted or a row contains duplicate.
A row is a list of the positions where the elements have value 1. All rows are sorted during insertion.
Example
let first_matrix = SparseBinMat::try_new(4, vec![vec![0, 1, 2], vec![0, 2, 3]]);
let second_matrix = SparseBinMat::new(4, vec![vec![0, 1, 2], vec![0, 2, 3]]);
assert_eq!(first_matrix, Ok(second_matrix));Creates a new matrix with the given number of columns, capacity and list of rows.
A row is a list of the positions where the elements have value 1.
The capacity is used to pre-allocate enough memory to store that amount of 1s in the matrix. This is mostly useful in combination with inplace operations modifying the number of 1s in the matrix.
Example
let matrix = SparseBinMat::with_capacity(4, 7, vec![vec![0, 1, 2], vec![0, 2, 3]]);
assert_eq!(matrix.number_of_rows(), 2);
assert_eq!(matrix.number_of_columns(), 4);
assert_eq!(matrix.number_of_elements(), 8);
assert_eq!(matrix.capacity(), 7);Panic
Panics if a position in a row is greater or equal the number of columns, a row is unsorted or a row contains duplicate.
pub fn try_with_capacity(
number_of_columns: usize,
capacity: usize,
rows: Vec<Vec<usize>>
) -> Result<Self, InvalidPositions>
pub fn try_with_capacity(
number_of_columns: usize,
capacity: usize,
rows: Vec<Vec<usize>>
) -> Result<Self, InvalidPositions>
Creates a new matrix with the given number of columns, capacity and list of rows Returns an error if a position in a row is greater or equal the number of columns, a row is unsorted or a row contains duplicate.
A row is a list of the positions where the elements have value 1. All rows are sorted during insertion.
The capacity is used to pre-allocate enough memory to store that amount of 1s in the matrix. This is mostly useful in combination with inplace operations modifying the number of 1s in the matrix.
Example
let matrix = SparseBinMat::new(4, vec![vec![0, 1, 2], vec![0, 2, 3]]);
let try_matrix = SparseBinMat::try_with_capacity(4, 7, vec![vec![0, 1 ,2], vec![0, 2, 3]]);
assert_eq!(try_matrix, Ok(matrix));
assert_eq!(try_matrix.unwrap().capacity(), 7);Creates an identity matrix of the given length.
Example
let matrix = SparseBinMat::identity(5);
let identity_rows = (0..5).map(|x| vec![x]).collect();
let identity_matrix = SparseBinMat::new(5, identity_rows);
assert_eq!(matrix, identity_matrix);Creates a matrix fill with zeros of the given dimensions.
Example
let matrix = SparseBinMat::zeros(2, 3);
assert_eq!(matrix.number_of_rows(), 2);
assert_eq!(matrix.number_of_columns(), 3);
assert_eq!(matrix.number_of_zeros(), 6);
assert_eq!(matrix.number_of_ones(), 0);Creates an empty matrix.
This allocate minimally, so it is a good placeholder.
Example
let matrix = SparseBinMat::empty();
assert_eq!(matrix.number_of_rows(), 0);
assert_eq!(matrix.number_of_columns(), 0); assert_eq!(matrix.number_of_elements(), 0);
// Note that these are not equal since new preallocate some space
// to store the data.
assert_ne!(SparseBinMat::new(0, Vec::new()), SparseBinMat::empty());
// To test for emptyness, you should prefer the following.
assert!(matrix.is_empty());Returns the maximum number of 1s the matrix can store before reallocating.
Returns the number of columns in the matrix.
Returns the number of rows in the matrix
Returns the number of elements in the matrix.
Returns the number of elements with value 0 in the matrix.
Returns the number of elements with value 1 in the matrix.
Returns the value at the given row and column or None if one of the index is out of bound.
Example
let rows = vec![vec![0, 1], vec![1, 2]];
let matrix = SparseBinMat::new(3, rows);
assert_eq!(matrix.get(0, 0), Some(1.into()));
assert_eq!(matrix.get(1, 0), Some(0.into()));
assert_eq!(matrix.get(2, 0), None);Inserts the given value at the given row and column.
This operation is perform in place. That is, it take ownership of the matrix and returns an updated matrix using the same memory.
To avoid having to reallocate new memory,
it is reccommended to construct the matrix using
with_capacity
or
try_with_capacity.
Example
let mut matrix = SparseBinMat::with_capacity(3, 4, vec![vec![0], vec![1, 2]]);
// This doesn't change the matrix
matrix = matrix.emplace_at(1, 0, 0);
assert_eq!(matrix.number_of_ones(), 3);
// Add a 1 in the first row.
matrix = matrix.emplace_at(1, 0, 2);
let expected = SparseBinMat::new(3, vec![vec![0, 2], vec![1, 2]]);
assert_eq!(matrix, expected);
// Remove a 1 in the second row.
matrix = matrix.emplace_at(0, 1, 1);
let expected = SparseBinMat::new(3, vec![vec![0, 2], vec![2]]);
assert_eq!(matrix, expected);Panic
Panics if either the row or column is out of bound.
Returns true if the value at the given row and column is 0 or None if one of the index is out of bound.
Example
let rows = vec![vec![0, 1], vec![1, 2]];
let matrix = SparseBinMat::new(3, rows);
assert_eq!(matrix.is_zero_at(0, 0), Some(false));
assert_eq!(matrix.is_zero_at(1, 0), Some(true));
assert_eq!(matrix.is_zero_at(2, 0), None);Returns true if the value at the given row and column is 1 or None if one of the index is out of bound.
Example
let rows = vec![vec![0, 1], vec![1, 2]];
let matrix = SparseBinMat::new(3, rows);
assert_eq!(matrix.is_one_at(0, 0), Some(true));
assert_eq!(matrix.is_one_at(1, 0), Some(false));
assert_eq!(matrix.is_one_at(2, 0), None);Returns a reference to the given row of the matrix or None if the row index is out of bound.
Example
let rows = vec![vec![0, 1], vec![1, 2]];
let matrix = SparseBinMat::new(3, rows.clone());
assert_eq!(matrix.row(0), Some(SparseBinSlice::new(3, &rows[0])));
assert_eq!(matrix.row(1), Some(SparseBinSlice::new(3, &rows[1])));
assert_eq!(matrix.row(2), None);Returns an iterator yielding the rows of the matrix as slice of non zero positions.
Example
let rows = vec![vec![0, 1, 2, 5], vec![1, 3, 4], vec![2, 4, 5], vec![0, 5]];
let matrix = SparseBinMat::new(7, rows.clone());
let mut iter = matrix.rows();
assert_eq!(iter.next(), Some(SparseBinSlice::new(7, &rows[0])));
assert_eq!(iter.next(), Some(SparseBinSlice::new(7, &rows[1])));
assert_eq!(iter.next(), Some(SparseBinSlice::new(7, &rows[2])));
assert_eq!(iter.next(), Some(SparseBinSlice::new(7, &rows[3])));
assert_eq!(iter.next(), None);pub fn non_trivial_elements(&self) -> NonTrivialElements<'_>ⓘNotable traits for NonTrivialElements<'a>impl<'a> Iterator for NonTrivialElements<'a> type Item = (usize, usize);
pub fn non_trivial_elements(&self) -> NonTrivialElements<'_>ⓘNotable traits for NonTrivialElements<'a>impl<'a> Iterator for NonTrivialElements<'a> type Item = (usize, usize);
impl<'a> Iterator for NonTrivialElements<'a> type Item = (usize, usize);Returns an iterator yielding the positions of the non trivial elements.
Example
let rows = vec![vec![0, 2], vec![1], vec![0, 2], vec![1]];
let matrix = SparseBinMat::new(3, rows);
let mut iter = matrix.non_trivial_elements();
assert_eq!(iter.next(), Some((0, 0)));
assert_eq!(iter.next(), Some((0, 2)));
assert_eq!(iter.next(), Some((1, 1)));
assert_eq!(iter.next(), Some((2, 0)));
assert_eq!(iter.next(), Some((2, 2)));
assert_eq!(iter.next(), Some((3, 1)));
assert_eq!(iter.next(), None);Returns an iterator yielding the number of non zero elements in each row of the matrix.
Example
let rows = vec![vec![0, 1, 2, 5], vec![1, 3, 4], vec![2, 4, 5], vec![0, 5]];
let matrix = SparseBinMat::new(7, rows);
assert_eq!(matrix.row_weights().collect::<Vec<usize>>(), vec![4, 3, 3, 2]);Gets the transposed version of the matrix by swapping the columns with the rows.
Example
let rows = vec![vec![0, 1, 2], vec![1, 3], vec![0, 2, 3]];
let matrix = SparseBinMat::new(4, rows);
let transposed_matrix = matrix.transposed();
let expected_rows = vec![vec![0, 2], vec![0, 1], vec![0, 2], vec![1, 2]];
let expected_matrix = SparseBinMat::new(3, expected_rows);
assert_eq!(transposed_matrix, expected_matrix);Computes the rank of the matrix. That is, the number of linearly independent rows or columns.
Example
let rows = vec![vec![0, 1], vec![1, 2], vec![0, 2]];
let matrix = SparseBinMat::new(3, rows);
assert_eq!(matrix.rank(), 2);Returns an echeloned version of the matrix.
A matrix in echelon form as the property that no rows any given row have a 1 in the first non trivial position of that row. Also, all rows are linearly independent.
Example
let matrix = SparseBinMat::new(3, vec![vec![0, 1, 2], vec![0], vec![1, 2], vec![0, 2]]);
let expected = SparseBinMat::new(3, vec![vec![0, 1, 2], vec![1], vec![2]]);
assert_eq!(matrix.echelon_form(), expected);Returns a matrix for which the rows are the generators of the nullspace of the original matrix.
The nullspace of a matrix M is the set of vectors N such that Mx = 0 for all x in N. Therefore, if N is the nullspace matrix obtain from this function, we have that M * N^T = 0.
Example
let matrix = SparseBinMat::new(
6,
vec![vec![0, 1, 3, 5], vec![2, 3, 4], vec![2, 5], vec![0, 1, 3]],
);
let expected = SparseBinMat::new(6, vec![vec![0, 3, 4,], vec![0, 1]]);
let nullspace = matrix.nullspace();
assert_eq!(nullspace, expected);
assert_eq!(&matrix * &nullspace.transposed(), SparseBinMat::zeros(4, 2));Returns the horizontal concatenation of two matrices.
If the matrix have different number of rows, the smallest one is padded with empty rows.
Example
let left_matrix = SparseBinMat::new(3, vec![vec![0, 1], vec![1, 2]]);
let right_matrix = SparseBinMat::new(4, vec![vec![1, 2, 3], vec![0, 1], vec![2, 3]]);
let concatened = left_matrix.horizontal_concat_with(&right_matrix);
let expected = SparseBinMat::new(7, vec![vec![0, 1, 4, 5, 6], vec![1, 2, 3, 4], vec![5, 6]]);
assert_eq!(concatened, expected);Returns the vertical concatenation of two matrices.
If the matrix have different number of columns, the smallest one is padded with empty columns.
Example
let left_matrix = SparseBinMat::new(3, vec![vec![0, 1], vec![1, 2]]);
let right_matrix = SparseBinMat::identity(3);
let concatened = left_matrix.vertical_concat_with(&right_matrix);
let expected = SparseBinMat::new(3, vec![vec![0, 1], vec![1, 2], vec![0], vec![1], vec![2]]);
assert_eq!(concatened, expected);pub fn dot_with_vector<T>(
&self,
vector: &SparseBinVecBase<T>
) -> Result<SparseBinVec, MatVecIncompatibleDimensions> where
T: Deref<Target = [usize]>,
pub fn dot_with_vector<T>(
&self,
vector: &SparseBinVecBase<T>
) -> Result<SparseBinVec, MatVecIncompatibleDimensions> where
T: Deref<Target = [usize]>,
Returns the dot product between a matrix and a vector or an error if the number of columns in the matrix is not equal to the length of the vector.
Use the Mul (*) operator for a version that panics instead of
returning a Result.
Example
let matrix = SparseBinMat::new(3, vec![vec![0, 1], vec![1, 2]]);
let vector = SparseBinVec::new(3, vec![0, 1]);
let result = SparseBinVec::new(2, vec![1]);
assert_eq!(matrix.dot_with_vector(&vector), Ok(result));pub fn dot_with_matrix(
&self,
other: &Self
) -> Result<SparseBinMat, MatMatIncompatibleDimensions>
pub fn dot_with_matrix(
&self,
other: &Self
) -> Result<SparseBinMat, MatMatIncompatibleDimensions>
Returns the dot product between two matrices or an error if the number of columns in the first matrix is not equal to the number of rows in the second matrix.
Use the Mul (*) operator for a version that panics instead of
returning a Result.
Example
let matrix = SparseBinMat::new(3, vec![vec![0, 1], vec![1, 2]]);
let other_matrix = SparseBinMat::new(4, vec![vec![1], vec![2], vec![3]]);
let result = SparseBinMat::new(4, vec![vec![1, 2], vec![2, 3]]);
assert_eq!(matrix.dot_with_matrix(&other_matrix), Ok(result));Returns the bitwise xor sum of two matrices or an error if the matrices have different dimensions.
Use the Add (+) operator for a version that panics instead
of returning a Result.
Example
let matrix = SparseBinMat::new(3, vec![vec![0, 1], vec![1, 2]]);
let other_matrix = SparseBinMat::new(3, vec![vec![0, 1, 2], vec![0, 1, 2]]);
let result = SparseBinMat::new(3, vec![vec![2], vec![0]]);
assert_eq!(matrix.bitwise_xor_with(&other_matrix), Ok(result));Returns a new matrix keeping only the given rows or an error if rows are out of bound, unsorted or not unique.
Example
use sparse_bin_mat::SparseBinMat;
let matrix = SparseBinMat::new(5, vec![
vec![0, 1, 2],
vec![2, 3, 4],
vec![0, 2, 4],
vec![1, 3],
]);
let truncated = SparseBinMat::new(5, vec![
vec![0, 1, 2],
vec![0, 2, 4],
]);
assert_eq!(matrix.keep_only_rows(&[0, 2]), Ok(truncated));
assert_eq!(matrix.keep_only_rows(&[0, 2, 3]).unwrap().number_of_rows(), 3);Returns a truncated matrix where the given rows are removed or an error if rows are out of bound or unsorted.
Example
let matrix = SparseBinMat::new(5, vec![
vec![0, 1, 2],
vec![2, 3, 4],
vec![0, 2, 4],
vec![1, 3],
]);
let truncated = SparseBinMat::new(5, vec![
vec![2, 3, 4],
vec![1, 3],
]);
assert_eq!(matrix.without_rows(&[0, 2]), Ok(truncated));
assert_eq!(matrix.without_rows(&[1, 2, 3]).unwrap().number_of_rows(), 1);Returns a new matrix keeping only the given columns or an error if columns are out of bound, unsorted or not unique.
Columns are relabeled to the fit new number of columns.
Example
use sparse_bin_mat::SparseBinMat;
let matrix = SparseBinMat::new(5, vec![
vec![0, 1, 2],
vec![2, 3, 4],
vec![0, 2, 4],
vec![1, 3],
]);
let truncated = SparseBinMat::new(3, vec![
vec![0, 1],
vec![2],
vec![0, 2],
vec![1],
]);
assert_eq!(matrix.keep_only_columns(&[0, 1, 4]), Ok(truncated));
assert_eq!(matrix.keep_only_columns(&[1, 2]).unwrap().number_of_columns(), 2);Returns a truncated matrix where the given columns are removed or an error if columns are out of bound or unsorted.
Columns are relabeled to fit the new number of columns.
Example
let matrix = SparseBinMat::new(5, vec![
vec![0, 1, 2],
vec![2, 3, 4],
vec![0, 2, 4],
vec![1, 3],
]);
let truncated = SparseBinMat::new(3, vec![
vec![0],
vec![1, 2],
vec![2],
vec![0, 1],
]);
assert_eq!(matrix.without_columns(&[0, 2]), Ok(truncated));Returns the Kronecker product of two matrices.
Example
let left_matrix = SparseBinMat::new(2, vec![vec![1], vec![0]]);
let right_matrix = SparseBinMat::new(3, vec![vec![0, 1], vec![1, 2]]);
let product = left_matrix.kron_with(&right_matrix);
let expected = SparseBinMat::new(6, vec![vec![3, 4], vec![4, 5], vec![0, 1], vec![1, 2]]);
assert_eq!(product, expected);Trait Implementations
type Output = SparseBinMat
type Output = SparseBinMat
The resulting type after applying the + operator.
Performs the + operation. Read more
Deserialize this value from the given Serde deserializer. Read more
type Output = SparseBinMat
type Output = SparseBinMat
The resulting type after applying the * operator.
Performs the * operation. Read more
type Output = SparseBinVec
type Output = SparseBinVec
The resulting type after applying the * operator.
Performs the * operation. Read more
This method tests for self and other values to be equal, and is used
by ==. Read more
This method tests for !=.
Auto Trait Implementations
impl RefUnwindSafe for SparseBinMat
impl Send for SparseBinMat
impl Sync for SparseBinMat
impl Unpin for SparseBinMat
impl UnwindSafe for SparseBinMat
Blanket Implementations
Mutably borrows from an owned value. Read more