1 package Math::GSL::Matrix::Test;
2 use base q{Test::Class};
3 use Test::More tests => 238;
7 use Math::GSL qw/:all/;
8 use Math::GSL::Test qw/:all/;
9 use Math::GSL::Matrix qw/:all/;
10 use Math::GSL::Vector qw/:all/;
11 use Math::GSL::Complex qw/:all/;
12 use Math::GSL::Errno qw/:all/;
17 BEGIN{ gsl_set_error_handler_off(); }
19 sub make_fixture : Test(setup) {
21 $self->{matrix} = gsl_matrix_alloc(5,5);
22 $self->{obj} = Math::GSL::Matrix->new(5,5);
23 gsl_matrix_set_zero($self->{matrix});
26 sub teardown : Test(teardown) {
27 unlink 'matrix' if -f 'matrix';
30 sub GSL_MATRIX_ALLOC : Tests {
31 my $matrix = gsl_matrix_alloc(5,5);
32 isa_ok($matrix, 'Math::GSL::Matrix');
35 sub GSL_MATRIX_SET : Tests {
37 map { gsl_matrix_set($self->{matrix}, $_,$_, $_ ** 2) } (0..4);
39 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
40 ok_similar( [ @got ], [ map { $_**2 } (0..4) ] );
43 sub GSL_MATRIX_CALLOC : Tests {
44 my $matrix = gsl_matrix_calloc(5,5);
45 isa_ok($matrix, 'Math::GSL::Matrix');
47 my @got = map { gsl_matrix_get($matrix, $_, $_) } (0..4);
48 ok_similar( [ @got ], [ (0) x 5 ], 'gsl_matrix_calloc' );
51 sub GSL_MATRIX_FREE : Tests {
52 my $matrix = gsl_matrix_calloc(5,5);
53 isa_ok($matrix, 'Math::GSL::Matrix');
55 is(gsl_matrix_get($matrix, 0, 0), 0);
56 gsl_matrix_free($matrix);
59 sub GSL_MATRIX_SUBMATRIX : Tests {
60 my $matrix = gsl_matrix_alloc(5,5);
61 map { gsl_matrix_set($matrix, $_,$_, $_) } (0..4);
62 my $subMatrix = gsl_matrix_submatrix($matrix, 0, 0, 2, 2);
63 my @got = map { gsl_matrix_get($matrix, $_, $_) } (0..2);
64 ok_similar( [ @got ], [ 0..2 ] );
67 sub GSL_MATRIX_ROW : Tests {
70 map { gsl_matrix_set($self->{matrix}, $_,$line, $_) } (0..4);
73 my $vector_view = gsl_matrix_row($self->{matrix}, 2);
74 my @got = map { gsl_vector_get($vector_view->{vector}, $_) } (0..4);
75 ok_similar( [ @got ], [ (2)x 5], 'gsl_matrix_row' );
78 sub GSL_MATRIX_COLUMN : Tests {
80 my $view = gsl_vector_alloc(5);
83 map { gsl_matrix_set($self->{matrix}, $line,$_, $line*$_) } (0..4);
85 $view = gsl_matrix_column($self->{matrix}, 2);
86 my $vec = $view->swig_vector_get();
88 my @got = map { gsl_vector_get($vec, $_) } (0..4);
89 ok_similar( [ @got ], [0,2,4,6,8 ], 'gsl_matrix_column' );
92 sub GSL_MATRIX_DIAGONAL : Tests {
93 my $matrix = gsl_matrix_alloc(4,4);
94 map { gsl_matrix_set($matrix, $_,$_, $_) } (0..3);
95 my $view = gsl_matrix_diagonal($matrix);
96 # better interface is needed
97 my $vec = $view->swig_vector_get();
99 my @got = map { gsl_vector_get($vec, $_) } (0..3);
100 ok_similar( [ @got ], [ 0 .. 3 ], 'gsl_matrix_diagonal');
103 sub GSL_MATRIX_SUBDIAGONAL : Tests {
104 my $matrix = gsl_matrix_alloc(4,4);
106 map { gsl_matrix_set($matrix, $_,$_, $_) } (0..3);
108 my $view = gsl_matrix_subdiagonal($matrix, 0);
109 my $vec = $view->swig_vector_get();
110 my @got = map { gsl_vector_get($vec, $_) } (0..3);
111 ok_similar( [ @got ], [ 0 .. 3 ], 'gsl_matrix_subdiagonal');
114 sub GSL_MATRIX_SWAP : Tests {
116 map { gsl_matrix_set($self->{matrix}, $_,$_, $_ ** 2) } (0..4);
117 my $matrix = gsl_matrix_alloc(5,5);
118 map { gsl_matrix_set($matrix, $_,$_, $_) } (0..4);
119 ok_status(gsl_matrix_swap($self->{matrix}, $matrix));
121 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
122 map { is($got[$_], $_) } (0..4);
123 @got = map { gsl_matrix_get($matrix, $_, $_) } (0..4);
124 map { is($got[$_], $_** 2) } (0..4);
127 sub GSL_MATRIX_MEMCPY : Tests {
129 my $matrix = gsl_matrix_alloc(5,5);
130 map { gsl_matrix_set($self->{matrix}, $_,$_, $_ ** 2) } (0..4);
131 ok_status(gsl_matrix_memcpy($matrix, $self->{matrix}));
132 ok_similar( [ map { gsl_matrix_get($matrix, $_, $_) } (0..4) ],
133 [ map { $_** 2 } (0..4) ]
137 sub GSL_MATRIX_SWAP_ROWS : Tests {
139 map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
140 map { gsl_matrix_set($self->{matrix}, 1,$_, 3) } (0..4);
141 ok_status(gsl_matrix_swap_rows($self->{matrix}, 0, 1));
142 my @got = map { gsl_matrix_get($self->{matrix}, 1, $_) } (0..4);
143 map { is($got[$_], $_) } (0..4);
144 @got = map { gsl_matrix_get($self->{matrix}, 0, $_) } (0..4);
145 map { is($got[$_], 3) } (0..4);
148 sub GSL_MATRIX_SWAP_COLUMNS : Tests {
150 map { gsl_matrix_set($self->{matrix}, $_,0, $_) } (0..4);
151 map { gsl_matrix_set($self->{matrix}, $_,1, 3) } (0..4);
152 ok_status(gsl_matrix_swap_columns($self->{matrix}, 0, 1));
153 my @got = map { gsl_matrix_get($self->{matrix}, $_, 1) } (0..4);
154 map { is($got[$_], $_) } (0..4);
155 @got = map { gsl_matrix_get($self->{matrix}, $_, 0) } (0..4);
156 map { is($got[$_], 3) } (0..4);
159 sub GSL_MATRIX_SWAP_ROWCOL : Tests {
161 map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
162 map { gsl_matrix_set($self->{matrix}, $_,2, 2) } (0..4);
163 ok_status(gsl_matrix_swap_rowcol($self->{matrix}, 0, 2));
165 my @got = map { gsl_matrix_get($self->{matrix}, $_, 2) } (0..4);
166 is_deeply( [ @got ], [ qw/2 1 0 3 4/ ] );
168 @got = map { gsl_matrix_get($self->{matrix}, 0, $_) } (0..4);
169 is_deeply( [ @got ], [ qw/2 2 2 2 2/ ] );
172 sub GSL_MATRIX_TRANSPOSE_MEMCPY : Tests {
174 map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
175 my $matrix = gsl_matrix_alloc(5,5);
176 ok_status(gsl_matrix_transpose_memcpy($matrix, $self->{matrix}));
177 my @got = map { gsl_matrix_get($matrix, $_, 0) } (0..4);
178 map { is($got[$_], $_) } (0..4);
181 sub GSL_MATRIX_TRANSPOSE : Tests {
183 map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
184 is(gsl_matrix_transpose($self->{matrix}), 0);
185 my @got = map { gsl_matrix_get($self->{matrix}, $_, 0) } (0..4);
186 map { is($got[$_], $_) } (0..4);
189 sub GSL_MATRIX_ADD : Tests {
191 my $matrix = gsl_matrix_alloc(5, 5);
192 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
193 map { gsl_matrix_set($matrix, $_, $_, $_) } (0..4);
194 is(gsl_matrix_add($self->{matrix}, $matrix), 0);
195 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
196 map { is($got[$_], $_*2) } (0..4);
199 sub GSL_MATRIX_SUB : Tests {
201 my $matrix = gsl_matrix_alloc(5, 5);
202 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
203 map { gsl_matrix_set($matrix, $_, $_, $_) } (0..4);
204 is(gsl_matrix_sub($self->{matrix}, $matrix), 0);
205 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
206 map { is($got[$_], 0) } (0..4);
209 sub GSL_MATRIX_MUL_ELEMENTS : Tests {
211 my $matrix = gsl_matrix_alloc(5, 5);
212 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
213 map { gsl_matrix_set($matrix, $_, $_, $_) } (0..4);
214 is(gsl_matrix_mul_elements($self->{matrix}, $matrix), 0);
215 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
216 map { is($got[$_], $_**2) } (0..4);
219 sub GSL_MATRIX_DIV_ELEMENTS : Tests {
221 my $matrix = gsl_matrix_alloc(5, 5);
222 map { gsl_matrix_set($self->{matrix}, $_, $_, $_+1) } (0..4);
223 map { gsl_matrix_set($matrix, $_, $_, $_+1) } (0..4);
224 is(gsl_matrix_div_elements($self->{matrix}, $matrix), 0);
225 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
226 map { is($got[$_], 1) } (0..4);
229 sub GSL_MATRIX_SCALE : Tests {
231 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
232 is(gsl_matrix_scale($self->{matrix}, 4), 0);
233 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
234 map { is($got[$_], $_*4) } (0..4);
237 sub GSL_MATRIX_ADD_CONSTANT : Tests {
239 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
240 is(gsl_matrix_add_constant($self->{matrix}, 8), 0);
241 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
242 map { is($got[$_], $_+8) } (0..4);
245 sub GSL_MATRIX_MAX : Tests {
248 map { gsl_matrix_set($self->{matrix}, $row, $_, $_**2 ) } (0..4);
250 is(gsl_matrix_max($self->{matrix}), 16);
253 sub GSL_MATRIX_MIN : Tests {
256 map { gsl_matrix_set($self->{matrix}, $row, $_, $_**2 ) } (0..4);
258 is(gsl_matrix_min($self->{matrix}), 0);
261 sub GSL_MATRIX_MINMAX : Test {
263 map { gsl_matrix_set($self->{matrix}, $_, $_, $_**2) } (0..4);
264 my ($min, $max) = gsl_matrix_minmax($self->{matrix});
265 ok_similar( [ $min, $max ], [ 0, 16], 'gsl_matrix_minmax' );
268 sub GSL_MATRIX_MAX_INDEX : Tests {
271 map { gsl_matrix_set($self->{matrix}, $row, $_, $_) } (0..4);
273 map { gsl_matrix_set($self->{matrix}, $_, $_, $_**2) } (0..4);
274 my ($imax, $jmax) = gsl_matrix_max_index($self->{matrix});
275 ok_similar( [ $imax, $jmax ], [ 4, 4 ], 'gsl_matrix_max_index' );
278 sub GSL_MATRIX_MIN_INDEX : Tests {
280 map { gsl_matrix_set($self->{matrix}, $_, $_, $_**2) } (0..4);
281 my ($imin, $jmin) = gsl_matrix_min_index($self->{matrix});
282 ok_similar( [ $imin, $jmin ], [ 0, 0 ], 'gsl_matrix_min_index' );
286 sub GSL_MATRIX_ISNULL : Tests {
288 for my $line (0..4) {
289 map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4);
291 is(gsl_matrix_isnull($self->{matrix}), 1);
293 for my $line (0..4) {
294 map { gsl_matrix_set($self->{matrix}, $line, $_, $_) } (0..4);
297 is(gsl_matrix_isnull($self->{matrix}), 0);
300 sub GSL_MATRIX_ISPOS : Tests {
304 for($line=0; $line<5; $line++) {
305 map { gsl_matrix_set($self->{matrix}, $line, $_, -1) } (0..4); }
306 is(gsl_matrix_ispos($self->{matrix}), 0);
308 for($line=0; $line<5; $line++) {
309 map { gsl_matrix_set($self->{matrix}, $line, $_, 1) } (0..4); }
310 is(gsl_matrix_ispos($self->{matrix}), 1);
312 for($line=0; $line<5; $line++) {
313 map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4); }
314 is(gsl_matrix_ispos($self->{matrix}), 0);
317 sub GSL_MATRIX_ISNEG : Tests {
321 for($line=0; $line<5; $line++) {
322 map { gsl_matrix_set($self->{matrix}, $line, $_, -1) } (0..4); }
323 is(gsl_matrix_isneg($self->{matrix}), 1);
325 for($line=0; $line<5; $line++) {
326 map { gsl_matrix_set($self->{matrix}, $line, $_, 1) } (0..4); }
327 is(gsl_matrix_isneg($self->{matrix}), 0);
329 for($line=0; $line<5; $line++) {
330 map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4); }
331 is(gsl_matrix_isneg($self->{matrix}), 0);
334 sub GSL_MATRIX_ISNONNEG : Tests {
337 map { gsl_matrix_set($self->{matrix}, $row, $_, -1) } (0..4);
339 is(gsl_matrix_isnonneg($self->{matrix}), 0);
342 map { gsl_matrix_set($self->{matrix}, $row, $_, 1) } (0..4);
344 is(gsl_matrix_isnonneg($self->{matrix}), 1);
347 map { gsl_matrix_set($self->{matrix}, $row, $_, 0) } (0..4);
349 is(gsl_matrix_isnonneg($self->{matrix}), 1);
353 sub GSL_MATRIX_GET_ROW : Tests {
355 my $vector = gsl_vector_alloc(5);
356 map { gsl_matrix_set($self->{matrix}, 0, $_, $_) } (0..4);
357 is(gsl_matrix_get_row($vector, $self->{matrix}, 0), 0);
358 map { is(gsl_vector_get($vector, $_), $_) } (0..4);
361 sub GSL_MATRIX_GET_COL : Tests {
363 my $vector = gsl_vector_alloc(5);
364 map { gsl_matrix_set($self->{matrix}, $_, 0, $_) } (0..4);
365 is(gsl_matrix_get_col($vector, $self->{matrix}, 0), 0);
366 map { is(gsl_vector_get($vector, $_), $_) } (0..4);
369 sub GSL_MATRIX_SET_ROW : Tests {
371 my $vector = gsl_vector_alloc(5);
372 map { gsl_vector_set($vector, $_, $_**2) } (0..4);
373 is(gsl_matrix_set_row($self->{matrix}, 1, $vector), 0);
375 ok_similar( [ map { gsl_matrix_get($self->{matrix}, 1, $_) } (0..4) ],
376 [ map { $_ ** 2 } (0..4) ],
380 sub GSL_MATRIX_SET_COL : Tests {
382 my $vector = gsl_vector_alloc(5);
383 map { gsl_vector_set($vector, $_, $_**2) } (0..4);
384 is(gsl_matrix_set_col($self->{matrix}, 1, $vector), 0);
386 ok_similar( [ map { gsl_matrix_get($self->{matrix}, $_, 1) } (0..4) ],
387 [ map { $_ ** 2 } (0..4) ],
391 sub GSL_MATRIX_FREAD_FWRITE : Tests {
393 for my $line (0..4) {
394 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**2) } (0..4);
397 my $fh = gsl_fopen("matrix", 'w');
398 is( gsl_matrix_fwrite($fh, $self->{matrix}), 0);
401 for my $line (0..4) {
402 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**3) } (0..4);
405 $fh = gsl_fopen("matrix", 'r');
407 is(gsl_matrix_fread($fh, $self->{matrix}), 0);
408 for my $line (0..4) {
410 [ map { gsl_matrix_get($self->{matrix}, $line, $_) } (0..4) ],
411 [ map { $_**2 } (0..4) ],
417 sub GSL_MATRIX_FPRINTF_FSCANF : Tests {
420 for my $line (0..4) {
421 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**2) } (0..4);
424 my $fh = gsl_fopen("matrix", 'w');
425 is( gsl_matrix_fprintf($fh, $self->{matrix}, "%f"), 0);
426 ok_status(gsl_fclose($fh));
428 for my $line (0..4) {
429 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**3) } (0..4);
432 $fh = gsl_fopen("matrix", 'r');
433 is(gsl_matrix_fscanf($fh, $self->{matrix}), 0);
434 for my $line (0..4) {
436 [ map { gsl_matrix_get($self->{matrix}, $line, $_) } (0..4) ],
437 [ map { $_**2 } (0..4) ],
440 ok_status(gsl_fclose($fh));
443 sub GSL_MATRIX_MINMAX_INDEX : Tests {
446 for ($line = 0; $line<4; $line ++) {
447 map { gsl_matrix_set($self->{matrix}, $line, $_, $_) } (0..4); }
448 map { gsl_matrix_set($self->{matrix}, 4, $_, $_**2) } (0..4);
449 my ($imin, $jmin, $imax, $jmax) = gsl_matrix_minmax_index($self->{matrix});
450 ok_similar( [ $imin, $jmin, $imax, $jmax ], [ 0, 0, 4, 4], 'gsl_matrix_minmax_index' );
453 sub GSL_MATRIX_ADD_DIAGONAL : Tests {
455 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
456 gsl_matrix_add_diagonal($self->{matrix}, 4);
457 ok_similar( [ map { gsl_matrix_get($self->{matrix}, $_, $_)} (0..4) ],
462 sub GSL_MATRIX_NEW : Tests {
464 isa_ok( $self->{obj}, 'Math::GSL::Matrix' );
465 isa_ok( $self->{obj}->raw, 'Math::GSL::Matrix::gsl_matrix' );
466 ok( $self->{obj}->rows == 5, '->rows' );
467 ok( $self->{obj}->cols == 5, '->cols' );
470 sub AS_LIST_SQUARE : Tests {
471 my $matrix = Math::GSL::Matrix->new(5,5);
472 map { gsl_matrix_set($matrix->raw, $_, $_, 5 + $_**2) } (0..4);
485 sub AS_LIST_ROW : Tests {
486 my $matrix = Math::GSL::Matrix->new(1,5);
487 map { gsl_matrix_set($matrix->raw, 0 , $_, 5 + $_**2) } (0..4);
488 is_deeply( [ 5, 6, 9, 14, 21, ],
495 my $matrix = Math::GSL::Matrix->new(5,5);
496 map { gsl_matrix_set($matrix->raw, $_, $_, 5 + $_**2) } (0..4);
497 ok_similar( [qw/0 0 9 0 0/] , [$matrix->row(2)->as_list ] );
498 map { gsl_matrix_set($matrix->raw, 0, $_, $_) } (0..4);
499 ok_similar( [qw/0 1 2 3 4/] , [$matrix->row(0)->as_list ] );
503 my $matrix = Math::GSL::Matrix->new(3,3);
504 map { gsl_matrix_set($matrix->raw, $_, $_, 7 + $_**2) } (0..2);
505 ok_similar([7,0,0], [$matrix->col(0)->as_list]);
508 sub NEW_SETS_VALUES_TO_ZERO : Tests {
509 my $matrix = Math::GSL::Matrix->new(5,5);
512 map { $sum += $_ } $matrix->as_list;
513 ok( $sum == 0, 'new sets values to zero');
516 sub SET_ROW : Tests {
517 my $m = Math::GSL::Matrix->new(3,3);
518 $m->set_row(0, [1,2,3]);
519 ok_similar([$m->row(0)->as_list], [1,2,3]);
521 sub SET_ROW_CHAINED : Tests {
522 my $m = Math::GSL::Matrix->new(3,3);
523 $m->set_row(1, [4,5,6])
524 ->set_row(2, [9,8,7]);
525 ok_similar([$m->row(1)->as_list], [4,5,6]);
526 ok_similar([$m->row(2)->as_list], [9,8,7]);
529 sub SET_COL_CHAINED : Tests {
530 my $m = Math::GSL::Matrix->new(3,3);
531 $m->set_col(1, [4,5,6])
532 ->set_col(2, [9,8,7]);
533 ok_similar([$m->col(1)->as_list], [4,5,6]);
534 ok_similar([$m->col(2)->as_list], [9,8,7]);
537 sub GSL_MATRIX_VIEW_ARRAY : Tests {
538 local $TODO = "memory management for view_array* functions is being worked on";
539 my $array = [8,4,3,7];
540 my $matrix_view = gsl_matrix_view_array ($array, 2,2);
541 ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 0, $_) } 0..1], [8, 4]);
542 ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 1, $_) } 0..1], [3, 7]);
545 sub GSL_MATRIX_VIEW_ARRAY_WITH_TDA : Tests {
546 local $TODO = "memory management for view_array* functions is being worked on";
547 my $array = [8,4,3,7,5];
548 my $matrix_view = gsl_matrix_view_array_with_tda ($array, 2,2, 3);
549 ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 0, $_) } 0..1], [8, 4]);
550 ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 1, $_) } 0..1], [7, 5]);
553 sub GSL_MATRIX_OO_ADDITION_CONSTANT : Tests {
554 my $m = Math::GSL::Matrix->new(3,3);
555 $m->set_col(1, [4,5,6])
556 ->set_col(2, [9,8,7]);
558 ok_similar([$m->col(2)->as_list], [9,8,7]);
559 ok_similar([$m->col(1)->as_list], [4,5,6]);
560 ok_similar([$m->col(0)->as_list], [0,0,0]);
562 ok_similar([$m2->col(1)->as_list], [8,9,10]);
563 ok_similar([$m2->col(2)->as_list], [13,12,11]);
564 ok_similar([$m2->col(0)->as_list], [4,4,4]);
567 ok_similar([$m3->col(1)->as_list], [8,9,10]);
568 ok_similar([$m3->col(2)->as_list], [13,12,11]);
569 ok_similar([$m3->col(0)->as_list], [4,4,4]);
572 sub GSL_MATRIX_OO_ADDITION_MATRICES : Tests {
573 my $m = Math::GSL::Matrix->new(3,3);
574 $m->set_col(1, [4,5,6])
575 ->set_col(2, [9,8,7])
576 ->set_col(0, [1,2,3]);
578 ok_similar([$m->col(0)->as_list], [1,2,3]);
579 ok_similar([$m->col(2)->as_list], [9,8,7]);
580 ok_similar([$m->col(1)->as_list], [4,5,6]);
582 ok_similar([$m2->col(0)->as_list], [2,4,6]);
583 ok_similar([$m2->col(1)->as_list], [8,10,12]);
584 ok_similar([$m2->col(2)->as_list], [18,16,14]);
587 sub GSL_MATRIX_OO_SUBSTRACTION_CONSTANT : Tests {
588 my $m = Math::GSL::Matrix->new(3,3);
589 $m->set_col(1, [4,5,6])
590 ->set_col(2, [9,8,7]);
592 ok_similar([$m->col(2)->as_list], [9,8,7]);
593 ok_similar([$m->col(1)->as_list], [4,5,6]);
594 ok_similar([$m->col(0)->as_list], [0,0,0]);
596 ok_similar([$m2->col(1)->as_list], [0,1,2]);
597 ok_similar([$m2->col(2)->as_list], [5,4,3]);
598 ok_similar([$m2->col(0)->as_list], [-4,-4,-4]);
601 sub GSL_MATRIX_OO_SUBSTRACTION_MATRICES : Tests {
602 my $m = Math::GSL::Matrix->new(3,3);
603 my $m3 = Math::GSL::Matrix->new(3,3);
604 $m->set_col(1, [4,5,6])
605 ->set_col(2, [9,8,7])
606 ->set_col(0, [1,2,3]);
607 $m3->set_col(1, [1,2,3])
608 ->set_col(2, [9,8,7])
609 ->set_col(0, [1,2,3]);
611 ok_similar([$m->col(0)->as_list], [1,2,3]);
612 ok_similar([$m->col(2)->as_list], [9,8,7]);
613 ok_similar([$m->col(1)->as_list], [4,5,6]);
615 ok_similar([$m2->col(0)->as_list], [0,0,0]);
616 ok_similar([$m2->col(1)->as_list], [3,3,3]);
617 ok_similar([$m2->col(2)->as_list], [0,0,0]);
620 sub GSL_MATRIX_OO_MULTIPLICATION_CONSTANT : Tests {
621 my $m = Math::GSL::Matrix->new(3,3);
622 $m->set_col(1, [4,5,6])
623 ->set_col(2, [9,8,7]);
625 ok_similar([$m->col(2)->as_list], [9,8,7]);
626 ok_similar([$m->col(1)->as_list], [4,5,6]);
627 ok_similar([$m->col(0)->as_list], [0,0,0]);
629 ok_similar([$m2->col(1)->as_list], [16,20,24]);
630 ok_similar([$m2->col(2)->as_list], [36,32,28]);
631 ok_similar([$m2->col(0)->as_list], [0,0,0]);
634 ok_similar([$m3->col(1)->as_list], [16,20,24]);
635 ok_similar([$m3->col(2)->as_list], [36,32,28]);
636 ok_similar([$m3->col(0)->as_list], [0,0,0]);
639 sub GSL_MATRIX_EIGENVALUES: Tests(6) {
640 my $matrix = Math::GSL::Matrix->new(2,2)
641 ->set_row(0, [0,-1] )
642 ->set_row(1, [1, 0] );
643 my @eigs = $matrix->eigenvalues;
644 ok_similar( [ Re($eigs[0]), Im($eigs[0]) ], [ 0, 1 ] ); # i
645 ok_similar( [ Re($eigs[1]), Im($eigs[1]) ], [ 0, -1 ] ); # -i
647 my $rect = Math::GSL::Matrix->new(2,4);
648 dies_ok( sub { $rect->eigenvalues }, 'eigenvalues for square matrices only' );
650 my $matrix2 = Math::GSL::Matrix->new(2,2)
651 ->set_row(0, [1, 0] )
652 ->set_row(1, [0, 1] );
653 my @eigs2 = $matrix2->eigenvalues;
654 ok_similar( [ @eigs2 ], [ 1, 1 ] );
656 my $matrix3 = Math::GSL::Matrix->new(2,2);
657 ok_similar( [ $matrix3->eigenvalues ], [ 0, 0 ], 'zero matrix eigenvalues = 0');
659 my $matrix4 = Math::GSL::Matrix->new(2,2)
660 ->set_row(0, [1, 3] )
661 ->set_row(1, [4, 2] );
662 ok_similar( [ $matrix4->eigenvalues ], [ -2, 5 ] );
665 sub GSL_MATRIX_EIGENPAIR : Tests(11) {
666 my $matrix = Math::GSL::Matrix->new(2,2)
667 ->set_row(0, [0,-1] )
668 ->set_row(1, [1, 0] );
670 my ($eigenvalues, $eigenvectors) = $matrix->eigenpair;
671 cmp_ok( $#$eigenvalues, '==', $#$eigenvectors, 'same # of values as vectors');
673 my ($eig1,$eig2) = @$eigenvalues;
674 isa_ok( $eig1, 'Math::Complex');
675 isa_ok( $eig2, 'Math::Complex');
677 ok_similar( [ Re $eig1 ], [ 0 ] );
678 ok_similar( [ Im $eig1 ], [ 1 ] );
680 ok_similar( [ Re $eig2 ], [ 0 ] );
681 ok_similar( [ Im $eig2 ], [ -1 ] );
683 my ($u,$v) = @$eigenvectors;
685 isa_ok( $u, 'Math::GSL::VectorComplex' );
686 isa_ok( $v, 'Math::GSL::VectorComplex' );
688 local $TODO = qq{ VectorComplex->as_list is funky };
689 # we happen to know that these are real eigenvectors
690 my ($u1,$u2) = map { Re $_ } $u->as_list;
691 my ($v1,$v2) = map { Re $_ } $v->as_list;
692 my $sqrt2by2 = sqrt(2)/2;
694 ok_similar( [ $u1, $u2 ], [ $sqrt2by2, - $sqrt2by2 ] );
695 ok_similar( [ $v1, $v2 ], [ $sqrt2by2, $sqrt2by2 ] );
698 sub GSL_MATRIX_EIGENPAIR_RT45044 : Tests(1) {
699 my $matrix = Math::GSL::Matrix->new(3,3)
700 ->set_row(0, [1,0,0] )
701 ->set_row(1, [0,1,0] )
702 ->set_row(2, [0,0,1] );
703 my ($eigs, $eigv) = $matrix->eigenpair;
704 cmp_ok( scalar(@$eigv), '==', 3, 'got 3 eigenvectors');
707 sub MATRIX_MULTIPLICATION_OVERLOAD : Tests {
708 my $A = Math::GSL::Matrix->new(2,2)
710 ->set_row(1, [4, 2] );
711 my $B = Math::GSL::Matrix->new(2,2)
713 ->set_row(1, [1, 3] );
715 ok_similar([ $C->as_list ], [5, 14, 10, 26 ]);
718 sub MATRIX_IS_SQUARE : Tests(2) {
719 my $A = Math::GSL::Matrix->new(2,2);
720 ok( $A->is_square, 'is_square true for 2x2' );
721 my $B = Math::GSL::Matrix->new(2,3);
722 ok( ! $B->is_square, 'is_square false for 2x3' );
725 sub MATRIX_DETERMINANT : Tests(2) {
726 my $A = Math::GSL::Matrix->new(2,2)
728 ->set_row(1, [4, 2] );
730 ok_similar( [ $A->det ], [ -10 ], '->det() 2x2');
731 ok_similar( [ $A->lndet ], [ log 10 ], '->lndet() 2x2');
735 sub MATRIX_ZERO : Tests(2) {
736 my $A = Math::GSL::Matrix->new(2,2)
737 ->set_row(0, [1, 3] )
738 ->set_row(1, [4, 2] );
739 isa_ok($A->zero, 'Math::GSL::Matrix');
740 ok_similar( [ $A->zero->as_list ], [ 0, 0, 0, 0 ] );
743 sub MATRIX_IDENTITY : Tests(6) {
744 my $A = Math::GSL::Matrix->new(2,2)->identity;
745 isa_ok($A, 'Math::GSL::Matrix');
746 ok_similar([ $A->as_list ], [ 1, 0, 0, 1 ] );
747 ok_similar([ $A->inverse->as_list ], [ 1, 0, 0, 1 ] );
748 ok_similar([ $A->det ] ,[ 1 ] );
749 ok_similar([ map { Re $_ } $A->eigenvalues ], [ 1, 1 ], 'identity eigs=1' );
750 ok_similar([ map { Im $_ } $A->eigenvalues ], [ 0, 0 ], 'identity eigs=1' );
753 sub MATRIX_INVERSE : Tests(3) {
754 my $A = Math::GSL::Matrix->new(2,2)
755 ->set_row(0, [1, 3] )
756 ->set_row(1, [4, 2] );
757 my $Ainv = $A->inverse;
758 isa_ok( $Ainv, 'Math::GSL::Matrix' );
759 ok_similar([ $Ainv->as_list ] , [ map { -$_/10 } ( 2, -3, -4, 1 ) ] );
760 my $B = Math::GSL::Matrix->new(2,3)
761 ->set_row(0, [1, 3, 5] )
762 ->set_row(1, [2, 4, 6] );
763 dies_ok( sub { $B->inverse } , 'inverse of non square matrix dies' );
766 sub OVERLOAD_EQUAL : Tests(2) {
767 my $A = Math::GSL::Matrix->new(2,2)
768 ->set_row(0, [1, 3] )
769 ->set_row(1, [4, 2] );
771 ok ( $A == $B, 'should be equal');
772 $B->set_row(0, [1,2]);
773 ok ( $A != $B, 'should not be equal');
776 Test::Class->runtests;