diff --git a/ndarray-linalg/Cargo.toml b/ndarray-linalg/Cargo.toml index 1c3ab554..9a7bea43 100644 --- a/ndarray-linalg/Cargo.toml +++ b/ndarray-linalg/Cargo.toml @@ -36,7 +36,7 @@ rand = "0.8.3" thiserror = "1.0.24" [dependencies.ndarray] -version = "0.15.1" +version = "0.15.2" features = ["blas", "approx", "std"] default-features = false diff --git a/ndarray-linalg/src/convert.rs b/ndarray-linalg/src/convert.rs index e1446e96..43002966 100644 --- a/ndarray-linalg/src/convert.rs +++ b/ndarray-linalg/src/convert.rs @@ -46,21 +46,6 @@ where } } -fn uninitialized(l: MatrixLayout) -> ArrayBase -where - A: Copy, - S: DataOwned, -{ - match l { - MatrixLayout::C { row, lda } => unsafe { - ArrayBase::uninitialized((row as usize, lda as usize)) - }, - MatrixLayout::F { col, lda } => unsafe { - ArrayBase::uninitialized((lda as usize, col as usize).f()) - }, - } -} - pub fn replicate(a: &ArrayBase) -> ArrayBase where A: Copy, @@ -68,9 +53,12 @@ where So: DataOwned + DataMut, D: Dimension, { - let mut b = unsafe { ArrayBase::uninitialized(a.dim()) }; - b.assign(a); - b + unsafe { + let ret = ArrayBase::::build_uninit(a.dim(), |view| { + a.assign_to(view); + }); + ret.assume_init() + } } fn clone_with_layout(l: MatrixLayout, a: &ArrayBase) -> ArrayBase @@ -79,9 +67,16 @@ where Si: Data, So: DataOwned + DataMut, { - let mut b = uninitialized(l); - b.assign(a); - b + let shape_builder = match l { + MatrixLayout::C { row, lda } => (row as usize, lda as usize).set_f(false), + MatrixLayout::F { col, lda } => (lda as usize, col as usize).set_f(true), + }; + unsafe { + let ret = ArrayBase::::build_uninit(shape_builder, |view| { + a.assign_to(view); + }); + ret.assume_init() + } } pub fn transpose_data(a: &mut ArrayBase) -> Result<&mut ArrayBase> diff --git a/ndarray-linalg/src/qr.rs b/ndarray-linalg/src/qr.rs index 441e7cef..4bf2f0ec 100644 --- a/ndarray-linalg/src/qr.rs +++ b/ndarray-linalg/src/qr.rs @@ -135,9 +135,7 @@ where S2: DataMut + DataOwned, { let av = a.slice(s![..n as isize, ..m as isize]); - let mut a = unsafe { ArrayBase::uninitialized((n, m)) }; - a.assign(&av); - a + replicate(&av) } fn take_slice_upper(a: &ArrayBase, n: usize, m: usize) -> ArrayBase @@ -146,10 +144,12 @@ where S1: Data, S2: DataMut + DataOwned, { - let av = a.slice(s![..n as isize, ..m as isize]); - let mut a = unsafe { ArrayBase::uninitialized((n, m)) }; - for ((i, j), val) in a.indexed_iter_mut() { - *val = if i <= j { av[(i, j)] } else { A::zero() }; - } + let av = a.slice(s![..n, ..m]); + let mut a = replicate(&av); + Zip::indexed(&mut a).for_each(|(i, j), elt| { + if i > j { + *elt = A::zero() + } + }); a }