diff --git a/src/base/matrix.rs b/src/base/matrix.rs index 7a29fe2a..172e293f 100644 --- a/src/base/matrix.rs +++ b/src/base/matrix.rs @@ -859,6 +859,22 @@ impl, S: Storage> Vector { } } +impl, S: Storage> Vector { + /// Constructs a new vector of higher dimension by appending `element` to the end of `self`. + #[inline] + pub fn push(&self, element: N) -> VectorN> + where DefaultAllocator: Allocator> { + let len = self.len(); + let hnrows = DimSum::::from_usize(len + 1); + let mut res = unsafe { VectorN::::new_uninitialized_generic(hnrows, U1) }; + res.generic_slice_mut((0, 0), self.data.shape()) + .copy_from(self); + res[(len, 0)] = element; + + res + } +} + impl AbsDiffEq for Matrix where N: Scalar + AbsDiffEq, diff --git a/tests/core/matrix.rs b/tests/core/matrix.rs index 2569ea7a..e3fa2bdb 100644 --- a/tests/core/matrix.rs +++ b/tests/core/matrix.rs @@ -287,6 +287,18 @@ fn to_homogeneous() { assert_eq!(d.to_homogeneous(), expected_d); } +#[test] +fn push() { + let a = Vector3::new(1.0, 2.0, 3.0); + let expected_a = Vector4::new(1.0, 2.0, 3.0, 4.0); + + let b = DVector::from_row_slice(3, &[1.0, 2.0, 3.0]); + let expected_b = DVector::from_row_slice(4, &[1.0, 2.0, 3.0, 4.0]); + + assert_eq!(a.push(4.0), expected_a); + assert_eq!(b.push(4.0), expected_b); +} + #[test] fn simple_add() { let a = Matrix2x3::new(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);