opensrdk_linear_algebra/matrix/st/
ev.rs1use super::SymmetricTridiagonalMatrix;
2use crate::{matrix::ge::Matrix, matrix::*};
3use lapack::dstev;
4
5impl SymmetricTridiagonalMatrix {
6 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}