Skip to content

Commit 1cf04b7

Browse files
committed
Add replicate
1 parent 3efbf7e commit 1cf04b7

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

src/layout.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,14 @@ pub fn reconstruct<A, S>(l: Layout, a: Vec<A>) -> Result<ArrayBase<S, Ix2>>
105105
Layout::F((col, row)) => ArrayBase::from_shape_vec((row as usize, col as usize).f(), a)?,
106106
})
107107
}
108+
109+
pub fn replicate<A, Sv, So, D>(a: &ArrayBase<Sv, D>) -> ArrayBase<So, D>
110+
where A: Copy,
111+
Sv: Data<Elem = A>,
112+
So: DataOwned<Elem = A> + DataMut,
113+
D: Dimension
114+
{
115+
let mut b = unsafe { ArrayBase::uninitialized(a.dim()) };
116+
b.assign(a);
117+
b
118+
}

src/solve.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,13 @@ impl<A, S> Factorize<S> for ArrayBase<S, Ix2>
5656
}
5757
}
5858

59-
impl<'a, A, S> Factorize<OwnedRepr<A>> for &'a ArrayBase<S, Ix2>
60-
where A: LapackScalar + Clone,
61-
S: Data<Elem = A>
59+
impl<'a, A, Si, So> Factorize<So> for &'a ArrayBase<Si, Ix2>
60+
where A: LapackScalar + Copy,
61+
Si: Data<Elem = A>,
62+
So: DataOwned<Elem = A> + DataMut
6263
{
63-
fn factorize(self) -> Result<Factorized<OwnedRepr<A>>> {
64-
let mut a = self.to_owned();
64+
fn factorize(self) -> Result<Factorized<So>> {
65+
let mut a: ArrayBase<So, Ix2> = replicate(self);
6566
let ipiv = A::lu(a.layout()?, a.as_allocated_mut()?)?;
6667
Ok(Factorized { a: a, ipiv: ipiv })
6768
}
@@ -81,11 +82,12 @@ impl<A, S> Inverse<ArrayBase<S, Ix2>> for ArrayBase<S, Ix2>
8182
}
8283
}
8384

84-
impl<'a, A, S> Inverse<Array2<A>> for &'a ArrayBase<S, Ix2>
85-
where A: LapackScalar + Clone,
86-
S: Data<Elem = A>
85+
impl<'a, A, Si, So> Inverse<ArrayBase<So, Ix2>> for &'a ArrayBase<Si, Ix2>
86+
where A: LapackScalar + Copy,
87+
Si: Data<Elem = A>,
88+
So: DataOwned<Elem = A> + DataMut
8789
{
88-
fn inv(self) -> Result<Array2<A>> {
90+
fn inv(self) -> Result<ArrayBase<So, Ix2>> {
8991
let f = self.factorize()?;
9092
f.into_inverse()
9193
}

0 commit comments

Comments
 (0)