Trait rusty_machine::linalg::BaseMatrix
source · [−]pub trait BaseMatrix<T> {
Show 38 methods
fn rows(&self) -> usize;
fn cols(&self) -> usize;
fn row_stride(&self) -> usize;
fn as_ptr(&self) -> *const T;
fn is_empty(&self) -> bool { ... }
fn as_slice(&self) -> MatrixSlice<'_, T> { ... }
unsafe fn get_unchecked(&self, index: [usize; 2]) -> &T { ... }
fn get(&self, index: [usize; 2]) -> Option<&T> { ... }
fn col(&self, index: usize) -> Column<'_, T> { ... }
unsafe fn col_unchecked(&self, index: usize) -> Column<'_, T> { ... }
fn row(&self, index: usize) -> Row<'_, T> { ... }
unsafe fn row_unchecked(&self, index: usize) -> Row<'_, T> { ... }
fn iter<'a>(&self) -> SliceIter<'a, T>
where
T: 'a,
{ ... }
fn col_iter(&self) -> Cols<'_, T> { ... }
fn row_iter(&self) -> Rows<'_, T> { ... }
fn diag_iter(&self, k: DiagOffset) -> Diagonal<'_, T, Self> { ... }
fn sum_rows(&self) -> Vector<T>
where
T: Copy + Zero<Output = T> + Add<T>,
{ ... }
fn sum_cols(&self) -> Vector<T>
where
T: Copy + Zero<Output = T> + Add<T>,
{ ... }
fn norm<N>(&self, norm: N) -> T
where
N: MatrixNorm<T, Self>,
T: Float,
{ ... }
fn metric<'a, 'b, B, M>(&'a self, mat: &'b B, metric: M) -> T
where
B: 'b + BaseMatrix<T>,
M: MatrixMetric<'a, 'b, T, Self, B>,
{ ... }
fn sum(&self) -> T
where
T: Copy + Zero<Output = T> + Add<T>,
{ ... }
fn min(&self, axis: Axes) -> Vector<T>
where
T: Copy + PartialOrd<T>,
{ ... }
fn max(&self, axis: Axes) -> Vector<T>
where
T: Copy + PartialOrd<T>,
{ ... }
fn into_matrix(self) -> Matrix<T>
where
T: Copy,
{ ... }
fn select_rows<'a, I>(&self, rows: I) -> Matrix<T>
where
T: Copy,
I: IntoIterator<Item = &'a usize>,
<I as IntoIterator>::IntoIter: ExactSizeIterator + Clone,
{ ... }
fn select_cols<'a, I>(&self, cols: I) -> Matrix<T>
where
T: Copy,
I: IntoIterator<Item = &'a usize>,
<I as IntoIterator>::IntoIter: ExactSizeIterator + Clone,
{ ... }
fn elemul(&self, m: &Self) -> Matrix<T>
where
T: Copy + Mul<T, Output = T>,
{ ... }
fn elediv(&self, m: &Self) -> Matrix<T>
where
T: Copy + Div<T, Output = T>,
{ ... }
fn select(&self, rows: &[usize], cols: &[usize]) -> Matrix<T>
where
T: Copy,
{ ... }
fn hcat<S>(&self, m: &S) -> Matrix<T>
where
T: Copy,
S: BaseMatrix<T>,
{ ... }
fn vcat<S>(&self, m: &S) -> Matrix<T>
where
T: Copy,
S: BaseMatrix<T>,
{ ... }
fn diag(&self) -> Diagonal<'_, T, Self> { ... }
fn transpose(&self) -> Matrix<T>
where
T: Copy,
{ ... }
fn is_diag(&self) -> bool
where
T: Zero + PartialEq<T>,
{ ... }
fn solve_u_triangular(&self, y: Vector<T>) -> Result<Vector<T>, Error>
where
T: Any + Float,
{ ... }
fn solve_l_triangular(&self, y: Vector<T>) -> Result<Vector<T>, Error>
where
T: Any + Float,
{ ... }
fn split_at(
&self,
mid: usize,
axis: Axes
) -> (MatrixSlice<'_, T>, MatrixSlice<'_, T>) { ... }
fn sub_slice<'a>(
&self,
start: [usize; 2],
rows: usize,
cols: usize
) -> MatrixSlice<'a, T>
where
T: 'a,
{ ... }
}
Expand description
Trait for immutable matrix structs.
Required Methods
sourcefn row_stride(&self) -> usize
fn row_stride(&self) -> usize
Row stride in the matrix.
Provided Methods
sourcefn as_slice(&self) -> MatrixSlice<'_, T>
fn as_slice(&self) -> MatrixSlice<'_, T>
Returns a MatrixSlice
over the whole matrix.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = Matrix::new(3, 3, vec![2.0; 9]);
let b = a.as_slice();
sourceunsafe fn get_unchecked(&self, index: [usize; 2]) -> &T
unsafe fn get_unchecked(&self, index: [usize; 2]) -> &T
Get a reference to an element in the matrix without bounds checking.
sourcefn get(&self, index: [usize; 2]) -> Option<&T>
fn get(&self, index: [usize; 2]) -> Option<&T>
Get a reference to an element in the matrix.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let mat = matrix![0, 1;
3, 4;
6, 7];
assert_eq!(mat.get([0, 2]), None);
assert_eq!(mat.get([3, 0]), None);
assert_eq!( *mat.get([0, 0]).unwrap(), 0)
sourcefn col(&self, index: usize) -> Column<'_, T>
fn col(&self, index: usize) -> Column<'_, T>
Returns the column of a matrix at the given index.
None
if the index is out of bounds.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let mat = matrix![0, 1, 2;
3, 4, 5;
6, 7, 8];
let col = mat.col(1);
let expected = matrix![1usize; 4; 7];
assert_matrix_eq!(*col, expected);
Panics
Will panic if the column index is out of bounds.
sourceunsafe fn col_unchecked(&self, index: usize) -> Column<'_, T>
unsafe fn col_unchecked(&self, index: usize) -> Column<'_, T>
Returns the column of a matrix at the given index without doing a bounds check.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let mat = matrix![0, 1, 2;
3, 4, 5;
6, 7, 8];
let col = unsafe { mat.col_unchecked(2) };
let expected = matrix![2usize; 5; 8];
assert_matrix_eq!(*col, expected);
sourceunsafe fn row_unchecked(&self, index: usize) -> Row<'_, T>
unsafe fn row_unchecked(&self, index: usize) -> Row<'_, T>
Returns the row of a matrix at the given index without doing unbounds checking
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let mat = matrix![0, 1, 2;
3, 4, 5;
6, 7, 8];
let row = unsafe { mat.row_unchecked(2) };
let expected = matrix![6usize, 7, 8];
assert_matrix_eq!(*row, expected);
sourcefn iter<'a>(&self) -> SliceIter<'a, T>where
T: 'a,
fn iter<'a>(&self) -> SliceIter<'a, T>where
T: 'a,
Returns an iterator over the matrix data.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let mat = matrix![0, 1, 2;
3, 4, 5;
6, 7, 8];
let slice = mat.sub_slice([1, 1], 2, 2);
let slice_data = slice.iter().map(|v| *v).collect::<Vec<usize>>();
assert_eq!(slice_data, vec![4, 5, 7, 8]);
sourcefn col_iter(&self) -> Cols<'_, T>
fn col_iter(&self) -> Cols<'_, T>
Iterate over the columns of the matrix.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = matrix![0, 1;
2, 3;
4, 5];
let mut iter = a.col_iter();
assert_matrix_eq!(*iter.next().unwrap(), matrix![ 0; 2; 4 ]);
assert_matrix_eq!(*iter.next().unwrap(), matrix![ 1; 3; 5 ]);
assert!(iter.next().is_none());
sourcefn row_iter(&self) -> Rows<'_, T>
fn row_iter(&self) -> Rows<'_, T>
Iterate over the rows of the matrix.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = matrix![0, 1, 2;
3, 4, 5;
6, 7, 8];
let mut iter = a.row_iter();
assert_matrix_eq!(*iter.next().unwrap(), matrix![ 0, 1, 2 ]);
assert_matrix_eq!(*iter.next().unwrap(), matrix![ 3, 4, 5 ]);
assert_matrix_eq!(*iter.next().unwrap(), matrix![ 6, 7, 8 ]);
assert!(iter.next().is_none());
sourcefn diag_iter(&self, k: DiagOffset) -> Diagonal<'_, T, Self>
fn diag_iter(&self, k: DiagOffset) -> Diagonal<'_, T, Self>
Iterate over diagonal entries
Examples
use rulinalg::matrix::{DiagOffset, Matrix, BaseMatrix};
let a = matrix![0, 1, 2;
3, 4, 5;
6, 7, 8];
// Print super diag [1, 5]
for d in a.diag_iter(DiagOffset::Above(1)) {
println!("{}", d);
}
// Print sub diag [3, 7]
// Equivalent to `diag_iter(DiagOffset::Below(1))`
for d in a.diag_iter(DiagOffset::from(-1)) {
println!("{}", d);
}
Panics
If using an Above
or Below
offset which is
out-of-bounds this function will panic.
This function will never panic if the Main
diagonal
offset is used.
sourcefn sum_rows(&self) -> Vector<T>where
T: Copy + Zero<Output = T> + Add<T>,
fn sum_rows(&self) -> Vector<T>where
T: Copy + Zero<Output = T> + Add<T>,
The sum of the rows of the matrix.
Returns a Vector equal to the sums of elements over the matrices rows.
Note that the resulting vector is identical to the sums of elements along each column of the matrix.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = matrix![1.0, 2.0;
3.0, 4.0];
let c = a.sum_rows();
assert_eq!(c, vector![4.0, 6.0]);
sourcefn sum_cols(&self) -> Vector<T>where
T: Copy + Zero<Output = T> + Add<T>,
fn sum_cols(&self) -> Vector<T>where
T: Copy + Zero<Output = T> + Add<T>,
The sum of the columns of the matrix.
Returns a Vector equal to the sums of elements over the matrices columns.
Note that the resulting vector is identical to the sums of elements along each row of the matrix.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = matrix![1.0, 2.0;
3.0, 4.0];
let c = a.sum_cols();
assert_eq!(c, vector![3.0, 7.0]);
sourcefn norm<N>(&self, norm: N) -> Twhere
N: MatrixNorm<T, Self>,
T: Float,
fn norm<N>(&self, norm: N) -> Twhere
N: MatrixNorm<T, Self>,
T: Float,
Compute given matrix norm for matrix.
Examples
use rulinalg::matrix::BaseMatrix;
use rulinalg::norm::Euclidean;
let a = matrix![3.0, 4.0];
let c = a.norm(Euclidean);
assert_eq!(c, 5.0);
sourcefn metric<'a, 'b, B, M>(&'a self, mat: &'b B, metric: M) -> Twhere
B: 'b + BaseMatrix<T>,
M: MatrixMetric<'a, 'b, T, Self, B>,
fn metric<'a, 'b, B, M>(&'a self, mat: &'b B, metric: M) -> Twhere
B: 'b + BaseMatrix<T>,
M: MatrixMetric<'a, 'b, T, Self, B>,
Compute the metric distance between two matrices.
Examples
use rulinalg::matrix::BaseMatrix;
use rulinalg::norm::Euclidean;
let a = matrix![3.0, 4.0;
1.0, 2.0];
let b = matrix![2.0, 5.0;
0.0, 3.0];
// Compute the square root of the sum of
// elementwise squared-differences
let c = a.metric(&b, Euclidean);
assert_eq!(c, 2.0);
sourcefn sum(&self) -> Twhere
T: Copy + Zero<Output = T> + Add<T>,
fn sum(&self) -> Twhere
T: Copy + Zero<Output = T> + Add<T>,
The sum of all elements in the matrix
Examples
use rulinalg::matrix::BaseMatrix;
let a = matrix![1.0, 2.0;
3.0, 4.0];
let c = a.sum();
assert_eq!(c, 10.0);
sourcefn min(&self, axis: Axes) -> Vector<T>where
T: Copy + PartialOrd<T>,
fn min(&self, axis: Axes) -> Vector<T>where
T: Copy + PartialOrd<T>,
The min of the specified axis of the matrix.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix, Axes};
let a = matrix![1.0, 2.0;
3.0, 4.0];
let cmin = a.min(Axes::Col);
assert_eq!(cmin, vector![1.0, 3.0]);
let rmin = a.min(Axes::Row);
assert_eq!(rmin, vector![1.0, 2.0]);
sourcefn max(&self, axis: Axes) -> Vector<T>where
T: Copy + PartialOrd<T>,
fn max(&self, axis: Axes) -> Vector<T>where
T: Copy + PartialOrd<T>,
The max of the specified axis of the matrix.
Examples
use rulinalg::matrix::{BaseMatrix, Axes};
let a = matrix![1.0, 2.0;
3.0, 4.0];
let cmax = a.max(Axes::Col);
assert_eq!(cmax, vector![2.0, 4.0]);
let rmax = a.max(Axes::Row);
assert_eq!(rmax, vector![3.0, 4.0]);
sourcefn into_matrix(self) -> Matrix<T>where
T: Copy,
fn into_matrix(self) -> Matrix<T>where
T: Copy,
Convert the matrix struct into a owned Matrix.
sourcefn select_rows<'a, I>(&self, rows: I) -> Matrix<T>where
T: Copy,
I: IntoIterator<Item = &'a usize>,
<I as IntoIterator>::IntoIter: ExactSizeIterator + Clone,
fn select_rows<'a, I>(&self, rows: I) -> Matrix<T>where
T: Copy,
I: IntoIterator<Item = &'a usize>,
<I as IntoIterator>::IntoIter: ExactSizeIterator + Clone,
Select rows from matrix
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = Matrix::<f64>::ones(3,3);
let b = &a.select_rows(&[2]);
assert_eq!(b.rows(), 1);
assert_eq!(b.cols(), 3);
let c = &a.select_rows(&[1,2]);
assert_eq!(c.rows(), 2);
assert_eq!(c.cols(), 3);
Panics
- Panics if row indices exceed the matrix dimensions.
sourcefn select_cols<'a, I>(&self, cols: I) -> Matrix<T>where
T: Copy,
I: IntoIterator<Item = &'a usize>,
<I as IntoIterator>::IntoIter: ExactSizeIterator + Clone,
fn select_cols<'a, I>(&self, cols: I) -> Matrix<T>where
T: Copy,
I: IntoIterator<Item = &'a usize>,
<I as IntoIterator>::IntoIter: ExactSizeIterator + Clone,
Select columns from matrix
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = Matrix::<f64>::ones(3,3);
let b = &a.select_cols(&[2]);
assert_eq!(b.rows(), 3);
assert_eq!(b.cols(), 1);
let c = &a.select_cols(&[1,2]);
assert_eq!(c.rows(), 3);
assert_eq!(c.cols(), 2);
Panics
- Panics if column indices exceed the matrix dimensions.
sourcefn elemul(&self, m: &Self) -> Matrix<T>where
T: Copy + Mul<T, Output = T>,
fn elemul(&self, m: &Self) -> Matrix<T>where
T: Copy + Mul<T, Output = T>,
The elementwise product of two matrices.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = matrix![1.0, 2.0;
3.0, 4.0];
let b = matrix![1.0, 2.0;
3.0, 4.0];
let c = &a.elemul(&b);
assert_matrix_eq!(c, &matrix![1.0, 4.0; 9.0, 16.0]);
}
Panics
- The matrices have different row counts.
- The matrices have different column counts.
sourcefn elediv(&self, m: &Self) -> Matrix<T>where
T: Copy + Div<T, Output = T>,
fn elediv(&self, m: &Self) -> Matrix<T>where
T: Copy + Div<T, Output = T>,
The elementwise division of two matrices.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = matrix![1.0, 2.0;
3.0, 4.0];
let b = matrix![1.0, 2.0;
3.0, 4.0];
let c = &a.elediv(&b);
assert_matrix_eq!(c, &matrix![1.0, 1.0; 1.0, 1.0]);
Panics
- The matrices have different row counts.
- The matrices have different column counts.
sourcefn select(&self, rows: &[usize], cols: &[usize]) -> Matrix<T>where
T: Copy,
fn select(&self, rows: &[usize], cols: &[usize]) -> Matrix<T>where
T: Copy,
Select block matrix from matrix
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = Matrix::<f64>::identity(3);
let b = &a.select(&[0,1], &[1,2]);
// We get the 2x2 block matrix in the upper right corner.
assert_eq!(b.rows(), 2);
assert_eq!(b.cols(), 2);
// Prints [0,0, 1,0]
println!("{:?}", b.data());
Panics
- Panics if row or column indices exceed the matrix dimensions.
sourcefn hcat<S>(&self, m: &S) -> Matrix<T>where
T: Copy,
S: BaseMatrix<T>,
fn hcat<S>(&self, m: &S) -> Matrix<T>where
T: Copy,
S: BaseMatrix<T>,
Horizontally concatenates two matrices. With self on the left.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = matrix![1.0, 2.0;
3.0, 4.0;
5.0, 6.0];
let b = matrix![4.0;
5.0;
6.0];
let c = &a.hcat(&b);
assert_eq!(c.cols(), a.cols() + b.cols());
assert_eq!(c[[1, 2]], 5.0);
Panics
- Self and m have different row counts.
sourcefn vcat<S>(&self, m: &S) -> Matrix<T>where
T: Copy,
S: BaseMatrix<T>,
fn vcat<S>(&self, m: &S) -> Matrix<T>where
T: Copy,
S: BaseMatrix<T>,
Vertically concatenates two matrices. With self on top.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = matrix![1.0, 2.0, 3.0;
4.0, 5.0, 6.0];
let b = matrix![4.0, 5.0, 6.0];;
let c = &a.vcat(&b);
assert_eq!(c.rows(), a.rows() + b.rows());
assert_eq!(c[[2, 2]], 6.0);
Panics
- Self and m have different column counts.
sourcefn diag(&self) -> Diagonal<'_, T, Self>
fn diag(&self) -> Diagonal<'_, T, Self>
Extract the diagonal of the matrix
Examples
use rulinalg::matrix::BaseMatrix;
let a = matrix![1, 2, 3;
4, 5, 6;
7, 8, 9].diag().cloned().collect::<Vec<_>>();
let b = matrix![1, 2;
3, 4;
5, 6].diag().cloned().collect::<Vec<_>>();
assert_eq!(a, vec![1, 5, 9]);
assert_eq!(b, vec![1, 4]);
sourcefn transpose(&self) -> Matrix<T>where
T: Copy,
fn transpose(&self) -> Matrix<T>where
T: Copy,
Tranposes the given matrix
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let mat = matrix![1.0, 2.0, 3.0;
4.0, 5.0, 6.0];
let expected = matrix![1.0, 4.0;
2.0, 5.0;
3.0, 6.0];
assert_matrix_eq!(mat.transpose(), expected);
sourcefn is_diag(&self) -> boolwhere
T: Zero + PartialEq<T>,
fn is_diag(&self) -> boolwhere
T: Zero + PartialEq<T>,
Checks if matrix is diagonal.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix};
let a = matrix![1.0, 0.0;
0.0, 1.0];
let a_diag = a.is_diag();
assert_eq!(a_diag, true);
let b = matrix![1.0, 0.0;
1.0, 0.0];
let b_diag = b.is_diag();
assert_eq!(b_diag, false);
sourcefn solve_u_triangular(&self, y: Vector<T>) -> Result<Vector<T>, Error>where
T: Any + Float,
fn solve_u_triangular(&self, y: Vector<T>) -> Result<Vector<T>, Error>where
T: Any + Float,
Solves an upper triangular linear system.
Given a matrix A
and a vector b
, this function returns the
solution of the upper triangular system Ux = b
, where U
is
the upper triangular part of A
.
Examples
use rulinalg::matrix::BaseMatrix;
use std::f32;
let u = matrix![1.0, 2.0;
0.0, 1.0];
let y = vector![3.0, 1.0];
let x = u.solve_u_triangular(y).expect("A solution should exist!");
assert!((x[0] - 1.0) < f32::EPSILON);
assert!((x[1] - 1.0) < f32::EPSILON);
Panics
- Vector size and matrix column count are not equal.
Failures
- There is no valid solution to the system (matrix is singular).
- The matrix is empty.
sourcefn solve_l_triangular(&self, y: Vector<T>) -> Result<Vector<T>, Error>where
T: Any + Float,
fn solve_l_triangular(&self, y: Vector<T>) -> Result<Vector<T>, Error>where
T: Any + Float,
Solves a lower triangular linear system.
Given a matrix A
and a vector b
, this function returns the
solution of the lower triangular system Lx = b
, where L
is
the lower triangular part of A
.
Examples
use rulinalg::matrix::BaseMatrix;
use std::f32;
let l = matrix![1.0, 0.0;
2.0, 1.0];
let y = vector![1.0, 3.0];
let x = l.solve_l_triangular(y).expect("A solution should exist!");
println!("{:?}", x);
assert!((x[0] - 1.0) < f32::EPSILON);
assert!((x[1] - 1.0) < f32::EPSILON);
Panics
- Vector size and matrix column count are not equal.
Failures
- There is no valid solution to the system (matrix is singular).
- The matrix is empty.
sourcefn split_at(
&self,
mid: usize,
axis: Axes
) -> (MatrixSlice<'_, T>, MatrixSlice<'_, T>)
fn split_at(
&self,
mid: usize,
axis: Axes
) -> (MatrixSlice<'_, T>, MatrixSlice<'_, T>)
Split the matrix at the specified axis returning two MatrixSlice
s.
Examples
use rulinalg::matrix::{Axes, Matrix, BaseMatrix};
let a = Matrix::new(3,3, vec![2.0; 9]);
let (b,c) = a.split_at(1, Axes::Row);
sourcefn sub_slice<'a>(
&self,
start: [usize; 2],
rows: usize,
cols: usize
) -> MatrixSlice<'a, T>where
T: 'a,
fn sub_slice<'a>(
&self,
start: [usize; 2],
rows: usize,
cols: usize
) -> MatrixSlice<'a, T>where
T: 'a,
Produce a MatrixSlice
from an existing matrix.
Examples
use rulinalg::matrix::{Matrix, BaseMatrix, MatrixSlice};
let a = Matrix::new(3,3, (0..9).collect::<Vec<usize>>());
let slice = MatrixSlice::from_matrix(&a, [1,1], 2, 2);
let new_slice = slice.sub_slice([0,0], 1, 1);