opensrdk_linear_algebra/matrix/st/
ev.rs

1use super::SymmetricTridiagonalMatrix;
2use crate::{matrix::ge::Matrix, matrix::*};
3use lapack::dstev;
4
5impl SymmetricTridiagonalMatrix {
6    /// # Eigen decomposition
7    /// return (lambda, pt)
8    pub fn stev(self) -> Result<(Vec<f64>, Matrix), MatrixError> {
9        let (mut d, mut e) = self.eject();
10        let n = d.len();
11        let mut z = Matrix::new(n, n);
12        let mut work = vec![0.0; 1.max(2 * (n - 2))];
13        let mut info = 0;
14
15        let n = n as i32;
16
17        unsafe {
18            dstev(
19                'V' as u8,
20                n,
21                &mut d,
22                &mut e,
23                z.elems_mut(),
24                n,
25                &mut work,
26                &mut info,
27            )
28        }
29
30        match info {
31            0 => Ok((d, z)),
32            _ => Err(MatrixError::LapackRoutineError {
33                routine: "dstev".to_owned(),
34                info,
35            }),
36        }
37    }
38}