Move HERMITIAN test to MatrixComplex.t
[Math-GSL.git] / t / Matrix.t
blobdcd9765d17c8ec735beffa14dbe9fd5906cb8034
1 package Math::GSL::Matrix::Test;
2 use Test::More tests => 225;
3 use base q{Test::Class};
4 use strict;
6 use Math::GSL           qw/:all/;
7 use Math::GSL::Test     qw/:all/;
8 use Math::GSL::Matrix   qw/:all/;
9 use Math::GSL::Vector   qw/:all/;
10 use Math::GSL::Complex  qw/:all/;
11 use Math::GSL::Errno    qw/:all/;
12 use Test::Exception;
13 use Math::Complex;
14 use Data::Dumper;
16 BEGIN{ gsl_set_error_handler_off(); }
18 sub make_fixture : Test(setup) {
19     my $self = shift;
20     $self->{matrix} = gsl_matrix_alloc(5,5);
21     $self->{obj}    = Math::GSL::Matrix->new(5,5);
22     gsl_matrix_set_zero($self->{matrix});
25 sub teardown : Test(teardown) {
26     unlink 'matrix' if -f 'matrix';
29 sub GSL_MATRIX_ALLOC : Tests {
30     my $matrix = gsl_matrix_alloc(5,5);
31     isa_ok($matrix, 'Math::GSL::Matrix');
34 sub GSL_MATRIX_SET : Tests {
35     my $self = shift;
36     map { gsl_matrix_set($self->{matrix}, $_,$_, $_ ** 2) } (0..4);
38     my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
39     ok_similar( [ @got ], [ map { $_**2 } (0..4) ] );
42 sub GSL_MATRIX_CALLOC : Tests {
43    my $matrix = gsl_matrix_calloc(5,5);
44    isa_ok($matrix, 'Math::GSL::Matrix');
46    my @got = map { gsl_matrix_get($matrix, $_, $_) } (0..4);
47    ok_similar( [ @got ], [ (0) x 5 ], 'gsl_matrix_calloc' );
50 sub GSL_MATRIX_FREE : Tests {
51    my $matrix = gsl_matrix_calloc(5,5);
52    isa_ok($matrix, 'Math::GSL::Matrix');
54    is(gsl_matrix_get($matrix, 0, 0), 0);
55    gsl_matrix_free($matrix);
58 sub GSL_MATRIX_SUBMATRIX : Tests {
59    my $matrix = gsl_matrix_alloc(5,5);
60    map { gsl_matrix_set($matrix, $_,$_, $_) } (0..4);
61    my $subMatrix = gsl_matrix_submatrix($matrix, 0, 0, 2, 2);
62    my @got = map { gsl_matrix_get($matrix, $_, $_) } (0..2);
63    ok_similar( [ @got ], [ 0..2 ] );
66 sub GSL_MATRIX_ROW : Tests {
67    my $self = shift;
68    for my $line (0..4) {
69         map { gsl_matrix_set($self->{matrix}, $_,$line, $_) } (0..4);
70    }
72    my $vector_view = gsl_matrix_row($self->{matrix}, 2);
73    my @got = map { gsl_vector_get($vector_view->{vector}, $_) } (0..4);
74    ok_similar( [ @got ], [ (2)x 5], 'gsl_matrix_row' );
77 sub GSL_MATRIX_COLUMN : Tests {
78     my $self = shift;
79     my $view = gsl_vector_alloc(5);
81     for my $line (0..4) {
82         map { gsl_matrix_set($self->{matrix}, $line,$_, $line*$_) } (0..4);
83     }
84     $view = gsl_matrix_column($self->{matrix}, 2);
85     my $vec = $view->swig_vector_get();
87     my @got = map { gsl_vector_get($vec, $_) } (0..4);
88     ok_similar( [ @got ], [0,2,4,6,8 ], 'gsl_matrix_column' );
91 sub GSL_MATRIX_DIAGONAL : Tests {
92    my $matrix = gsl_matrix_alloc(4,4);
93    map { gsl_matrix_set($matrix, $_,$_, $_) } (0..3);
94    my $view = gsl_matrix_diagonal($matrix);
95    # better interface is needed
96    my $vec = $view->swig_vector_get();
98    my @got = map { gsl_vector_get($vec, $_) } (0..3);
99    ok_similar( [ @got ], [ 0 .. 3 ], 'gsl_matrix_diagonal');
102 sub GSL_MATRIX_SUBDIAGONAL : Tests {
103    my $matrix = gsl_matrix_alloc(4,4);
105    map { gsl_matrix_set($matrix, $_,$_, $_)     } (0..3);
107    my $view = gsl_matrix_subdiagonal($matrix, 0);
108    my $vec  = $view->swig_vector_get();
109    my @got  = map { gsl_vector_get($vec, $_) } (0..3);
110    ok_similar( [ @got ], [ 0 .. 3 ], 'gsl_matrix_subdiagonal');
113 sub GSL_MATRIX_SWAP : Tests {
114    my $self=shift;
115    map { gsl_matrix_set($self->{matrix}, $_,$_, $_ ** 2) } (0..4);
116    my $matrix = gsl_matrix_alloc(5,5);
117    map { gsl_matrix_set($matrix, $_,$_, $_) } (0..4);
118    ok_status(gsl_matrix_swap($self->{matrix}, $matrix));
120    my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
121    map { is($got[$_], $_) } (0..4);
122    @got = map { gsl_matrix_get($matrix, $_, $_) } (0..4);
123    map { is($got[$_], $_** 2) } (0..4);
126 sub GSL_MATRIX_MEMCPY : Tests {
127    my $self = shift;
128    my $matrix = gsl_matrix_alloc(5,5);
129    map { gsl_matrix_set($self->{matrix}, $_,$_, $_ ** 2) } (0..4);
130    ok_status(gsl_matrix_memcpy($matrix, $self->{matrix}));
131    ok_similar( [ map { gsl_matrix_get($matrix, $_, $_) } (0..4) ],
132                [ map {  $_** 2 } (0..4)                        ]
133    );
136 sub GSL_MATRIX_SWAP_ROWS : Tests {
137    my $self = shift;
138    map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
139    map { gsl_matrix_set($self->{matrix}, 1,$_, 3) } (0..4);
140    ok_status(gsl_matrix_swap_rows($self->{matrix}, 0, 1));
141    my @got = map { gsl_matrix_get($self->{matrix}, 1, $_) } (0..4);
142    map { is($got[$_], $_) } (0..4);
143    @got = map { gsl_matrix_get($self->{matrix}, 0, $_) } (0..4);
144    map { is($got[$_], 3) } (0..4);
147 sub GSL_MATRIX_SWAP_COLUMNS : Tests {
148    my $self = shift;
149    map { gsl_matrix_set($self->{matrix}, $_,0, $_) } (0..4);
150    map { gsl_matrix_set($self->{matrix}, $_,1, 3) } (0..4);
151    ok_status(gsl_matrix_swap_columns($self->{matrix}, 0, 1));
152    my @got = map { gsl_matrix_get($self->{matrix}, $_, 1) } (0..4);
153    map { is($got[$_], $_) } (0..4);
154    @got = map { gsl_matrix_get($self->{matrix}, $_, 0) } (0..4);
155    map { is($got[$_], 3) } (0..4);
158 sub GSL_MATRIX_SWAP_ROWCOL : Tests {
159    my $self = shift;
160    map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
161    map { gsl_matrix_set($self->{matrix}, $_,2, 2) } (0..4);
162    ok_status(gsl_matrix_swap_rowcol($self->{matrix}, 0, 2));
164    my @got = map { gsl_matrix_get($self->{matrix}, $_, 2) } (0..4);
165    is_deeply( [ @got ], [ qw/2 1 0 3 4/  ] );
167    @got = map { gsl_matrix_get($self->{matrix}, 0, $_) } (0..4);
168    is_deeply( [ @got ], [ qw/2 2 2 2 2/ ] );
171 sub GSL_MATRIX_TRANSPOSE_MEMCPY : Tests {
172    my $self = shift;
173    map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
174    my $matrix = gsl_matrix_alloc(5,5);
175    ok_status(gsl_matrix_transpose_memcpy($matrix, $self->{matrix}));
176    my @got = map { gsl_matrix_get($matrix, $_, 0) } (0..4);
177    map { is($got[$_], $_) } (0..4);
180 sub GSL_MATRIX_TRANSPOSE : Tests {
181    my $self = shift;
182    map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
183    is(gsl_matrix_transpose($self->{matrix}), 0);
184    my @got = map { gsl_matrix_get($self->{matrix}, $_, 0) } (0..4);
185    map { is($got[$_], $_) } (0..4);
188 sub GSL_MATRIX_ADD : Tests {
189    my $self = shift;
190    my $matrix = gsl_matrix_alloc(5, 5);
191    map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
192    map { gsl_matrix_set($matrix, $_, $_, $_) } (0..4);
193    is(gsl_matrix_add($self->{matrix}, $matrix), 0);
194    my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
195    map { is($got[$_], $_*2) } (0..4);
198 sub GSL_MATRIX_SUB : Tests {
199    my $self = shift;
200    my $matrix = gsl_matrix_alloc(5, 5);
201    map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
202    map { gsl_matrix_set($matrix, $_, $_, $_) } (0..4);
203    is(gsl_matrix_sub($self->{matrix}, $matrix), 0);
204    my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
205    map { is($got[$_], 0) } (0..4);
208 sub GSL_MATRIX_MUL_ELEMENTS : Tests {
209    my $self = shift;
210    my $matrix = gsl_matrix_alloc(5, 5);
211    map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
212    map { gsl_matrix_set($matrix, $_, $_, $_) } (0..4);
213    is(gsl_matrix_mul_elements($self->{matrix}, $matrix), 0);
214    my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
215    map { is($got[$_], $_**2) } (0..4);
218 sub GSL_MATRIX_DIV_ELEMENTS : Tests {
219    my $self = shift;
220    my $matrix = gsl_matrix_alloc(5, 5);
221    map { gsl_matrix_set($self->{matrix}, $_, $_, $_+1) } (0..4);
222    map { gsl_matrix_set($matrix, $_, $_, $_+1) } (0..4);
223    is(gsl_matrix_div_elements($self->{matrix}, $matrix), 0);
224    my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
225    map { is($got[$_], 1) } (0..4);
228 sub GSL_MATRIX_SCALE : Tests {
229    my $self = shift;
230    map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
231    is(gsl_matrix_scale($self->{matrix}, 4), 0);
232    my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
233    map { is($got[$_], $_*4) } (0..4);
236 sub GSL_MATRIX_ADD_CONSTANT : Tests {
237    my $self = shift;
238    map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
239    is(gsl_matrix_add_constant($self->{matrix}, 8), 0);
240    my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
241    map { is($got[$_], $_+8) } (0..4);
244 sub GSL_MATRIX_MAX : Tests {
245    my $self = shift;
246    for my $row (0..4) {
247         map { gsl_matrix_set($self->{matrix}, $row, $_, $_**2 ) } (0..4);
248    }
249    is(gsl_matrix_max($self->{matrix}), 16);
252 sub GSL_MATRIX_MIN : Tests {
253    my $self = shift;
254    for my $row (0..4) {
255         map { gsl_matrix_set($self->{matrix}, $row, $_, $_**2 ) } (0..4);
256    }
257    is(gsl_matrix_min($self->{matrix}), 0);
260 sub GSL_MATRIX_MINMAX : Test {
261    my $self = shift;
262    map { gsl_matrix_set($self->{matrix}, $_, $_, $_**2) } (0..4);
263    my ($min, $max) = gsl_matrix_minmax($self->{matrix});
264    ok_similar( [ $min, $max ], [ 0, 16], 'gsl_matrix_minmax' );
267 sub GSL_MATRIX_MAX_INDEX : Tests {
268    my $self = shift;
269    for my $row (0..3) {
270         map { gsl_matrix_set($self->{matrix}, $row, $_, $_) } (0..4);
271    }
272    map { gsl_matrix_set($self->{matrix}, $_, $_, $_**2) } (0..4);
273    my ($imax, $jmax) = gsl_matrix_max_index($self->{matrix});
274    ok_similar( [ $imax, $jmax ], [ 4, 4 ], 'gsl_matrix_max_index' );
277 sub GSL_MATRIX_MIN_INDEX : Tests {
278    my $self = shift;
279    map { gsl_matrix_set($self->{matrix}, $_, $_, $_**2) } (0..4);
280    my ($imin, $jmin) = gsl_matrix_min_index($self->{matrix});
281    ok_similar( [ $imin, $jmin ], [ 0, 0 ], 'gsl_matrix_min_index' );
285 sub GSL_MATRIX_ISNULL : Tests {
286    my $self = shift;
287    for my $line (0..4) {
288         map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4);
289    }
290    is(gsl_matrix_isnull($self->{matrix}), 1);
292    for my $line (0..4) {
293         map { gsl_matrix_set($self->{matrix}, $line, $_, $_) } (0..4);
294    }
296    is(gsl_matrix_isnull($self->{matrix}), 0);
299 sub GSL_MATRIX_ISPOS : Tests {
300    my $self = shift;
301    my $line;
303    for($line=0; $line<5; $line++) {
304    map { gsl_matrix_set($self->{matrix}, $line, $_, -1) } (0..4); }
305    is(gsl_matrix_ispos($self->{matrix}), 0);
307    for($line=0; $line<5; $line++) {
308    map { gsl_matrix_set($self->{matrix}, $line, $_, 1) } (0..4); }
309    is(gsl_matrix_ispos($self->{matrix}), 1);
311    for($line=0; $line<5; $line++) {
312    map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4); }
313    is(gsl_matrix_ispos($self->{matrix}), 0);
316 sub GSL_MATRIX_ISNEG : Tests {
317    my $self = shift;
318    my $line;
320    for($line=0; $line<5; $line++) {
321    map { gsl_matrix_set($self->{matrix}, $line, $_, -1) } (0..4); }
322    is(gsl_matrix_isneg($self->{matrix}), 1);
324    for($line=0; $line<5; $line++) {
325    map { gsl_matrix_set($self->{matrix}, $line, $_, 1) } (0..4); }
326    is(gsl_matrix_isneg($self->{matrix}), 0);
328    for($line=0; $line<5; $line++) {
329    map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4); }
330    is(gsl_matrix_isneg($self->{matrix}), 0);
333 sub GSL_MATRIX_ISNONNEG : Tests {
334     my $self = shift;
335     for my $row (0..4) {
336         map { gsl_matrix_set($self->{matrix}, $row, $_, -1) } (0..4);
337     }
338     is(gsl_matrix_isnonneg($self->{matrix}), 0);
340     for my $row (0..4) {
341         map { gsl_matrix_set($self->{matrix}, $row, $_, 1) } (0..4);
342     }
343     is(gsl_matrix_isnonneg($self->{matrix}), 1);
345     for my $row (0..4) {
346         map { gsl_matrix_set($self->{matrix}, $row, $_, 0) } (0..4);
347     }
348     is(gsl_matrix_isnonneg($self->{matrix}), 1);
352 sub GSL_MATRIX_GET_ROW : Tests {
353    my $self = shift;
354    my $vector = gsl_vector_alloc(5);
355    map { gsl_matrix_set($self->{matrix}, 0, $_, $_) } (0..4);
356    is(gsl_matrix_get_row($vector, $self->{matrix}, 0), 0);
357    map { is(gsl_vector_get($vector, $_), $_) } (0..4);
360 sub GSL_MATRIX_GET_COL : Tests {
361    my $self = shift;
362    my $vector = gsl_vector_alloc(5);
363    map { gsl_matrix_set($self->{matrix}, $_, 0, $_) } (0..4);
364    is(gsl_matrix_get_col($vector, $self->{matrix}, 0), 0);
365    map { is(gsl_vector_get($vector, $_), $_) } (0..4);
368 sub GSL_MATRIX_SET_ROW : Tests {
369    my $self = shift;
370    my $vector = gsl_vector_alloc(5);
371    map { gsl_vector_set($vector, $_, $_**2) } (0..4);
372    is(gsl_matrix_set_row($self->{matrix}, 1, $vector), 0);
374    ok_similar( [ map { gsl_matrix_get($self->{matrix}, 1, $_) } (0..4) ],
375                [ map { $_ ** 2 } (0..4) ],
376              );
379 sub GSL_MATRIX_SET_COL : Tests {
380    my $self = shift;
381    my $vector = gsl_vector_alloc(5);
382    map { gsl_vector_set($vector, $_, $_**2) } (0..4);
383    is(gsl_matrix_set_col($self->{matrix}, 1, $vector), 0);
385    ok_similar( [ map { gsl_matrix_get($self->{matrix}, $_, 1) } (0..4) ],
386                [ map { $_ ** 2 } (0..4) ],
387              );
390 sub GSL_MATRIX_FREAD_FWRITE : Tests {
391    my $self = shift;
392    for my $line (0..4) {
393         map { gsl_matrix_set($self->{matrix}, $line, $_, $_**2) } (0..4);
394    }
396    my $fh = gsl_fopen("matrix", 'w');
397    is( gsl_matrix_fwrite($fh, $self->{matrix}), 0);
398    gsl_fclose($fh);
400    for my $line (0..4) {
401         map { gsl_matrix_set($self->{matrix}, $line, $_, $_**3) } (0..4);
402    }
404    $fh = gsl_fopen("matrix", 'r');
406    is(gsl_matrix_fread($fh, $self->{matrix}), 0);
407    for my $line (0..4) {
408         ok_similar(
409                     [ map { gsl_matrix_get($self->{matrix}, $line, $_) } (0..4) ],
410                     [ map { $_**2 } (0..4) ],
411                   );
412    }
413    gsl_fclose($fh);
416 sub GSL_MATRIX_FPRINTF_FSCANF : Tests {
417    my $self = shift;
419    for my $line (0..4) {
420         map { gsl_matrix_set($self->{matrix}, $line, $_, $_**2) } (0..4);
421    }
423    my $fh = gsl_fopen("matrix", 'w');
424    is( gsl_matrix_fprintf($fh, $self->{matrix}, "%f"), 0);
425    ok_status(gsl_fclose($fh));
427    for my $line (0..4) {
428         map { gsl_matrix_set($self->{matrix}, $line, $_, $_**3) } (0..4);
429    }
431    $fh = gsl_fopen("matrix", 'r');
432    is(gsl_matrix_fscanf($fh, $self->{matrix}), 0);
433    for my $line (0..4) {
434         ok_similar(
435                     [ map { gsl_matrix_get($self->{matrix}, $line, $_) } (0..4) ],
436                     [ map { $_**2 } (0..4) ],
437                   );
438    }
439    ok_status(gsl_fclose($fh));
442 sub GSL_MATRIX_MINMAX_INDEX : Tests {
443    my $self = shift;
444    my $line;
445    for ($line = 0; $line<4; $line ++) {
446    map { gsl_matrix_set($self->{matrix}, $line, $_, $_) } (0..4); }
447    map { gsl_matrix_set($self->{matrix}, 4, $_, $_**2) } (0..4);
448    my ($imin, $jmin, $imax, $jmax) = gsl_matrix_minmax_index($self->{matrix});
449    ok_similar( [ $imin, $jmin, $imax, $jmax ], [ 0, 0, 4, 4], 'gsl_matrix_minmax_index' );
452 sub GSL_MATRIX_ADD_DIAGONAL : Tests {
453    my $self = shift;
454    map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
455    gsl_matrix_add_diagonal($self->{matrix}, 4);
456    ok_similar( [ map { gsl_matrix_get($self->{matrix}, $_, $_)} (0..4) ],
457                [ 4 .. 8 ],
458              );
461 sub GSL_MATRIX_NEW : Tests {
462    my $self = shift;
463    isa_ok( $self->{obj}, 'Math::GSL::Matrix' );
464    isa_ok( $self->{obj}->raw, 'Math::GSL::Matrix::gsl_matrix' );
465    ok( $self->{obj}->rows == 5, '->rows' );
466    ok( $self->{obj}->cols == 5, '->cols' );
469 sub AS_LIST_SQUARE : Tests {
470     my $matrix = Math::GSL::Matrix->new(5,5);
471     map { gsl_matrix_set($matrix->raw, $_, $_, 5 + $_**2) } (0..4);
472     is_deeply( [
473                 5, 0, 0, 0, 0,
474                 0, 6, 0, 0, 0,
475                 0, 0, 9, 0, 0,
476                 0, 0, 0,14, 0,
477                 0, 0, 0, 0, 21
478                 ],
479                [ $matrix->as_list],
480                '$matrix->as_list',
481     );
484 sub AS_LIST_ROW : Tests {
485     my $matrix = Math::GSL::Matrix->new(1,5);
486     map { gsl_matrix_set($matrix->raw, 0 , $_, 5 + $_**2) } (0..4);
487     is_deeply( [ 5, 6, 9, 14, 21, ],
488                [ $matrix->as_list],
489                '$matrix->as_list',
490     );
493 sub ROW : Tests {
494     my $matrix = Math::GSL::Matrix->new(5,5);
495     map { gsl_matrix_set($matrix->raw, $_, $_, 5 + $_**2) } (0..4);
496     ok_similar( [qw/0 0 9 0 0/] , [$matrix->row(2)->as_list ] );
497     map { gsl_matrix_set($matrix->raw, 0, $_, $_) } (0..4);
498     ok_similar( [qw/0 1 2 3 4/] , [$matrix->row(0)->as_list ] );
501 sub COL : Tests {
502     my $matrix = Math::GSL::Matrix->new(3,3);
503     map { gsl_matrix_set($matrix->raw, $_, $_, 7 + $_**2) } (0..2);
504     ok_similar([7,0,0], [$matrix->col(0)->as_list]);
507 sub NEW_SETS_VALUES_TO_ZERO : Tests {
508     my $matrix = Math::GSL::Matrix->new(5,5);
509     my $sum;
511     map { $sum += $_ } $matrix->as_list;
512     ok( $sum == 0, 'new sets values to zero');
515 sub SET_ROW : Tests {
516     my $m = Math::GSL::Matrix->new(3,3);
517     $m->set_row(0, [1,2,3]);
518     ok_similar([$m->row(0)->as_list], [1,2,3]);
520 sub SET_ROW_CHAINED : Tests {
521     my $m = Math::GSL::Matrix->new(3,3);
522     $m->set_row(1, [4,5,6])
523       ->set_row(2, [9,8,7]);
524     ok_similar([$m->row(1)->as_list], [4,5,6]);
525     ok_similar([$m->row(2)->as_list], [9,8,7]);
528 sub SET_COL_CHAINED : Tests {
529     my $m = Math::GSL::Matrix->new(3,3);
530     $m->set_col(1, [4,5,6])
531       ->set_col(2, [9,8,7]);
532     ok_similar([$m->col(1)->as_list], [4,5,6]);
533     ok_similar([$m->col(2)->as_list], [9,8,7]);
536 sub GSL_MATRIX_VIEW_ARRAY : Tests {
537     my $array = [8,4,3,7];
538     my $matrix_view = gsl_matrix_view_array ($array, 2,2);
539     ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 0, $_) } 0..1], [8, 4]);
540     ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 1, $_) } 0..1], [3, 7]);
543 sub GSL_MATRIX_VIEW_ARRAY_WITH_TDA : Tests {
544     my $array = [8,4,3,7,5];
545     my $matrix_view = gsl_matrix_view_array_with_tda ($array, 2,2, 3);
546     ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 0, $_) } 0..1], [8, 4]);
547     ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 1, $_) } 0..1], [7, 5]);
550 sub GSL_MATRIX_OO_ADDITION_CONSTANT : Tests {
551     my $m = Math::GSL::Matrix->new(3,3);
552     $m->set_col(1, [4,5,6])
553       ->set_col(2, [9,8,7]);
554     my $m2 = $m + 4;
555     ok_similar([$m->col(2)->as_list], [9,8,7]);
556     ok_similar([$m->col(1)->as_list], [4,5,6]);
557     ok_similar([$m->col(0)->as_list], [0,0,0]);
559     ok_similar([$m2->col(1)->as_list], [8,9,10]);
560     ok_similar([$m2->col(2)->as_list], [13,12,11]);
561     ok_similar([$m2->col(0)->as_list], [4,4,4]);
562     
563     my $m3 = 4 + $m; 
564     ok_similar([$m3->col(1)->as_list], [8,9,10]);
565     ok_similar([$m3->col(2)->as_list], [13,12,11]);
566     ok_similar([$m3->col(0)->as_list], [4,4,4]);
569 sub GSL_MATRIX_OO_ADDITION_MATRICES : Tests {
570     my $m = Math::GSL::Matrix->new(3,3);
571     $m->set_col(1, [4,5,6])
572       ->set_col(2, [9,8,7])
573       ->set_col(0, [1,2,3]);
574     my $m2 = $m + $m;
575     ok_similar([$m->col(0)->as_list], [1,2,3]);
576     ok_similar([$m->col(2)->as_list], [9,8,7]);
577     ok_similar([$m->col(1)->as_list], [4,5,6]);
579     ok_similar([$m2->col(0)->as_list], [2,4,6]);
580     ok_similar([$m2->col(1)->as_list], [8,10,12]);
581     ok_similar([$m2->col(2)->as_list], [18,16,14]);
584 sub GSL_MATRIX_OO_SUBSTRACTION_CONSTANT : Tests {
585     my $m = Math::GSL::Matrix->new(3,3);
586     $m->set_col(1, [4,5,6])
587       ->set_col(2, [9,8,7]);
588     my $m2 = $m - 4;
589     ok_similar([$m->col(2)->as_list], [9,8,7]);
590     ok_similar([$m->col(1)->as_list], [4,5,6]);
591     ok_similar([$m->col(0)->as_list], [0,0,0]);
593     ok_similar([$m2->col(1)->as_list], [0,1,2]);
594     ok_similar([$m2->col(2)->as_list], [5,4,3]);
595     ok_similar([$m2->col(0)->as_list], [-4,-4,-4]);
598 sub GSL_MATRIX_OO_SUBSTRACTION_MATRICES : Tests {
599     my $m = Math::GSL::Matrix->new(3,3);
600     my $m3 = Math::GSL::Matrix->new(3,3);
601     $m->set_col(1, [4,5,6])
602       ->set_col(2, [9,8,7])
603       ->set_col(0, [1,2,3]);
604     $m3->set_col(1, [1,2,3])
605        ->set_col(2, [9,8,7])
606        ->set_col(0, [1,2,3]);
607     my $m2 = $m - $m3;
608     ok_similar([$m->col(0)->as_list], [1,2,3]);
609     ok_similar([$m->col(2)->as_list], [9,8,7]);
610     ok_similar([$m->col(1)->as_list], [4,5,6]);
612     ok_similar([$m2->col(0)->as_list], [0,0,0]);
613     ok_similar([$m2->col(1)->as_list], [3,3,3]);
614     ok_similar([$m2->col(2)->as_list], [0,0,0]);
617 sub GSL_MATRIX_OO_MULTIPLICATION_CONSTANT : Tests {
618     my $m = Math::GSL::Matrix->new(3,3);
619     $m->set_col(1, [4,5,6])
620       ->set_col(2, [9,8,7]);
621     my $m2 = $m * 4;
622     ok_similar([$m->col(2)->as_list], [9,8,7]);
623     ok_similar([$m->col(1)->as_list], [4,5,6]);
624     ok_similar([$m->col(0)->as_list], [0,0,0]);
626     ok_similar([$m2->col(1)->as_list], [16,20,24]);
627     ok_similar([$m2->col(2)->as_list], [36,32,28]);
628     ok_similar([$m2->col(0)->as_list], [0,0,0]);
629     
630     my $m3 = 4 * $m; 
631     ok_similar([$m3->col(1)->as_list], [16,20,24]);
632     ok_similar([$m3->col(2)->as_list], [36,32,28]);
633     ok_similar([$m3->col(0)->as_list], [0,0,0]);
636 sub GSL_MATRIX_OO_MULTIPLICATION_MATRICES : Tests {
637     my $m = Math::GSL::Matrix->new(3,3);
638     my $m3 = Math::GSL::Matrix->new(3,3);
639     $m->set_col(1, [4,5,6])
640       ->set_col(2, [9,8,7])
641       ->set_col(0, [1,2,3]);
642     $m3->set_col(1, [1,2,3])
643        ->set_col(2, [9,8,7])
644        ->set_col(0, [1,2,3]);
645     my $m2 = $m * $m3;
646     ok_similar([$m->col(0)->as_list], [1,2,3]);
647     ok_similar([$m->col(2)->as_list], [9,8,7]);
648     ok_similar([$m->col(1)->as_list], [4,5,6]);
650     ok_similar([$m2->col(0)->as_list], [1,4,9]);
651     ok_similar([$m2->col(1)->as_list], [4,10,18]);
652     ok_similar([$m2->col(2)->as_list], [81,64,49]);
655 sub GSL_MATRIX_EIGENVALUES: Tests(6) {
656     my $matrix = Math::GSL::Matrix->new(2,2)
657                               ->set_row(0, [0,-1] )
658                               ->set_row(1, [1, 0] );
659     my @eigs = $matrix->eigenvalues;
660     ok_similar( [ Re($eigs[0]), Im($eigs[0]) ], [ 0,  1 ] ); #  i
661     ok_similar( [ Re($eigs[1]), Im($eigs[1]) ], [ 0, -1 ] ); # -i
663     my $rect = Math::GSL::Matrix->new(2,4);
664     dies_ok( sub { $rect->eigenvalues }, 'eigenvalues for square matrices only' );
666     my $matrix2 = Math::GSL::Matrix->new(2,2)
667                               ->set_row(0, [1, 0] )
668                               ->set_row(1, [0, 1] );
669     my @eigs2 = $matrix2->eigenvalues;
670     ok_similar( [ @eigs2 ], [ 1, 1 ] );
672     my $matrix3 = Math::GSL::Matrix->new(2,2);
673     ok_similar( [ $matrix3->eigenvalues ], [ 0, 0 ], 'zero matrix eigenvalues = 0');
675     my $matrix4 = Math::GSL::Matrix->new(2,2)
676                               ->set_row(0, [1, 3] )
677                               ->set_row(1, [4, 2] );
678     ok_similar( [ $matrix4->eigenvalues ], [ -2, 5 ] );
681 sub GSL_MATRIX_EIGENPAIR : Tests(11) {
682     my $matrix = Math::GSL::Matrix->new(2,2)
683                               ->set_row(0, [0,-1] )
684                               ->set_row(1, [1, 0] );
686     my ($eigenvalues, $eigenvectors) = $matrix->eigenpair;
687     cmp_ok( $#$eigenvalues, '==', $#$eigenvectors, 'same # of values as vectors');
689     my ($eig1,$eig2) = @$eigenvalues;
690     isa_ok( $eig1, 'Math::Complex');
691     isa_ok( $eig2, 'Math::Complex');
693     ok_similar( [ Re $eig1 ], [ 0 ] );
694     ok_similar( [ Im $eig1 ], [ 1 ] );
696     ok_similar( [ Re $eig2 ], [ 0   ] );
697     ok_similar( [ Im $eig2 ], [ -1  ] );
699     my ($u,$v)       = @$eigenvectors;
701     local $TODO = qq{working on it};
702     isa_ok( $u, 'Math::GSL::VectorComplex' );
703     isa_ok( $v, 'Math::GSL::VectorComplex' );
705     my ($u1,$u2)     = $u->as_list;
706     my ($v1,$v2)     = $v->as_list;
707     my $sqrt2by2     = sqrt(2)/2;
709     ok_similar( [ $u1, $u2], [ $sqrt2by2, - $sqrt2by2 ] );
710     ok_similar( [ $v1, $v2], [ $sqrt2by2,   $sqrt2by2 ] );
714 Test::Class->runtests;