Implement `Extend<Vector<_,_,_>>` for `Matrix`.
Extend a `Matrix` with columns drawn from an iterator of `Vector`s.
This commit is contained in:
parent
0f29a3ae0a
commit
0ed67d0470
|
@ -772,3 +772,66 @@ where
|
||||||
self.data.extend(iter);
|
self.data.extend(iter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N, R, S, RV, SV> Extend<Vector<N, RV, SV>> for Matrix<N, R, Dynamic, S>
|
||||||
|
where
|
||||||
|
N: Scalar,
|
||||||
|
R: Dim,
|
||||||
|
S: Extend<Vector<N, RV, SV>>,
|
||||||
|
RV: Dim,
|
||||||
|
SV: Storage<N, RV>
|
||||||
|
{
|
||||||
|
/// Extends the number of columns of a `Matrix` with `Vector`s
|
||||||
|
/// from a given iterator.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
/// ```
|
||||||
|
/// # use nalgebra::{DMatrix, Vector3, Matrix3x4};
|
||||||
|
///
|
||||||
|
/// let data = vec![0, 1, 2, // column 1
|
||||||
|
/// 3, 4, 5]; // column 2
|
||||||
|
///
|
||||||
|
/// let mut matrix = DMatrix::from_vec(3, 2, data);
|
||||||
|
///
|
||||||
|
/// matrix.extend(
|
||||||
|
/// vec![Vector3::new(6, 7, 8), // column 3
|
||||||
|
/// Vector3::new(9, 10, 11)]); // column 4
|
||||||
|
///
|
||||||
|
/// assert!(matrix.eq(&Matrix3x4::new(0, 3, 6, 9,
|
||||||
|
/// 1, 4, 7, 10,
|
||||||
|
/// 2, 5, 8, 11)));
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
/// This function panics if the dimension of each `Vector` yielded
|
||||||
|
/// by the given iterator is not equal to the number of rows of
|
||||||
|
/// this `Matrix`.
|
||||||
|
///
|
||||||
|
/// ```should_panic
|
||||||
|
/// # use nalgebra::{DMatrix, Vector2, Matrix3x4};
|
||||||
|
/// let mut matrix =
|
||||||
|
/// DMatrix::from_vec(3, 2,
|
||||||
|
/// vec![0, 1, 2, // column 1
|
||||||
|
/// 3, 4, 5]); // column 2
|
||||||
|
///
|
||||||
|
/// // The following panics because this matrix can only be extended with 3-dimensional vectors.
|
||||||
|
/// matrix.extend(
|
||||||
|
/// vec![Vector2::new(6, 7)]); // too few dimensions!
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// ```should_panic
|
||||||
|
/// # use nalgebra::{DMatrix, Vector4, Matrix3x4};
|
||||||
|
/// let mut matrix =
|
||||||
|
/// DMatrix::from_vec(3, 2,
|
||||||
|
/// vec![0, 1, 2, // column 1
|
||||||
|
/// 3, 4, 5]); // column 2
|
||||||
|
///
|
||||||
|
/// // The following panics because this matrix can only be extended with 3-dimensional vectors.
|
||||||
|
/// matrix.extend(
|
||||||
|
/// vec![Vector4::new(6, 7, 8, 9)]); // too few dimensions!
|
||||||
|
/// ```
|
||||||
|
fn extend<I: IntoIterator<Item=Vector<N, RV, SV>>>(&mut self, iter: I)
|
||||||
|
{
|
||||||
|
self.data.extend(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ use base::allocator::Allocator;
|
||||||
use base::default_allocator::DefaultAllocator;
|
use base::default_allocator::DefaultAllocator;
|
||||||
use base::dimension::{Dim, DimName, Dynamic, U1};
|
use base::dimension::{Dim, DimName, Dynamic, U1};
|
||||||
use base::storage::{ContiguousStorage, ContiguousStorageMut, Owned, Storage, StorageMut};
|
use base::storage::{ContiguousStorage, ContiguousStorageMut, Owned, Storage, StorageMut};
|
||||||
use base::Scalar;
|
use base::{Scalar, Vector};
|
||||||
|
|
||||||
#[cfg(feature = "abomonation-serialize")]
|
#[cfg(feature = "abomonation-serialize")]
|
||||||
use abomonation::Abomonation;
|
use abomonation::Abomonation;
|
||||||
|
@ -259,6 +259,34 @@ impl<N, R: Dim> Extend<N> for MatrixVec<N, R, Dynamic>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N, R, RV, SV> Extend<Vector<N, RV, SV>> for MatrixVec<N, R, Dynamic>
|
||||||
|
where
|
||||||
|
N: Scalar,
|
||||||
|
R: Dim,
|
||||||
|
RV: Dim,
|
||||||
|
SV: Storage<N, RV>
|
||||||
|
{
|
||||||
|
/// Extends the number of columns of the `MatrixVec` with vectors
|
||||||
|
/// from the given iterator.
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
/// This function panics if the number of rows of each `Vector`
|
||||||
|
/// yielded by the iterator is not equal to the number of rows
|
||||||
|
/// of this `MatrixVec`.
|
||||||
|
fn extend<I: IntoIterator<Item=Vector<N, RV, SV>>>(&mut self, iter: I)
|
||||||
|
{
|
||||||
|
let nrows = self.nrows.value();
|
||||||
|
let iter = iter.into_iter();
|
||||||
|
let (lower, _upper) = iter.size_hint();
|
||||||
|
self.data.reserve(nrows * lower);
|
||||||
|
for vector in iter {
|
||||||
|
assert_eq!(nrows, vector.shape().0);
|
||||||
|
self.data.extend(vector.iter());
|
||||||
|
}
|
||||||
|
self.ncols = Dynamic::new(self.data.len() / nrows);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<N> Extend<N> for MatrixVec<N, Dynamic, U1>
|
impl<N> Extend<N> for MatrixVec<N, Dynamic, U1>
|
||||||
{
|
{
|
||||||
/// Extends the number of rows of the `MatrixVec` with elements
|
/// Extends the number of rows of the `MatrixVec` with elements
|
||||||
|
|
Loading…
Reference in New Issue