Implement Clone, Debug, Copy for all linalg structures.
This commit is contained in:
parent
b84c7e10df
commit
70bb2cbe46
|
@ -10,6 +10,7 @@ use geometry::Reflection;
|
||||||
|
|
||||||
|
|
||||||
/// The bidiagonalization of a general matrix.
|
/// The bidiagonalization of a general matrix.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct Bidiagonal<N: Real, R: DimMin<C>, C: Dim>
|
pub struct Bidiagonal<N: Real, R: DimMin<C>, C: Dim>
|
||||||
where DimMinimum<R, C>: DimSub<U1>,
|
where DimMinimum<R, C>: DimSub<U1>,
|
||||||
DefaultAllocator: Allocator<N, R, C> +
|
DefaultAllocator: Allocator<N, R, C> +
|
||||||
|
@ -17,14 +18,23 @@ pub struct Bidiagonal<N: Real, R: DimMin<C>, C: Dim>
|
||||||
Allocator<N, DimDiff<DimMinimum<R, C>, U1>> {
|
Allocator<N, DimDiff<DimMinimum<R, C>, U1>> {
|
||||||
// FIXME: perhaps we should pack the axises into different vectors so that axises for `v_t` are
|
// FIXME: perhaps we should pack the axises into different vectors so that axises for `v_t` are
|
||||||
// contiguous. This prevents some useless copies.
|
// contiguous. This prevents some useless copies.
|
||||||
uv: MatrixMN<N, R, C>,
|
uv: MatrixMN<N, R, C>,
|
||||||
/// The diagonal elements of the decomposed matrix.
|
/// The diagonal elements of the decomposed matrix.
|
||||||
pub diagonal: VectorN<N, DimMinimum<R, C>>,
|
pub diagonal: VectorN<N, DimMinimum<R, C>>,
|
||||||
/// The off-diagonal elements of the decomposed matrix.
|
/// The off-diagonal elements of the decomposed matrix.
|
||||||
pub off_diagonal: VectorN<N, DimDiff<DimMinimum<R, C>, U1>>,
|
pub off_diagonal: VectorN<N, DimDiff<DimMinimum<R, C>, U1>>,
|
||||||
upper_diagonal: bool
|
upper_diagonal: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N: Real, R: DimMin<C>, C: Dim> Copy for Bidiagonal<N, R, C>
|
||||||
|
where DimMinimum<R, C>: DimSub<U1>,
|
||||||
|
DefaultAllocator: Allocator<N, R, C> +
|
||||||
|
Allocator<N, DimMinimum<R, C>> +
|
||||||
|
Allocator<N, DimDiff<DimMinimum<R, C>, U1>>,
|
||||||
|
MatrixMN<N, R, C>: Copy,
|
||||||
|
VectorN<N, DimMinimum<R, C>>: Copy,
|
||||||
|
VectorN<N, DimDiff<DimMinimum<R, C>, U1>>: Copy { }
|
||||||
|
|
||||||
impl<N: Real, R: DimMin<C>, C: Dim> Bidiagonal<N, R, C>
|
impl<N: Real, R: DimMin<C>, C: Dim> Bidiagonal<N, R, C>
|
||||||
where DimMinimum<R, C>: DimSub<U1>,
|
where DimMinimum<R, C>: DimSub<U1>,
|
||||||
DefaultAllocator: Allocator<N, R, C> +
|
DefaultAllocator: Allocator<N, R, C> +
|
||||||
|
|
|
@ -7,11 +7,16 @@ use allocator::Allocator;
|
||||||
use dimension::{Dim, Dynamic, DimSub};
|
use dimension::{Dim, Dynamic, DimSub};
|
||||||
|
|
||||||
/// The cholesky decomposion of a symmetric-definite-positive matrix.
|
/// The cholesky decomposion of a symmetric-definite-positive matrix.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct Cholesky<N: Real, D: Dim>
|
pub struct Cholesky<N: Real, D: Dim>
|
||||||
where DefaultAllocator: Allocator<N, D, D> {
|
where DefaultAllocator: Allocator<N, D, D> {
|
||||||
chol: MatrixN<N, D>
|
chol: MatrixN<N, D>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N: Real, D: Dim> Copy for Cholesky<N, D>
|
||||||
|
where DefaultAllocator: Allocator<N, D, D>,
|
||||||
|
MatrixN<N, D>: Copy { }
|
||||||
|
|
||||||
impl<N: Real, D: DimSub<Dynamic>> Cholesky<N, D>
|
impl<N: Real, D: DimSub<Dynamic>> Cholesky<N, D>
|
||||||
where DefaultAllocator: Allocator<N, D, D> {
|
where DefaultAllocator: Allocator<N, D, D> {
|
||||||
/// Attempts to compute the sholesky decomposition of `matrix`.
|
/// Attempts to compute the sholesky decomposition of `matrix`.
|
||||||
|
|
|
@ -16,6 +16,7 @@ use geometry::{Reflection, UnitComplex};
|
||||||
|
|
||||||
|
|
||||||
/// The eigendecomposition of a matrix with real eigenvalues.
|
/// The eigendecomposition of a matrix with real eigenvalues.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct RealEigen<N: Real, D: Dim>
|
pub struct RealEigen<N: Real, D: Dim>
|
||||||
where DefaultAllocator: Allocator<N, D, D> +
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
Allocator<N, D> {
|
Allocator<N, D> {
|
||||||
|
@ -23,6 +24,13 @@ pub struct RealEigen<N: Real, D: Dim>
|
||||||
pub eigenvalues: VectorN<N, D>
|
pub eigenvalues: VectorN<N, D>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<N: Real, D: Dim> Copy for RealEigen<N, D>
|
||||||
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
|
Allocator<N, D>,
|
||||||
|
MatrixN<N, D>: Copy,
|
||||||
|
VectorN<N, D>: Copy { }
|
||||||
|
|
||||||
impl<N: Real, D: Dim> RealEigen<N, D>
|
impl<N: Real, D: Dim> RealEigen<N, D>
|
||||||
where D: DimSub<U1>, // For Hessenberg.
|
where D: DimSub<U1>, // For Hessenberg.
|
||||||
ShapeConstraint: DimEq<Dynamic, DimDiff<D, U1>>, // For Hessenberg.
|
ShapeConstraint: DimEq<Dynamic, DimDiff<D, U1>>, // For Hessenberg.
|
||||||
|
|
|
@ -11,6 +11,7 @@ use linalg::PermutationSequence;
|
||||||
|
|
||||||
|
|
||||||
/// LU decomposition with full pivoting.
|
/// LU decomposition with full pivoting.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct FullPivLU<N: Real, R: DimMin<C>, C: Dim>
|
pub struct FullPivLU<N: Real, R: DimMin<C>, C: Dim>
|
||||||
where DefaultAllocator: Allocator<N, R, C> +
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
Allocator<(usize, usize), DimMinimum<R, C>> {
|
Allocator<(usize, usize), DimMinimum<R, C>> {
|
||||||
|
@ -20,6 +21,13 @@ pub struct FullPivLU<N: Real, R: DimMin<C>, C: Dim>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<N: Real, R: DimMin<C>, C: Dim> Copy for FullPivLU<N, R, C>
|
||||||
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
|
Allocator<(usize, usize), DimMinimum<R, C>>,
|
||||||
|
MatrixMN<N, R, C>: Copy,
|
||||||
|
PermutationSequence<DimMinimum<R, C>>: Copy { }
|
||||||
|
|
||||||
|
|
||||||
impl<N: Real, R: DimMin<C>, C: Dim> FullPivLU<N, R, C>
|
impl<N: Real, R: DimMin<C>, C: Dim> FullPivLU<N, R, C>
|
||||||
where DefaultAllocator: Allocator<N, R, C> +
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
Allocator<(usize, usize), DimMinimum<R, C>> {
|
Allocator<(usize, usize), DimMinimum<R, C>> {
|
||||||
|
|
|
@ -8,6 +8,7 @@ use constraint::{ShapeConstraint, DimEq};
|
||||||
use linalg::householder;
|
use linalg::householder;
|
||||||
|
|
||||||
/// The Hessenberg decomposition of a general matrix.
|
/// The Hessenberg decomposition of a general matrix.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct Hessenberg<N: Real, D: DimSub<U1>>
|
pub struct Hessenberg<N: Real, D: DimSub<U1>>
|
||||||
where DefaultAllocator: Allocator<N, D, D> +
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
Allocator<N, DimDiff<D, U1>> {
|
Allocator<N, DimDiff<D, U1>> {
|
||||||
|
@ -16,6 +17,12 @@ pub struct Hessenberg<N: Real, D: DimSub<U1>>
|
||||||
subdiag: VectorN<N, DimDiff<D, U1>>
|
subdiag: VectorN<N, DimDiff<D, U1>>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N: Real, D: DimSub<U1>> Copy for Hessenberg<N, D>
|
||||||
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
|
Allocator<N, DimDiff<D, U1>>,
|
||||||
|
MatrixN<N, D>: Copy,
|
||||||
|
VectorN<N, DimDiff<D, U1>>: Copy { }
|
||||||
|
|
||||||
impl<N: Real, D: DimSub<U1>> Hessenberg<N, D>
|
impl<N: Real, D: DimSub<U1>> Hessenberg<N, D>
|
||||||
where DefaultAllocator: Allocator<N, D, D> +
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
Allocator<N, D> +
|
Allocator<N, D> +
|
||||||
|
|
|
@ -11,6 +11,7 @@ use linalg::PermutationSequence;
|
||||||
|
|
||||||
|
|
||||||
/// LU decomposition with partial (row) pivoting.
|
/// LU decomposition with partial (row) pivoting.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct LU<N: Real, R: DimMin<C>, C: Dim>
|
pub struct LU<N: Real, R: DimMin<C>, C: Dim>
|
||||||
where DefaultAllocator: Allocator<N, R, C> +
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
Allocator<(usize, usize), DimMinimum<R, C>> {
|
Allocator<(usize, usize), DimMinimum<R, C>> {
|
||||||
|
@ -18,6 +19,12 @@ pub struct LU<N: Real, R: DimMin<C>, C: Dim>
|
||||||
p: PermutationSequence<DimMinimum<R, C>>
|
p: PermutationSequence<DimMinimum<R, C>>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N: Real, R: DimMin<C>, C: Dim> Copy for LU<N, R, C>
|
||||||
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
|
Allocator<(usize, usize), DimMinimum<R, C>>,
|
||||||
|
MatrixMN<N, R, C>: Copy,
|
||||||
|
PermutationSequence<DimMinimum<R, C>>: Copy { }
|
||||||
|
|
||||||
/// Performs a LU decomposition to overwrite `out` with the inverse of `matrix`.
|
/// Performs a LU decomposition to overwrite `out` with the inverse of `matrix`.
|
||||||
///
|
///
|
||||||
/// If `matrix` is not invertible, `false` is returned and `out` may contain invalid data.
|
/// If `matrix` is not invertible, `false` is returned and `out` may contain invalid data.
|
||||||
|
|
|
@ -8,12 +8,17 @@ use allocator::Allocator;
|
||||||
|
|
||||||
|
|
||||||
/// A sequence of permutations.
|
/// A sequence of permutations.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct PermutationSequence<D: Dim>
|
pub struct PermutationSequence<D: Dim>
|
||||||
where DefaultAllocator: Allocator<(usize, usize), D>{
|
where DefaultAllocator: Allocator<(usize, usize), D> {
|
||||||
len: usize,
|
len: usize,
|
||||||
ipiv: VectorN<(usize, usize), D>
|
ipiv: VectorN<(usize, usize), D>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<D: Dim> Copy for PermutationSequence<D>
|
||||||
|
where DefaultAllocator: Allocator<(usize, usize), D>,
|
||||||
|
VectorN<(usize, usize), D>: Copy { }
|
||||||
|
|
||||||
impl<D: Dim> PermutationSequence<D>
|
impl<D: Dim> PermutationSequence<D>
|
||||||
where DefaultAllocator: Allocator<(usize, usize), D> {
|
where DefaultAllocator: Allocator<(usize, usize), D> {
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ use geometry::Reflection;
|
||||||
|
|
||||||
|
|
||||||
/// The QR decomposition of a general matrix.
|
/// The QR decomposition of a general matrix.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct QR<N: Real, R: DimMin<C>, C: Dim>
|
pub struct QR<N: Real, R: DimMin<C>, C: Dim>
|
||||||
where DefaultAllocator: Allocator<N, R, C> +
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
Allocator<N, DimMinimum<R, C>> {
|
Allocator<N, DimMinimum<R, C>> {
|
||||||
|
@ -17,6 +18,13 @@ pub struct QR<N: Real, R: DimMin<C>, C: Dim>
|
||||||
diag: VectorN<N, DimMinimum<R, C>>,
|
diag: VectorN<N, DimMinimum<R, C>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<N: Real, R: DimMin<C>, C: Dim> Copy for QR<N, R, C>
|
||||||
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
|
Allocator<N, DimMinimum<R, C>>,
|
||||||
|
MatrixMN<N, R, C>: Copy,
|
||||||
|
VectorN<N, DimMinimum<R, C>>: Copy { }
|
||||||
|
|
||||||
impl<N: Real, R: DimMin<C>, C: Dim> QR<N, R, C>
|
impl<N: Real, R: DimMin<C>, C: Dim> QR<N, R, C>
|
||||||
where DefaultAllocator: Allocator<N, R, C> +
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
Allocator<N, R> +
|
Allocator<N, R> +
|
||||||
|
|
|
@ -15,6 +15,7 @@ use geometry::{Reflection, UnitComplex};
|
||||||
|
|
||||||
|
|
||||||
/// Real RealSchur decomposition of a square matrix.
|
/// Real RealSchur decomposition of a square matrix.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct RealSchur<N: Real, D: Dim>
|
pub struct RealSchur<N: Real, D: Dim>
|
||||||
where DefaultAllocator: Allocator<N, D, D> +
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
Allocator<N, D> {
|
Allocator<N, D> {
|
||||||
|
@ -22,6 +23,12 @@ pub struct RealSchur<N: Real, D: Dim>
|
||||||
t: MatrixN<N, D>
|
t: MatrixN<N, D>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<N: Real, D: Dim> Copy for RealSchur<N, D>
|
||||||
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
|
Allocator<N, D>,
|
||||||
|
MatrixN<N, D>: Copy { }
|
||||||
|
|
||||||
impl<N: Real, D: Dim> RealSchur<N, D>
|
impl<N: Real, D: Dim> RealSchur<N, D>
|
||||||
where D: DimSub<U1>, // For Hessenberg.
|
where D: DimSub<U1>, // For Hessenberg.
|
||||||
ShapeConstraint: DimEq<Dynamic, DimDiff<D, U1>>, // For Hessenberg.
|
ShapeConstraint: DimEq<Dynamic, DimDiff<D, U1>>, // For Hessenberg.
|
||||||
|
|
|
@ -16,7 +16,7 @@ use geometry::UnitComplex;
|
||||||
|
|
||||||
|
|
||||||
/// The Singular Value Decomposition of a real matrix.
|
/// The Singular Value Decomposition of a real matrix.
|
||||||
#[derive(Clone)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct SVD<N: Real, R: DimMin<C>, C: Dim>
|
pub struct SVD<N: Real, R: DimMin<C>, C: Dim>
|
||||||
where DefaultAllocator: Allocator<N, R, C> +
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
Allocator<N, DimMinimum<R, C>, C> +
|
Allocator<N, DimMinimum<R, C>, C> +
|
||||||
|
@ -30,6 +30,16 @@ pub struct SVD<N: Real, R: DimMin<C>, C: Dim>
|
||||||
pub singular_values: VectorN<N, DimMinimum<R, C>>,
|
pub singular_values: VectorN<N, DimMinimum<R, C>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<N: Real, R: DimMin<C>, C: Dim> SVD<N, R, C>
|
||||||
|
where DefaultAllocator: Allocator<N, R, C> +
|
||||||
|
Allocator<N, DimMinimum<R, C>, C> +
|
||||||
|
Allocator<N, R, DimMinimum<R, C>> +
|
||||||
|
Allocator<N, DimMinimum<R, C>>,
|
||||||
|
MatrixMN<N, R, DimMinimum<R, C>>: Copy,
|
||||||
|
MatrixMN<N, DimMinimum<R, C>, C>: Copy,
|
||||||
|
VectorN<N, DimMinimum<R, C>>: Copy { }
|
||||||
|
|
||||||
impl<N: Real, R: DimMin<C>, C: Dim> SVD<N, R, C>
|
impl<N: Real, R: DimMin<C>, C: Dim> SVD<N, R, C>
|
||||||
where DimMinimum<R, C>: DimSub<U1>, // for Bidiagonal.
|
where DimMinimum<R, C>: DimSub<U1>, // for Bidiagonal.
|
||||||
DefaultAllocator: Allocator<N, R, C> +
|
DefaultAllocator: Allocator<N, R, C> +
|
||||||
|
|
|
@ -13,6 +13,7 @@ use geometry::UnitComplex;
|
||||||
|
|
||||||
|
|
||||||
/// The eigendecomposition of a symmetric matrix.
|
/// The eigendecomposition of a symmetric matrix.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct SymmetricEigen<N: Real, D: Dim>
|
pub struct SymmetricEigen<N: Real, D: Dim>
|
||||||
where DefaultAllocator: Allocator<N, D, D> +
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
Allocator<N, D> {
|
Allocator<N, D> {
|
||||||
|
@ -23,6 +24,12 @@ pub struct SymmetricEigen<N: Real, D: Dim>
|
||||||
pub eigenvalues: VectorN<N, D>
|
pub eigenvalues: VectorN<N, D>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N: Real, D: Dim> SymmetricEigen<N, D>
|
||||||
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
|
Allocator<N, D>,
|
||||||
|
MatrixN<N, D>: Copy,
|
||||||
|
VectorN<N, D>: Copy { }
|
||||||
|
|
||||||
impl<N: Real, D: Dim> SymmetricEigen<N, D>
|
impl<N: Real, D: Dim> SymmetricEigen<N, D>
|
||||||
where DefaultAllocator: Allocator<N, D, D> +
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
Allocator<N, D> {
|
Allocator<N, D> {
|
||||||
|
|
|
@ -8,6 +8,7 @@ use linalg::householder;
|
||||||
|
|
||||||
|
|
||||||
/// The tridiagonalization of a symmetric matrix.
|
/// The tridiagonalization of a symmetric matrix.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct SymmetricTridiagonal<N: Real, D: DimSub<U1>>
|
pub struct SymmetricTridiagonal<N: Real, D: DimSub<U1>>
|
||||||
where DefaultAllocator: Allocator<N, D, D> +
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
Allocator<N, DimDiff<D, U1>> {
|
Allocator<N, DimDiff<D, U1>> {
|
||||||
|
@ -15,6 +16,12 @@ pub struct SymmetricTridiagonal<N: Real, D: DimSub<U1>>
|
||||||
off_diagonal: VectorN<N, DimDiff<D, U1>>
|
off_diagonal: VectorN<N, DimDiff<D, U1>>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N: Real, D: DimSub<U1>> SymmetricTridiagonal<N, D>
|
||||||
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
|
Allocator<N, DimDiff<D, U1>>,
|
||||||
|
MatrixN<N, D>: Copy,
|
||||||
|
VectorN<N, DimDiff<D, U1>>: Copy { }
|
||||||
|
|
||||||
impl<N: Real, D: DimSub<U1>> SymmetricTridiagonal<N, D>
|
impl<N: Real, D: DimSub<U1>> SymmetricTridiagonal<N, D>
|
||||||
where DefaultAllocator: Allocator<N, D, D> +
|
where DefaultAllocator: Allocator<N, D, D> +
|
||||||
Allocator<N, DimDiff<D, U1>> {
|
Allocator<N, DimDiff<D, U1>> {
|
||||||
|
|
Loading…
Reference in New Issue