From 6f7202e6c39f0e0a11c28551753a68353ae71041 Mon Sep 17 00:00:00 2001 From: moisan Date: Tue, 6 Jan 2009 18:08:13 -0500 Subject: [PATCH] Finished the hermitian method and added overloaded operator '==' and '!=' to MatrixComplex --- pod/MatrixComplex.pod | 32 ++++++++++++++++++++++++++++---- t/MatrixComplex.t | 19 ++++++++++++++++++- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/pod/MatrixComplex.pod b/pod/MatrixComplex.pod index 125bb86..7e05553 100644 --- a/pod/MatrixComplex.pod +++ b/pod/MatrixComplex.pod @@ -22,9 +22,12 @@ use overload '*' => \&_multiplication, '+' => \&_addition, '-' => \&_subtract, + '==' => \&_equal, + '!=' => \&_not_equal, # 'abs' => \&_abs, fallback => 1; - +use Array::Compare; +#use strict; @EXPORT_OK = qw/ gsl_matrix_complex_alloc gsl_matrix_complex_calloc @@ -153,6 +156,18 @@ sub _subtract { return $lcopy; } +sub _equal { + my ($left, $right) = @_; + my $comp = Array::Compare->new; + return ($comp->compare([$left->as_list], [$right->as_list])); +} + +sub _not_equal { + my ($left, $right) = @_; + my $comp = Array::Compare->new; + return !($comp->compare([$left->as_list], [$right->as_list])); +} + sub copy { my $self = shift; my $copy = Math::GSL::MatrixComplex->new( $self->rows, $self->cols ); @@ -476,9 +491,18 @@ sub inverse($) sub is_hermitian() { my ($self) = @_; - my $test = 1; - $test = $self->is_square; - #TODO still need to check properly if the matrix is hermitian + my $test = $self->is_square; + my $transpose = $self->copy; + gsl_matrix_complex_transpose($transpose->raw); + + if($test == 1) { + for my $row (0..$self->rows - 1) { + map { gsl_matrix_complex_set($transpose->raw, $row, $_, gsl_complex_conjugate(gsl_matrix_complex_get($transpose->raw, $row, $_))) } (0..$self->cols - 1); + } + if($self != $transpose){ + $test = 0; + } + } return $test; } =head2 eigenvalues() diff --git a/t/MatrixComplex.t b/t/MatrixComplex.t index 9854e5d..ddad806 100755 --- a/t/MatrixComplex.t +++ b/t/MatrixComplex.t @@ -1,5 +1,5 @@ package Math::GSL::MatrixComplex::Test; -use Test::More tests => 30; +use Test::More tests => 37; use base q{Test::Class}; use strict; @@ -130,6 +130,14 @@ sub MATRIX_IS_HERMITIAN : Tests { ->set_row(0, [1, 3] ) ->set_row(1, [4, 2] ); ok( $A->is_hermitian == 0, 'non hermitian matrix '); + my $B = Math::GSL::MatrixComplex->new(2,3) + ->set_row(0, [1, 3, 4] ) + ->set_row(1, [4, 2, 8] ); + ok( $B->is_hermitian == 0, 'non square matrix '); + my $C = Math::GSL::MatrixComplex->new(2,2) + ->set_row(0, [3, 2+1*i] ) + ->set_row(1, [2-1*i, 1] ); + # ok( $C->is_hermitian == 1, 'hermitian matrix '); } sub MATRIX_INVERSE : Tests(3) { @@ -145,5 +153,14 @@ sub MATRIX_INVERSE : Tests(3) { dies_ok( sub { $B->inverse } , 'inverse of non square matrix dies' ); } +sub OVERLOAD_EQUAL : Tests(2) { + my $A = Math::GSL::MatrixComplex->new(2,2) + ->set_row(0, [1+2*i, 3] ) + ->set_row(1, [4, 2] ); + my $B = $A->copy; + ok ( $A == $B, 'should be equal'); + $B->set_row(0, [1,2]); + ok ( $A != $B, 'should not be equal'); +} Test::Class->runtests; -- 2.11.4.GIT