pub struct BandedMatrix<A>{ /* private fields */ }
Expand description
Banded matrix representation
A banded matrix has non-zero elements only within a band around the main diagonal. The band is defined by the number of lower diagonals and upper diagonals.
§Examples
use scirs2_core::ndarray::{array, Array2};
use scirs2_linalg::specialized::BandedMatrix;
use scirs2_linalg::SpecializedMatrix;
// Create a 5x5 banded matrix with lower bandwidth 1 and upper bandwidth 2
// This means we have the main diagonal, 1 subdiagonal, and 2 superdiagonals
let mut data = Array2::zeros((4, 5)); // 4 diagonals (1+1+2), 5 columns
// Set the values for each diagonal
// Lower diagonal (the 1 subdiagonal)
data[[0, 0]] = 1.0;
data[[0, 1]] = 2.0;
data[[0, 2]] = 3.0;
data[[0, 3]] = 4.0;
// Main diagonal
data[[1, 0]] = 5.0;
data[[1, 1]] = 6.0;
data[[1, 2]] = 7.0;
data[[1, 3]] = 8.0;
data[[1, 4]] = 9.0;
// First superdiagonal
data[[2, 0]] = 10.0;
data[[2, 1]] = 11.0;
data[[2, 2]] = 12.0;
data[[2, 3]] = 13.0;
// Second superdiagonal
data[[3, 0]] = 14.0;
data[[3, 1]] = 15.0;
data[[3, 2]] = 16.0;
let band = BandedMatrix::new(data.view(), 1, 2, 5, 5).unwrap();
// The matrix is equivalent to:
// [[ 5.0, 10.0, 14.0, 0.0, 0.0 ],
// [ 1.0, 6.0, 11.0, 15.0, 0.0 ],
// [ 0.0, 2.0, 7.0, 12.0, 16.0 ],
// [ 0.0, 0.0, 3.0, 8.0, 13.0 ],
// [ 0.0, 0.0, 0.0, 4.0, 9.0 ]]
// Get elements
assert_eq!(band.get(0, 0).unwrap(), 5.0);
assert_eq!(band.get(0, 1).unwrap(), 10.0);
assert_eq!(band.get(0, 2).unwrap(), 14.0);
assert_eq!(band.get(1, 0).unwrap(), 1.0);
assert_eq!(band.get(0, 3).unwrap(), 0.0); // Outside the band
// Matrix-vector multiplication
let x = array![1.0, 2.0, 3.0, 4.0, 5.0];
let y = band.matvec(&x.view()).unwrap();
Implementations§
Source§impl<A> BandedMatrix<A>
impl<A> BandedMatrix<A>
Sourcepub fn new(
data: ArrayView2<'_, A>,
lower_bandwidth: usize,
upper_bandwidth: usize,
nrows: usize,
ncols: usize,
) -> LinalgResult<Self>
pub fn new( data: ArrayView2<'_, A>, lower_bandwidth: usize, upper_bandwidth: usize, nrows: usize, ncols: usize, ) -> LinalgResult<Self>
Create a new banded matrix from band storage
§Arguments
data
- Band storage with diagonals as rows, ordered from lowest to highestlower_bandwidth
- Number of lower diagonalsupper_bandwidth
- Number of upper diagonalsnrows
- Number of rows in the full matrixncols
- Number of columns in the full matrix
§Returns
BandedMatrix
if the data has valid dimensionsLinalgError
if dimensions are incompatible
Sourcepub fn frommatrix(
a: &ArrayView2<'_, A>,
lower_bandwidth: usize,
upper_bandwidth: usize,
) -> LinalgResult<Self>
pub fn frommatrix( a: &ArrayView2<'_, A>, lower_bandwidth: usize, upper_bandwidth: usize, ) -> LinalgResult<Self>
Sourcepub fn bandwidth(&self) -> usize
pub fn bandwidth(&self) -> usize
Get the bandwidth of the matrix (sum of lower and upper bandwidth plus one)
Sourcepub fn lower_bandwidth(&self) -> usize
pub fn lower_bandwidth(&self) -> usize
Get the lower bandwidth of the matrix
Sourcepub fn upper_bandwidth(&self) -> usize
pub fn upper_bandwidth(&self) -> usize
Get the upper bandwidth of the matrix
Sourcepub fn solve(&self, b: &ArrayView1<'_, A>) -> LinalgResult<Array1<A>>
pub fn solve(&self, b: &ArrayView1<'_, A>) -> LinalgResult<Array1<A>>
Trait Implementations§
Source§impl<A> Clone for BandedMatrix<A>
impl<A> Clone for BandedMatrix<A>
Source§fn clone(&self) -> BandedMatrix<A>
fn clone(&self) -> BandedMatrix<A>
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moreSource§impl<A> Debug for BandedMatrix<A>
impl<A> Debug for BandedMatrix<A>
Source§impl<A> SpecializedMatrix<A> for BandedMatrix<A>
impl<A> SpecializedMatrix<A> for BandedMatrix<A>
Source§fn matvec(&self, x: &ArrayView1<'_, A>) -> LinalgResult<Array1<A>>
fn matvec(&self, x: &ArrayView1<'_, A>) -> LinalgResult<Array1<A>>
Perform matrix-vector multiplication: A * x
Source§fn matvec_transpose(&self, x: &ArrayView1<'_, A>) -> LinalgResult<Array1<A>>
fn matvec_transpose(&self, x: &ArrayView1<'_, A>) -> LinalgResult<Array1<A>>
Perform transposed matrix-vector multiplication: A^T * x
Source§fn to_dense(&self) -> LinalgResult<Array2<A>>
fn to_dense(&self) -> LinalgResult<Array2<A>>
Convert to a dense matrix representation
Source§fn to_operator(&self) -> LinalgResult<LinearOperator<A>>
fn to_operator(&self) -> LinalgResult<LinearOperator<A>>
Convert to a matrix-free operator
Auto Trait Implementations§
impl<A> Freeze for BandedMatrix<A>
impl<A> RefUnwindSafe for BandedMatrix<A>where
A: RefUnwindSafe,
impl<A> Send for BandedMatrix<A>
impl<A> Sync for BandedMatrix<A>
impl<A> Unpin for BandedMatrix<A>
impl<A> UnwindSafe for BandedMatrix<A>where
A: RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more