From 448e45ffbed4176ed12da914302837887cff8937 Mon Sep 17 00:00:00 2001 From: Xin Hao Date: Wed, 19 Jun 2024 23:41:48 +0800 Subject: [PATCH 1/2] Add property method `is_hermitian` and `is_unitary` --- src/base/properties.rs | 19 +++++++++++++++++++ tests/core/matrix.rs | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/base/properties.rs b/src/base/properties.rs index ab0ceff2b..8041a7afb 100644 --- a/src/base/properties.rs +++ b/src/base/properties.rs @@ -119,4 +119,23 @@ where // TODO: improve this? self.clone_owned().try_inverse().is_some() } + + /// Returns `true` if this matrix is hermitian. + #[inline] + #[must_use] + pub fn is_hermitian(&self) -> bool { + self.is_square() && self.transpose().conjugate().eq(self) + } + + /// Returns `true` if this matrix is unitary. + #[inline] + #[must_use] + pub fn is_unitary(&self, eps: T::Epsilon) -> bool + where + T: Zero + One + RelativeEq, + T::Epsilon: Clone, + { + let r = self.transpose().conjugate() * self; + self.is_square() && r.is_identity(eps) + } } diff --git a/tests/core/matrix.rs b/tests/core/matrix.rs index 50c0e426a..523553113 100644 --- a/tests/core/matrix.rs +++ b/tests/core/matrix.rs @@ -201,6 +201,24 @@ fn identity() { assert!(!not_id3.is_identity(0.0)); } +#[test] +fn is_hermitian() { + let a = Matrix2::new(1.0, 2.0, 3.0, 4.0); + let b = Matrix2::new(1.0, 2.0, 2.0, 1.0); + + assert!(!a.is_hermitian()); + assert!(b.is_hermitian()); +} + +#[test] +fn is_unitary() { + let a = Matrix2::new(1.0, 2.0, 3.0, 4.0); + let b = Matrix2::new(0.0, 1.0, 1.0, 0.0); + + assert!(!a.is_unitary(1.0e-7)); + assert!(b.is_unitary(1.0e-7)); +} + #[test] fn coordinates() { let a = Matrix3x4::new(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34); From a991c13ddb9a3e22226cbbc6ee4ce37825dc27c2 Mon Sep 17 00:00:00 2001 From: Xin Hao Date: Mon, 1 Jul 2024 17:40:43 +0800 Subject: [PATCH 2/2] revert is_hermitian --- src/base/properties.rs | 7 ------- tests/core/matrix.rs | 9 --------- 2 files changed, 16 deletions(-) diff --git a/src/base/properties.rs b/src/base/properties.rs index 8041a7afb..4a305481b 100644 --- a/src/base/properties.rs +++ b/src/base/properties.rs @@ -120,13 +120,6 @@ where self.clone_owned().try_inverse().is_some() } - /// Returns `true` if this matrix is hermitian. - #[inline] - #[must_use] - pub fn is_hermitian(&self) -> bool { - self.is_square() && self.transpose().conjugate().eq(self) - } - /// Returns `true` if this matrix is unitary. #[inline] #[must_use] diff --git a/tests/core/matrix.rs b/tests/core/matrix.rs index 523553113..756278f4d 100644 --- a/tests/core/matrix.rs +++ b/tests/core/matrix.rs @@ -201,15 +201,6 @@ fn identity() { assert!(!not_id3.is_identity(0.0)); } -#[test] -fn is_hermitian() { - let a = Matrix2::new(1.0, 2.0, 3.0, 4.0); - let b = Matrix2::new(1.0, 2.0, 2.0, 1.0); - - assert!(!a.is_hermitian()); - assert!(b.is_hermitian()); -} - #[test] fn is_unitary() { let a = Matrix2::new(1.0, 2.0, 3.0, 4.0);