mdarray_linalg/naive/qr/
context.rs1use 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 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}