diff --git a/src/base/norm.rs b/src/base/norm.rs index a7fa66e9..9717e031 100644 --- a/src/base/norm.rs +++ b/src/base/norm.rs @@ -8,7 +8,7 @@ use crate::allocator::Allocator; use crate::base::{DefaultAllocator, Dim, DimName, Matrix, MatrixMN, Normed, VectorN}; use crate::constraint::{SameNumberOfColumns, SameNumberOfRows, ShapeConstraint}; use crate::storage::{Storage, StorageMut}; -use crate::{ComplexField, Scalar, SimdComplexField, Unit}; +use crate::{ComplexField, RealField, Scalar, SimdComplexField, Unit}; use simba::scalar::ClosedNeg; use simba::simd::{SimdOption, SimdPartialOrd}; @@ -334,11 +334,27 @@ impl> Matrix { { let n = self.norm(); - if n >= min_magnitude { + if n > min_magnitude { self.scale_mut(magnitude / n) } } + /// Returns a new vector with the same magnitude as `self` clamped between `0.0` and `max`. + #[inline] + pub fn cap_magnitude(&self, max: N::RealField) -> MatrixMN + where + N: RealField, + DefaultAllocator: Allocator, + { + let n = self.norm(); + + if n > max { + self.scale(max / n) + } else { + self.clone_owned() + } + } + /// Returns a normalized version of this matrix unless its norm as smaller or equal to `eps`. /// /// The components of this matrix cannot be SIMD types (see `simd_try_normalize`) instead.