Use proptest for testing the polar decomposition
This commit is contained in:
parent
cc10b67dd1
commit
8e0ca439c2
@ -153,6 +153,25 @@ mod proptest_tests {
|
||||
prop_assert!(relative_eq!(&m * &sol2, b2, epsilon = 1.0e-6));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn svd_polar_decomposition(m in dmatrix_($scalar)) {
|
||||
let svd = m.clone().svd(true, true);
|
||||
let (p, u) = svd.to_polar().unwrap();
|
||||
|
||||
assert_relative_eq!(m, &p* &u, epsilon = 1.0e-5);
|
||||
// semi-unitary check
|
||||
assert_eq!(true, (u.is_orthogonal(1.0e-5)));
|
||||
// hermitian check
|
||||
assert_relative_eq!(p, p.adjoint(), epsilon = 1.0e-5);
|
||||
|
||||
/*
|
||||
* Same thing, but using the method instead of calling the SVD explicitly.
|
||||
*/
|
||||
let (p2, u2) = m.clone().polar();
|
||||
assert_eq!(p, p2);
|
||||
assert_eq!(u, u2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -441,32 +460,3 @@ fn svd_sorted() {
|
||||
epsilon = 1.0e-5
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dynamic_square_matrix_polar_decomposition() {
|
||||
|
||||
let m = DMatrix::<f64>::new_random(10, 10);
|
||||
let svd = m.clone().svd(true, true);
|
||||
let (p,u) = svd.to_polar().unwrap();
|
||||
|
||||
assert_relative_eq!(m, &p*&u, epsilon = 1.0e-5);
|
||||
// unitary check
|
||||
assert_eq!(true, u.is_orthogonal(1.0e-5));
|
||||
// hermitian check
|
||||
assert_relative_eq!(p, p.adjoint(), epsilon = 1.0e-5);
|
||||
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dynamic_rectangular_matrix_polar_decomposition() {
|
||||
|
||||
let m = DMatrix::<f64>::new_random(7, 5);
|
||||
let svd = m.clone().svd(true, true);
|
||||
let (p,u) = svd.to_polar().unwrap();
|
||||
|
||||
assert_relative_eq!(m, &p*&u, epsilon = 1.0e-5);
|
||||
// semi-unitary check
|
||||
assert_eq!(true, (u.is_orthogonal(1.0e-5)));
|
||||
// hermitian check
|
||||
assert_relative_eq!(p, p.adjoint(), epsilon = 1.0e-5);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user