mdarray_linalg_faer/qr/
context.rs1use faer_traits::ComplexField;
10use mdarray::{Array, Dim, Layout, Shape, Slice};
11use mdarray_linalg::qr::QR;
12use num_complex::ComplexFloat;
13
14use super::simple::qr_faer;
15use crate::Faer;
16
17impl<T, D0: Dim, D1: Dim> QR<T, D0, D1> for Faer
18where
19 T: ComplexFloat + ComplexField + Default,
20{
21 fn qr<L: Layout>(
22 &self,
23 a: &mut Slice<T, (D0, D1), L>,
24 ) -> (Array<T, (D0, usize)>, Array<T, (usize, D1)>) {
25 let ash = *a.shape();
26 let (m, n) = (ash.dim(0), ash.dim(1));
27 let k = m.min(n);
28
29 let q_shape = <(D0, usize) as Shape>::from_dims(&[m, k]);
30 let r_shape = <(usize, D1) as Shape>::from_dims(&[k, n]);
31
32 let mut q_mda = Array::from_elem(q_shape, T::default());
33 let mut r_mda = Array::from_elem(r_shape, T::default());
34
35 qr_faer(a, Some(&mut q_mda), &mut r_mda);
36 (q_mda, r_mda)
37 }
38
39 fn qr_write<D2: Dim, L: Layout, Lq: Layout, Lr: Layout>(
40 &self,
41 a: &mut Slice<T, (D0, D1), L>,
42 q: &mut Slice<T, (D0, D2), Lq>,
43 r: &mut Slice<T, (D2, D1), Lr>,
44 ) {
45 qr_faer(a, Some(q), r)
46 }
47}