Add zip_zip_map to map on three matrices simultaneously.
This commit is contained in:
parent
787d20cff4
commit
a03fd6bff7
|
@ -393,6 +393,42 @@ impl<N: Scalar, R: Dim, C: Dim, S: Storage<N, R, C>> Matrix<N, R, C, S> {
|
|||
res
|
||||
}
|
||||
|
||||
/// Returns a matrix containing the result of `f` applied to each entries of `self` and
|
||||
/// `b`, and `c`.
|
||||
#[inline]
|
||||
pub fn zip_zip_map<N2, N3, N4, S2, S3, F>(&self, b: &Matrix<N2, R, C, S2>, c: &Matrix<N3, R, C, S3>, mut f: F) -> MatrixMN<N4, R, C>
|
||||
where
|
||||
N2: Scalar,
|
||||
N3: Scalar,
|
||||
N4: Scalar,
|
||||
S2: Storage<N2, R, C>,
|
||||
S3: Storage<N3, R, C>,
|
||||
F: FnMut(N, N2, N3) -> N4,
|
||||
DefaultAllocator: Allocator<N4, R, C>,
|
||||
{
|
||||
let (nrows, ncols) = self.data.shape();
|
||||
|
||||
let mut res = unsafe { MatrixMN::new_uninitialized_generic(nrows, ncols) };
|
||||
|
||||
assert!(
|
||||
(nrows.value(), ncols.value()) == b.shape() && (nrows.value(), ncols.value()) == c.shape(),
|
||||
"Matrix simultaneous traversal error: dimension mismatch."
|
||||
);
|
||||
|
||||
for j in 0..ncols.value() {
|
||||
for i in 0..nrows.value() {
|
||||
unsafe {
|
||||
let a = *self.data.get_unchecked(i, j);
|
||||
let b = *b.data.get_unchecked(i, j);
|
||||
let c = *c.data.get_unchecked(i, j);
|
||||
*res.data.get_unchecked_mut(i, j) = f(a, b, c)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res
|
||||
}
|
||||
|
||||
/// Transposes `self` and store the result into `out`.
|
||||
#[inline]
|
||||
pub fn transpose_to<R2, C2, SB>(&self, out: &mut Matrix<N, R2, C2, SB>)
|
||||
|
|
Loading…
Reference in New Issue