1 package Math::GSL::Matrix::Test;
2 use Test::More tests => 225;
3 use base q{Test::Class};
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/;
16 BEGIN{ gsl_set_error_handler_off(); }
18 sub make_fixture : Test(setup) {
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 {
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 {
69 map { gsl_matrix_set($self->{matrix}, $_,$line, $_) } (0..4);
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 {
79 my $view = gsl_vector_alloc(5);
82 map { gsl_matrix_set($self->{matrix}, $line,$_, $line*$_) } (0..4);
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 {
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 {
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) ]
136 sub GSL_MATRIX_SWAP_ROWS : Tests {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
247 map { gsl_matrix_set($self->{matrix}, $row, $_, $_**2 ) } (0..4);
249 is(gsl_matrix_max($self->{matrix}), 16);
252 sub GSL_MATRIX_MIN : Tests {
255 map { gsl_matrix_set($self->{matrix}, $row, $_, $_**2 ) } (0..4);
257 is(gsl_matrix_min($self->{matrix}), 0);
260 sub GSL_MATRIX_MINMAX : Test {
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 {
270 map { gsl_matrix_set($self->{matrix}, $row, $_, $_) } (0..4);
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 {
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 {
287 for my $line (0..4) {
288 map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4);
290 is(gsl_matrix_isnull($self->{matrix}), 1);
292 for my $line (0..4) {
293 map { gsl_matrix_set($self->{matrix}, $line, $_, $_) } (0..4);
296 is(gsl_matrix_isnull($self->{matrix}), 0);
299 sub GSL_MATRIX_ISPOS : Tests {
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 {
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 {
336 map { gsl_matrix_set($self->{matrix}, $row, $_, -1) } (0..4);
338 is(gsl_matrix_isnonneg($self->{matrix}), 0);
341 map { gsl_matrix_set($self->{matrix}, $row, $_, 1) } (0..4);
343 is(gsl_matrix_isnonneg($self->{matrix}), 1);
346 map { gsl_matrix_set($self->{matrix}, $row, $_, 0) } (0..4);
348 is(gsl_matrix_isnonneg($self->{matrix}), 1);
352 sub GSL_MATRIX_GET_ROW : Tests {
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 {
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 {
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) ],
379 sub GSL_MATRIX_SET_COL : Tests {
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) ],
390 sub GSL_MATRIX_FREAD_FWRITE : Tests {
392 for my $line (0..4) {
393 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**2) } (0..4);
396 my $fh = gsl_fopen("matrix", 'w');
397 is( gsl_matrix_fwrite($fh, $self->{matrix}), 0);
400 for my $line (0..4) {
401 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**3) } (0..4);
404 $fh = gsl_fopen("matrix", 'r');
406 is(gsl_matrix_fread($fh, $self->{matrix}), 0);
407 for my $line (0..4) {
409 [ map { gsl_matrix_get($self->{matrix}, $line, $_) } (0..4) ],
410 [ map { $_**2 } (0..4) ],
416 sub GSL_MATRIX_FPRINTF_FSCANF : Tests {
419 for my $line (0..4) {
420 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**2) } (0..4);
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);
431 $fh = gsl_fopen("matrix", 'r');
432 is(gsl_matrix_fscanf($fh, $self->{matrix}), 0);
433 for my $line (0..4) {
435 [ map { gsl_matrix_get($self->{matrix}, $line, $_) } (0..4) ],
436 [ map { $_**2 } (0..4) ],
439 ok_status(gsl_fclose($fh));
442 sub GSL_MATRIX_MINMAX_INDEX : Tests {
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 {
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) ],
461 sub GSL_MATRIX_NEW : Tests {
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);
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, ],
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 ] );
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);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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;