Skip to main content

mdarray_linalg_faer/qr/
context.rs

1// QR Decomposition:
2//     A = Q * R
3// where:
4//     - A is m × n         (input matrix)
5//     - Q is m × m        (orthogonal matrix)
6//     - R is m × n         (upper triangular/trapezoidal matrix)
7//     - For thin QR: Q is m × min(m,n) and R is min(m,n) × n
8
9use 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}