Format file

This commit is contained in:
metric-space 2022-01-18 22:42:12 -05:00
parent 7230ae1e63
commit 6f7ef387e5
1 changed files with 64 additions and 49 deletions

View File

@ -38,11 +38,11 @@ where
{ {
alphar: OVector<T, D>, alphar: OVector<T, D>,
alphai: OVector<T, D>, alphai: OVector<T, D>,
beta: OVector<T,D>, beta: OVector<T, D>,
vsl: OMatrix<T, D, D>, vsl: OMatrix<T, D, D>,
s: OMatrix<T, D, D>, s: OMatrix<T, D, D>,
vsr: OMatrix<T, D, D>, vsr: OMatrix<T, D, D>,
t: OMatrix<T, D, D> t: OMatrix<T, D, D>,
} }
impl<T: Scalar + Copy, D: Dim> Copy for QZ<T, D> impl<T: Scalar + Copy, D: Dim> Copy for QZ<T, D>
@ -61,7 +61,7 @@ where
/// ///
/// Panics if the method did not converge. /// Panics if the method did not converge.
pub fn new(a: OMatrix<T, D, D>, b: OMatrix<T, D, D>) -> Self { pub fn new(a: OMatrix<T, D, D>, b: OMatrix<T, D, D>) -> Self {
Self::try_new(a,b).expect("Schur decomposition: convergence failed.") Self::try_new(a, b).expect("Schur decomposition: convergence failed.")
} }
/// Computes the eigenvalues and real Schur form of the matrix `m`. /// Computes the eigenvalues and real Schur form of the matrix `m`.
@ -85,9 +85,9 @@ where
let mut alphar = Matrix::zeros_generic(nrows, Const::<1>); let mut alphar = Matrix::zeros_generic(nrows, Const::<1>);
let mut alphai = Matrix::zeros_generic(nrows, Const::<1>); let mut alphai = Matrix::zeros_generic(nrows, Const::<1>);
let mut beta = Matrix::zeros_generic(nrows, Const::<1>); let mut beta = Matrix::zeros_generic(nrows, Const::<1>);
let mut vsl = Matrix::zeros_generic(nrows, ncols); let mut vsl = Matrix::zeros_generic(nrows, ncols);
let mut vsr = Matrix::zeros_generic(nrows, ncols); let mut vsr = Matrix::zeros_generic(nrows, ncols);
// Placeholders: // Placeholders:
let mut bwork = [0i32]; let mut bwork = [0i32];
let mut unused = 0; let mut unused = 0;
@ -140,14 +140,27 @@ where
); );
lapack_check!(info); lapack_check!(info);
Some(QZ {alphar, alphai, beta, Some(QZ {
vsl, s:a, alphar,
vsr, t:b}) alphai,
beta,
vsl,
s: a,
vsr,
t: b,
})
} }
/// Retrieves the unitary matrix `Q` and the upper-quasitriangular matrix `T` such that the /// Retrieves the unitary matrix `Q` and the upper-quasitriangular matrix `T` such that the
/// decomposed matrix equals `Q * T * Q.transpose()`. /// decomposed matrix equals `Q * T * Q.transpose()`.
pub fn unpack(self) -> (OMatrix<T, D, D>, OMatrix<T, D, D>, OMatrix<T, D, D>, OMatrix<T, D, D>){ pub fn unpack(
self,
) -> (
OMatrix<T, D, D>,
OMatrix<T, D, D>,
OMatrix<T, D, D>,
OMatrix<T, D, D>,
) {
(self.vsl, self.s, self.t, self.vsr) (self.vsl, self.s, self.t, self.vsr)
} }
@ -160,8 +173,10 @@ where
let mut out = Matrix::zeros_generic(self.t.shape_generic().0, Const::<1>); let mut out = Matrix::zeros_generic(self.t.shape_generic().0, Const::<1>);
for i in 0..out.len() { for i in 0..out.len() {
out[i] = Complex::new(self.alphar[i].clone()/self.beta[i].clone(), out[i] = Complex::new(
self.alphai[i].clone()/self.beta[i].clone()) self.alphar[i].clone() / self.beta[i].clone(),
self.alphai[i].clone() / self.beta[i].clone(),
)
} }
out out
@ -177,50 +192,50 @@ where
pub trait QZScalar: Scalar { pub trait QZScalar: Scalar {
#[allow(missing_docs)] #[allow(missing_docs)]
fn xgges( fn xgges(
jobvsl: u8, jobvsl: u8,
jobvsr: u8, jobvsr: u8,
sort: u8, sort: u8,
// select: ??? // select: ???
n: i32, n: i32,
a: &mut [Self], a: &mut [Self],
lda: i32, lda: i32,
b: &mut [Self], b: &mut [Self],
ldb: i32, ldb: i32,
sdim: &mut i32, sdim: &mut i32,
alphar: &mut [Self], alphar: &mut [Self],
alphai: &mut [Self], alphai: &mut [Self],
beta : &mut [Self], beta: &mut [Self],
vsl: &mut [Self], vsl: &mut [Self],
ldvsl: i32, ldvsl: i32,
vsr: &mut [Self], vsr: &mut [Self],
ldvsr: i32, ldvsr: i32,
work: &mut [Self], work: &mut [Self],
lwork: i32, lwork: i32,
bwork: &mut [i32], bwork: &mut [i32],
info: &mut i32 info: &mut i32,
); );
#[allow(missing_docs)] #[allow(missing_docs)]
fn xgges_work_size( fn xgges_work_size(
jobvsl: u8, jobvsl: u8,
jobvsr: u8, jobvsr: u8,
sort: u8, sort: u8,
// select: ??? // select: ???
n: i32, n: i32,
a: &mut [Self], a: &mut [Self],
lda: i32, lda: i32,
b: &mut [Self], b: &mut [Self],
ldb: i32, ldb: i32,
sdim: &mut i32, sdim: &mut i32,
alphar: &mut [Self], alphar: &mut [Self],
alphai: &mut [Self], alphai: &mut [Self],
beta : &mut [Self], beta: &mut [Self],
vsl: &mut [Self], vsl: &mut [Self],
ldvsl: i32, ldvsl: i32,
vsr: &mut [Self], vsr: &mut [Self],
ldvsr: i32, ldvsr: i32,
bwork: &mut [i32], bwork: &mut [i32],
info: &mut i32 info: &mut i32,
) -> i32; ) -> i32;
} }