pub struct BlockTridiagonalMatrix<A>{ /* private fields */ }
Expand description
Block tridiagonal matrix representation
A block tridiagonal matrix stores blocks on the main diagonal, superdiagonal, and subdiagonal, giving O(n) storage for the blocks instead of O(n²) for dense matrices.
Each matrix in the structure is stored as a square matrix using ndarray’s Array2.
§Examples
use scirs2_core::ndarray::{array, Array2};
use scirs2_linalg::specialized::BlockTridiagonalMatrix;
use scirs2_linalg::SpecializedMatrix;
// Create 2×2 blocks for a block tridiagonal matrix
let a1 = array![[1.0, 2.0], [3.0, 4.0]];
let a2 = array![[5.0, 6.0], [7.0, 8.0]];
let a3 = array![[9.0, 10.0], [11.0, 12.0]];
let b1 = array![[13.0, 14.0], [15.0, 16.0]];
let b2 = array![[17.0, 18.0], [19.0, 20.0]];
let c1 = array![[21.0, 22.0], [23.0, 24.0]];
let c2 = array![[25.0, 26.0], [27.0, 28.0]];
// Create a block tridiagonal matrix with 3 diagonal blocks
let diag = vec![a1.clone(), a2.clone(), a3.clone()];
let super_diag = vec![b1.clone(), b2.clone()];
let sub_diag = vec![c1.clone(), c2.clone()];
let block_tri = BlockTridiagonalMatrix::new(diag, super_diag, sub_diag).unwrap();
// Get block dimensions and total dimensions
assert_eq!(block_tri.block_count(), 3);
assert_eq!(block_tri.nrows(), 6); // 3 blocks of size 2×2
assert_eq!(block_tri.ncols(), 6);
// Get element at position (1,3) which is in block (0,1) at position (1,1)
assert_eq!(block_tri.get(1, 3).unwrap(), 16.0);
// Matrix-vector multiplication with a 6-element vector
let x = array![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
let y = block_tri.matvec(&x.view()).unwrap();
Implementations§
Source§impl<A> BlockTridiagonalMatrix<A>
impl<A> BlockTridiagonalMatrix<A>
Sourcepub fn new(
diagonal: Vec<Array2<A>>,
superdiagonal: Vec<Array2<A>>,
subdiagonal: Vec<Array2<A>>,
) -> LinalgResult<Self>
pub fn new( diagonal: Vec<Array2<A>>, superdiagonal: Vec<Array2<A>>, subdiagonal: Vec<Array2<A>>, ) -> LinalgResult<Self>
Create a new block tridiagonal matrix from blocks
§Arguments
diagonal
- Vector of diagonal blockssuperdiagonal
- Vector of superdiagonal blocks (one fewer than diagonal)subdiagonal
- Vector of subdiagonal blocks (one fewer than diagonal)
§Returns
LinalgResult<BlockTridiagonalMatrix<A>>
- New block tridiagonal matrix
§Errors
- If any diagonal block is not square
- If the number of superdiagonal or subdiagonal blocks is not one fewer than diagonal
- If the dimensions of adjacent blocks are incompatible
Sourcepub fn block_count(&self) -> usize
pub fn block_count(&self) -> usize
Get the number of diagonal blocks
Sourcepub fn diagonal_block(&self, i: usize) -> Option<&Array2<A>>
pub fn diagonal_block(&self, i: usize) -> Option<&Array2<A>>
Get a reference to a diagonal block
Sourcepub fn superdiagonal_block(&self, i: usize) -> Option<&Array2<A>>
pub fn superdiagonal_block(&self, i: usize) -> Option<&Array2<A>>
Get a reference to a superdiagonal block
Sourcepub fn subdiagonal_block(&self, i: usize) -> Option<&Array2<A>>
pub fn subdiagonal_block(&self, i: usize) -> Option<&Array2<A>>
Get a reference to a subdiagonal block
Trait Implementations§
Source§impl<A> Clone for BlockTridiagonalMatrix<A>
impl<A> Clone for BlockTridiagonalMatrix<A>
Source§fn clone(&self) -> BlockTridiagonalMatrix<A>
fn clone(&self) -> BlockTridiagonalMatrix<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 BlockTridiagonalMatrix<A>
impl<A> Debug for BlockTridiagonalMatrix<A>
Source§impl<A> SpecializedMatrix<A> for BlockTridiagonalMatrix<A>
impl<A> SpecializedMatrix<A> for BlockTridiagonalMatrix<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 BlockTridiagonalMatrix<A>
impl<A> RefUnwindSafe for BlockTridiagonalMatrix<A>where
A: RefUnwindSafe,
impl<A> Send for BlockTridiagonalMatrix<A>
impl<A> Sync for BlockTridiagonalMatrix<A>
impl<A> Unpin for BlockTridiagonalMatrix<A>
impl<A> UnwindSafe for BlockTridiagonalMatrix<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