Expand description
Matrix with fixed dimensions.
Implementations
sourceimpl<T, const M: usize, const N: usize> Matrix<T, M, N>
impl<T, const M: usize, const N: usize> Matrix<T, M, N>
pub fn from_vector_of_vectors(a: Vector<Vector<T, N>, M>) -> Self
pub fn from_array_of_vectors(a: [Vector<T, N>; M]) -> Self
pub fn from_array_of_arrays(a: [[T; N]; M]) -> Self
pub fn into_vector_of_vectors(self) -> Vector<Vector<T, N>, M>
pub fn into_array_of_vectors(self) -> [Vector<T, N>; M]
pub fn into_array_of_arrays(self) -> [[T; N]; M]
sourceimpl<T, const M: usize, const N: usize> Matrix<T, M, N>
impl<T, const M: usize, const N: usize> Matrix<T, M, N>
pub fn as_vector_of_vectors(&self) -> &Vector<Vector<T, N>, M>
pub fn as_mut_vector_of_vectors(&mut self) -> &mut Vector<Vector<T, N>, M>
pub fn as_array_of_vectors(&self) -> &[Vector<T, N>; M]
pub fn as_mut_array_of_vectors(&mut self) -> &mut [Vector<T, N>; M]
pub fn as_array_of_arrays(&self) -> &[[T; N]; M]
pub fn as_mut_array_of_arrays(&mut self) -> &mut [[T; N]; M]
sourceimpl<T, const M: usize, const N: usize> Matrix<T, M, N>
impl<T, const M: usize, const N: usize> Matrix<T, M, N>
pub fn try_from_iter_of_vectors<I>(i: I) -> Option<Self> where
I: Iterator<Item = Vector<T, N>>,
pub fn try_from_iter<I>(i: I) -> Option<Self> where
I: Iterator<Item = T>,
sourceimpl<T, const M: usize, const N: usize> Matrix<T, M, N>
impl<T, const M: usize, const N: usize> Matrix<T, M, N>
sourcepub fn uninit() -> Matrix<MaybeUninit<T>, M, N>
pub fn uninit() -> Matrix<MaybeUninit<T>, M, N>
Create a matrix with uninitialized content.
sourceimpl<T, const M: usize, const N: usize> Matrix<MaybeUninit<T>, M, N>
impl<T, const M: usize, const N: usize> Matrix<MaybeUninit<T>, M, N>
sourcepub unsafe fn assume_init(self) -> Matrix<T, M, N>
pub unsafe fn assume_init(self) -> Matrix<T, M, N>
Assume that matrix content is initialized.
sourceimpl<T, const M: usize, const N: usize> Matrix<T, M, N>
impl<T, const M: usize, const N: usize> Matrix<T, M, N>
sourcepub fn as_mut_ptr(&mut self) -> *mut T
pub fn as_mut_ptr(&mut self) -> *mut T
Get mutable pointer to the first element.
pub unsafe fn get_unchecked(&self, i: usize, j: usize) -> &T
pub unsafe fn get_unchecked_mut(&mut self, i: usize, j: usize) -> &mut T
sourceimpl<T, const M: usize, const N: usize> Matrix<T, M, N>
impl<T, const M: usize, const N: usize> Matrix<T, M, N>
pub fn sum(self) -> T where
T: Add<Output = T>,
pub fn max(self) -> T where
T: PartialOrd,
pub fn min(self) -> T where
T: PartialOrd,
sourceimpl<T, const M: usize, const N: usize> Matrix<T, M, N> where
T: PartialOrd,
impl<T, const M: usize, const N: usize> Matrix<T, M, N> where
T: PartialOrd,
sourceimpl<T: Float, const M: usize, const N: usize> Matrix<T, M, N>
impl<T: Float, const M: usize, const N: usize> Matrix<T, M, N>
pub fn abs(self) -> Self
pub fn abs_sub<B: Broadcast<Self>>(self, other: B) -> Self
pub fn signum(self) -> Self
pub fn cbrt(self) -> Self
pub fn sqrt(self) -> Self
pub fn vmin<B: Broadcast<Self>>(self, other: B) -> Self
pub fn vmax<B: Broadcast<Self>>(self, other: B) -> Self
pub fn clamp<A: Broadcast<Self>, B: Broadcast<Self>>(self, a: A, b: B) -> Self
pub fn acos(self) -> Self
pub fn asin(self) -> Self
pub fn atan(self) -> Self
pub fn atan2<B: Broadcast<Self>>(self, other: B) -> Self
pub fn cosh(self) -> Self
pub fn hypot<B: Broadcast<Self>>(self, other: B) -> Self
pub fn sinh(self) -> Self
pub fn tan(self) -> Self
pub fn tanh(self) -> Self
pub fn log2(self) -> Self
pub fn mul_add<A: Broadcast<Self>, B: Broadcast<Self>>(self, a: A, b: B) -> Self
pub fn exp(self) -> Self
pub fn powi<B: Broadcast<Matrix<i32, M, N>>>(self, other: B) -> Self
pub fn ln(self) -> Self
pub fn powf<B: Broadcast<Self>>(self, other: B) -> Self
pub fn log<B: Broadcast<Self>>(self, other: B) -> Self
pub fn sin(self) -> Self
pub fn cos(self) -> Self
pub fn asinh(self) -> Self
pub fn acosh(self) -> Self
pub fn atanh(self) -> Self
pub fn floor(self) -> Self
pub fn ceil(self) -> Self
pub fn round(self) -> Self
pub fn trunc(self) -> Self
pub fn fract(self) -> Self
pub fn recip(self) -> Self
pub fn exp2(self) -> Self
pub fn log10(self) -> Self
pub fn sin_cos(self) -> (Self, Self)
pub fn exp_m1(self) -> Self
pub fn ln_1p(self) -> Self
Trait Implementations
sourceimpl<T, const M: usize, const N: usize> AbsDiffEq<Matrix<T, M, N>> for Matrix<T, M, N> where
T: AbsDiffEq<Epsilon = T> + Copy,
impl<T, const M: usize, const N: usize> AbsDiffEq<Matrix<T, M, N>> for Matrix<T, M, N> where
T: AbsDiffEq<Epsilon = T> + Copy,
type Epsilon = T
type Epsilon = T
Used for specifying relative comparisons.
sourcefn default_epsilon() -> Self::Epsilon
fn default_epsilon() -> Self::Epsilon
The default tolerance to use when testing values that are close together. Read more
sourcefn abs_diff_eq(&self, other: &Self, epsilon: Self::Epsilon) -> bool
fn abs_diff_eq(&self, other: &Self, epsilon: Self::Epsilon) -> bool
A test for equality that uses the absolute difference to compute the approximate equality of two numbers. Read more
sourcefn abs_diff_ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool
fn abs_diff_ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool
The inverse of AbsDiffEq::abs_diff_eq
.
sourceimpl<T, const M: usize, const N: usize> Add<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Add<Output = T>,
impl<T, const M: usize, const N: usize> Add<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Add<Output = T>,
sourceimpl<T, const M: usize, const N: usize> AddAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: AddAssign,
impl<T, const M: usize, const N: usize> AddAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: AddAssign,
sourcefn add_assign(&mut self, vec: Matrix<T, M, N>)
fn add_assign(&mut self, vec: Matrix<T, M, N>)
Performs the +=
operation. Read more
sourceimpl<T, const M: usize, const N: usize> BitAnd<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitAnd<Output = T>,
impl<T, const M: usize, const N: usize> BitAnd<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitAnd<Output = T>,
sourceimpl<T, const M: usize, const N: usize> BitAndAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitAndAssign,
impl<T, const M: usize, const N: usize> BitAndAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitAndAssign,
sourcefn bitand_assign(&mut self, other: Matrix<T, M, N>)
fn bitand_assign(&mut self, other: Matrix<T, M, N>)
Performs the &=
operation. Read more
sourceimpl<T, const M: usize, const N: usize> BitOr<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitOr<Output = T>,
impl<T, const M: usize, const N: usize> BitOr<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitOr<Output = T>,
sourceimpl<T, const M: usize, const N: usize> BitOrAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitOrAssign,
impl<T, const M: usize, const N: usize> BitOrAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitOrAssign,
sourcefn bitor_assign(&mut self, other: Matrix<T, M, N>)
fn bitor_assign(&mut self, other: Matrix<T, M, N>)
Performs the |=
operation. Read more
sourceimpl<T, const M: usize, const N: usize> BitXor<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitXor<Output = T>,
impl<T, const M: usize, const N: usize> BitXor<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitXor<Output = T>,
sourceimpl<T, const M: usize, const N: usize> BitXorAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitXorAssign,
impl<T, const M: usize, const N: usize> BitXorAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: BitXorAssign,
sourcefn bitxor_assign(&mut self, other: Matrix<T, M, N>)
fn bitxor_assign(&mut self, other: Matrix<T, M, N>)
Performs the ^=
operation. Read more
sourceimpl<D: Distribution<T>, T, const M: usize, const N: usize> Distribution<Matrix<T, M, N>> for MatrixDistribution<D, T, M, N>
impl<D: Distribution<T>, T, const M: usize, const N: usize> Distribution<Matrix<T, M, N>> for MatrixDistribution<D, T, M, N>
sourcefn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Matrix<T, M, N>
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Matrix<T, M, N>
Generate a random value of T
, using rng
as the source of randomness.
sourcefn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> where
R: Rng,
fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> where
R: Rng,
Create an iterator that generates random values of T
, using rng
as
the source of randomness. Read more
sourceimpl<T, const M: usize, const N: usize> Distribution<Matrix<T, M, N>> for Normal where
Normal: Distribution<T>,
impl<T, const M: usize, const N: usize> Distribution<Matrix<T, M, N>> for Normal where
Normal: Distribution<T>,
sourcefn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Matrix<T, M, N>
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Matrix<T, M, N>
Generate a random value of T
, using rng
as the source of randomness.
sourcefn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> where
R: Rng,
fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> where
R: Rng,
Create an iterator that generates random values of T
, using rng
as
the source of randomness. Read more
sourceimpl<T, const N: usize> Distribution<Matrix<T, N, N>> for Invertible where
Normal: Distribution<Matrix<T, N, N>>,
T: Neg<Output = T> + Num + NormL1 + Copy,
<T as NormL1>::Output: Epsilon,
impl<T, const N: usize> Distribution<Matrix<T, N, N>> for Invertible where
Normal: Distribution<Matrix<T, N, N>>,
T: Neg<Output = T> + Num + NormL1 + Copy,
<T as NormL1>::Output: Epsilon,
sourcefn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Matrix<T, N, N>
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Matrix<T, N, N>
Generate a random value of T
, using rng
as the source of randomness.
sourcefn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> where
R: Rng,
fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> where
R: Rng,
Create an iterator that generates random values of T
, using rng
as
the source of randomness. Read more
sourceimpl<T, const M: usize, const N: usize> Div<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Div<Output = T>,
impl<T, const M: usize, const N: usize> Div<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Div<Output = T>,
sourceimpl<T, const M: usize, const N: usize> Div<T> for Matrix<T, M, N> where
T: Div<Output = T> + Copy,
impl<T, const M: usize, const N: usize> Div<T> for Matrix<T, M, N> where
T: Div<Output = T> + Copy,
sourceimpl<T, const M: usize, const N: usize> DivAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: DivAssign,
impl<T, const M: usize, const N: usize> DivAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: DivAssign,
sourcefn div_assign(&mut self, vec: Matrix<T, M, N>)
fn div_assign(&mut self, vec: Matrix<T, M, N>)
Performs the /=
operation. Read more
sourceimpl<T, const M: usize, const N: usize> DivAssign<T> for Matrix<T, M, N> where
T: DivAssign + Copy,
impl<T, const M: usize, const N: usize> DivAssign<T> for Matrix<T, M, N> where
T: DivAssign + Copy,
sourcefn div_assign(&mut self, a: T)
fn div_assign(&mut self, a: T)
Performs the /=
operation. Read more
sourceimpl<T, const M: usize, const N: usize> Dot<Matrix<T, M, N>> for Vector<T, M> where
T: Mul<Output = T> + Add<Output = T> + Copy,
impl<T, const M: usize, const N: usize> Dot<Matrix<T, M, N>> for Vector<T, M> where
T: Mul<Output = T> + Add<Output = T> + Copy,
sourceimpl<T, const L: usize, const M: usize, const N: usize> Dot<Matrix<T, M, N>> for Matrix<T, L, M> where
T: Mul<Output = T> + Add<Output = T> + Copy,
impl<T, const L: usize, const M: usize, const N: usize> Dot<Matrix<T, M, N>> for Matrix<T, L, M> where
T: Mul<Output = T> + Add<Output = T> + Copy,
sourceimpl<T, const M: usize, const N: usize> Dot<Vector<T, N>> for Matrix<T, M, N> where
T: Mul<Output = T> + Add<Output = T> + Copy,
impl<T, const M: usize, const N: usize> Dot<Vector<T, N>> for Matrix<T, M, N> where
T: Mul<Output = T> + Add<Output = T> + Copy,
sourceimpl<T, const M: usize, const N: usize> From<&'_ [[T; N]; M]> for Matrix<T, M, N> where
T: Copy,
impl<T, const M: usize, const N: usize> From<&'_ [[T; N]; M]> for Matrix<T, M, N> where
T: Copy,
sourceimpl<T, const M: usize, const N: usize> From<&'_ [Vector<T, N>; M]> for Matrix<T, M, N> where
T: Copy,
impl<T, const M: usize, const N: usize> From<&'_ [Vector<T, N>; M]> for Matrix<T, M, N> where
T: Copy,
sourceimpl<T, const M: usize, const N: usize> From<&'_ Vector<Vector<T, N>, M>> for Matrix<T, M, N> where
T: Copy,
impl<T, const M: usize, const N: usize> From<&'_ Vector<Vector<T, N>, M>> for Matrix<T, M, N> where
T: Copy,
sourceimpl<'a, T, const M: usize, const N: usize> From<&'a Matrix<T, M, N>> for &'a Vector<Vector<T, N>, M>
impl<'a, T, const M: usize, const N: usize> From<&'a Matrix<T, M, N>> for &'a Vector<Vector<T, N>, M>
sourceimpl<'a, T, const M: usize, const N: usize> From<&'a mut Matrix<T, M, N>> for &'a mut Vector<Vector<T, N>, M>
impl<'a, T, const M: usize, const N: usize> From<&'a mut Matrix<T, M, N>> for &'a mut Vector<Vector<T, N>, M>
sourceimpl<'a, T, const M: usize, const N: usize> From<&'a mut Matrix<T, M, N>> for &'a mut [[T; N]; M]
impl<'a, T, const M: usize, const N: usize> From<&'a mut Matrix<T, M, N>> for &'a mut [[T; N]; M]
sourceimpl<T, const M: usize, const N: usize> IntoIterator for Matrix<T, M, N>
impl<T, const M: usize, const N: usize> IntoIterator for Matrix<T, M, N>
sourceimpl<'a, T, const M: usize, const N: usize> IntoIterator for &'a Matrix<T, M, N>
impl<'a, T, const M: usize, const N: usize> IntoIterator for &'a Matrix<T, M, N>
sourceimpl<'a, T, const M: usize, const N: usize> IntoIterator for &'a mut Matrix<T, M, N>
impl<'a, T, const M: usize, const N: usize> IntoIterator for &'a mut Matrix<T, M, N>
sourceimpl<T, const M: usize, const N: usize> Mul<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Mul<Output = T>,
impl<T, const M: usize, const N: usize> Mul<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Mul<Output = T>,
sourceimpl<T, const M: usize, const N: usize> Mul<T> for Matrix<T, M, N> where
T: Mul<Output = T> + Copy,
impl<T, const M: usize, const N: usize> Mul<T> for Matrix<T, M, N> where
T: Mul<Output = T> + Copy,
sourceimpl<T, const M: usize, const N: usize> MulAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: MulAssign,
impl<T, const M: usize, const N: usize> MulAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: MulAssign,
sourcefn mul_assign(&mut self, vec: Matrix<T, M, N>)
fn mul_assign(&mut self, vec: Matrix<T, M, N>)
Performs the *=
operation. Read more
sourceimpl<T, const M: usize, const N: usize> MulAssign<T> for Matrix<T, M, N> where
T: MulAssign + Copy,
impl<T, const M: usize, const N: usize> MulAssign<T> for Matrix<T, M, N> where
T: MulAssign + Copy,
sourcefn mul_assign(&mut self, a: T)
fn mul_assign(&mut self, a: T)
Performs the *=
operation. Read more
sourceimpl<T, const M: usize, const N: usize> NormL1 for Matrix<T, M, N> where
T: NormL1<Output = T> + Add<Output = T>,
impl<T, const M: usize, const N: usize> NormL1 for Matrix<T, M, N> where
T: NormL1<Output = T> + Add<Output = T>,
sourceimpl<T, const M: usize, const N: usize> NormL2 for Matrix<T, M, N> where
T: Float,
impl<T, const M: usize, const N: usize> NormL2 for Matrix<T, M, N> where
T: Float,
type Output = T
type Output = T
Type of the norm.
sourcefn norm_l2_sqr(self) -> T
fn norm_l2_sqr(self) -> T
Square norm of the element.
sourceimpl<T, const M: usize, const N: usize> NormLInf for Matrix<T, M, N> where
T: NormLInf<Output = T> + PartialOrd,
impl<T, const M: usize, const N: usize> NormLInf for Matrix<T, M, N> where
T: NormLInf<Output = T> + PartialOrd,
type Output = T
type Output = T
Type of the norm.
sourcefn norm_l_inf(self) -> T
fn norm_l_inf(self) -> T
Norm of the element.
sourceimpl<T: PartialEq, const M: usize, const N: usize> PartialEq<Matrix<T, M, N>> for Matrix<T, M, N>
impl<T: PartialEq, const M: usize, const N: usize> PartialEq<Matrix<T, M, N>> for Matrix<T, M, N>
sourceimpl<T: One + Mul, const M: usize, const N: usize> Product<Matrix<T, M, N>> for Matrix<T, M, N>
impl<T: One + Mul, const M: usize, const N: usize> Product<Matrix<T, M, N>> for Matrix<T, M, N>
sourceimpl<T, const M: usize, const N: usize> Rem<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Rem<Output = T>,
impl<T, const M: usize, const N: usize> Rem<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Rem<Output = T>,
sourceimpl<T, const M: usize, const N: usize> Rem<T> for Matrix<T, M, N> where
T: Rem<Output = T> + Copy,
impl<T, const M: usize, const N: usize> Rem<T> for Matrix<T, M, N> where
T: Rem<Output = T> + Copy,
sourceimpl<T, const M: usize, const N: usize> RemAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: RemAssign,
impl<T, const M: usize, const N: usize> RemAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: RemAssign,
sourcefn rem_assign(&mut self, vec: Matrix<T, M, N>)
fn rem_assign(&mut self, vec: Matrix<T, M, N>)
Performs the %=
operation. Read more
sourceimpl<T, const M: usize, const N: usize> RemAssign<T> for Matrix<T, M, N> where
T: RemAssign + Copy,
impl<T, const M: usize, const N: usize> RemAssign<T> for Matrix<T, M, N> where
T: RemAssign + Copy,
sourcefn rem_assign(&mut self, a: T)
fn rem_assign(&mut self, a: T)
Performs the %=
operation. Read more
sourceimpl<T, const M: usize, const N: usize> Sub<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Sub<Output = T>,
impl<T, const M: usize, const N: usize> Sub<Matrix<T, M, N>> for Matrix<T, M, N> where
T: Sub<Output = T>,
sourceimpl<T, const M: usize, const N: usize> SubAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: SubAssign,
impl<T, const M: usize, const N: usize> SubAssign<Matrix<T, M, N>> for Matrix<T, M, N> where
T: SubAssign,
sourcefn sub_assign(&mut self, vec: Matrix<T, M, N>)
fn sub_assign(&mut self, vec: Matrix<T, M, N>)
Performs the -=
operation. Read more
sourceimpl<'a, T, const M: usize, const N: usize> TryFrom<&'a [T]> for Matrix<T, M, N> where
T: Copy,
impl<'a, T, const M: usize, const N: usize> TryFrom<&'a [T]> for Matrix<T, M, N> where
T: Copy,
sourceimpl<'a, T, const M: usize, const N: usize> TryFrom<&'a [Vector<T, N>]> for Matrix<T, M, N> where
T: Copy,
impl<'a, T, const M: usize, const N: usize> TryFrom<&'a [Vector<T, N>]> for Matrix<T, M, N> where
T: Copy,
impl<T: Copy, const M: usize, const N: usize> Copy for Matrix<T, M, N>
impl<T, const M: usize, const N: usize> StructuralPartialEq for Matrix<T, M, N>
Auto Trait Implementations
impl<T, const M: usize, const N: usize> RefUnwindSafe for Matrix<T, M, N> where
T: RefUnwindSafe,
impl<T, const M: usize, const N: usize> Send for Matrix<T, M, N> where
T: Send,
impl<T, const M: usize, const N: usize> Sync for Matrix<T, M, N> where
T: Sync,
impl<T, const M: usize, const N: usize> Unpin for Matrix<T, M, N> where
T: Unpin,
impl<T, const M: usize, const N: usize> UnwindSafe for Matrix<T, M, N> where
T: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
fn clone_into(&self, target: &mut T)
toowned_clone_into
)Uses borrowed data to replace owned data, usually by cloning. Read more