Skip to main content

mdarray_linalg/naive/qr/
context.rs

1use mdarray::{Array, Dim, Layout, Shape, Slice};
2use num_complex::ComplexFloat;
3use num_traits::{MulAdd, One, Zero};
4
5use super::simple::naive_qr;
6use crate::Naive;
7use crate::qr::QR;
8
9impl<T, D0: Dim, D1: Dim> QR<T, D0, D1> for Naive
10where
11    T: ComplexFloat + Zero + One + MulAdd<Output = T>,
12{
13    fn qr_write<D2: Dim, L: Layout, Lq: Layout, Lr: Layout>(
14        &self,
15        a: &mut Slice<T, (D0, D1), L>,
16        q: &mut Slice<T, (D0, D2), Lq>,
17        r: &mut Slice<T, (D2, D1), Lr>,
18    ) {
19        naive_qr(a, q, r);
20    }
21
22    fn qr<L: Layout>(
23        &self,
24        a: &mut Slice<T, (D0, D1), L>,
25    ) -> (Array<T, (D0, usize)>, Array<T, (usize, D1)>) {
26        let ash = *a.shape();
27        let m = ash.dim(0);
28        let n = ash.dim(1);
29
30        // let mut q = Array::<T, (D0, usize)>::from_elem([m, m], T::zero());
31        // let mut r = Array::<T, (usize, D1)>::from_elem([m, m], T::zero());
32
33        let q_shape = <(D0, usize) as Shape>::from_dims(&[m, m]);
34        let r_shape = <(usize, D1) as Shape>::from_dims(&[m, n]);
35
36        let mut q = Array::<T, (D0, usize)>::from_elem(q_shape, T::zero());
37        let mut r = Array::<T, (usize, D1)>::from_elem(r_shape, T::zero());
38
39        naive_qr(a, &mut q, &mut r);
40
41        (q, r)
42    }
43}