1 package Math::GSL::Matrix::Test;
2 use Test::More tests => 225;
3 use base q{Test::Class};
4 <<<<<<< HEAD:t/Matrix.t
5 use Test::More tests => 228;
9 >>>>>>> 4e0e3a8fa228328f7a909236708b409b8f8aa406:t/Matrix.t
10 use Math::GSL qw/:all/;
11 use Math::GSL::Test qw/:all/;
12 use Math::GSL::Matrix qw/:all/;
13 use Math::GSL::Vector qw/:all/;
14 use Math::GSL::Complex qw/:all/;
15 use Math::GSL::Errno qw/:all/;
20 BEGIN{ gsl_set_error_handler_off(); }
22 sub make_fixture : Test(setup) {
24 $self->{matrix} = gsl_matrix_alloc(5,5);
25 $self->{obj} = Math::GSL::Matrix->new(5,5);
26 gsl_matrix_set_zero($self->{matrix});
29 sub teardown : Test(teardown) {
30 unlink 'matrix' if -f 'matrix';
33 sub GSL_MATRIX_ALLOC : Tests {
34 my $matrix = gsl_matrix_alloc(5,5);
35 isa_ok($matrix, 'Math::GSL::Matrix');
38 sub GSL_MATRIX_SET : Tests {
40 map { gsl_matrix_set($self->{matrix}, $_,$_, $_ ** 2) } (0..4);
42 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
43 ok_similar( [ @got ], [ map { $_**2 } (0..4) ] );
46 sub GSL_MATRIX_CALLOC : Tests {
47 my $matrix = gsl_matrix_calloc(5,5);
48 isa_ok($matrix, 'Math::GSL::Matrix');
50 my @got = map { gsl_matrix_get($matrix, $_, $_) } (0..4);
51 ok_similar( [ @got ], [ (0) x 5 ], 'gsl_matrix_calloc' );
54 sub GSL_MATRIX_FREE : Tests {
55 my $matrix = gsl_matrix_calloc(5,5);
56 isa_ok($matrix, 'Math::GSL::Matrix');
58 is(gsl_matrix_get($matrix, 0, 0), 0);
59 gsl_matrix_free($matrix);
62 sub GSL_MATRIX_SUBMATRIX : Tests {
63 my $matrix = gsl_matrix_alloc(5,5);
64 map { gsl_matrix_set($matrix, $_,$_, $_) } (0..4);
65 my $subMatrix = gsl_matrix_submatrix($matrix, 0, 0, 2, 2);
66 my @got = map { gsl_matrix_get($matrix, $_, $_) } (0..2);
67 ok_similar( [ @got ], [ 0..2 ] );
70 sub GSL_MATRIX_ROW : Tests {
73 map { gsl_matrix_set($self->{matrix}, $_,$line, $_) } (0..4);
76 my $vector_view = gsl_matrix_row($self->{matrix}, 2);
77 my @got = map { gsl_vector_get($vector_view->{vector}, $_) } (0..4);
78 ok_similar( [ @got ], [ (2)x 5], 'gsl_matrix_row' );
81 sub GSL_MATRIX_COLUMN : Tests {
83 my $view = gsl_vector_alloc(5);
86 map { gsl_matrix_set($self->{matrix}, $line,$_, $line*$_) } (0..4);
88 $view = gsl_matrix_column($self->{matrix}, 2);
89 my $vec = $view->swig_vector_get();
91 my @got = map { gsl_vector_get($vec, $_) } (0..4);
92 ok_similar( [ @got ], [0,2,4,6,8 ], 'gsl_matrix_column' );
95 sub GSL_MATRIX_DIAGONAL : Tests {
96 my $matrix = gsl_matrix_alloc(4,4);
97 map { gsl_matrix_set($matrix, $_,$_, $_) } (0..3);
98 my $view = gsl_matrix_diagonal($matrix);
99 # better interface is needed
100 my $vec = $view->swig_vector_get();
102 my @got = map { gsl_vector_get($vec, $_) } (0..3);
103 ok_similar( [ @got ], [ 0 .. 3 ], 'gsl_matrix_diagonal');
106 sub GSL_MATRIX_SUBDIAGONAL : Tests {
107 my $matrix = gsl_matrix_alloc(4,4);
109 map { gsl_matrix_set($matrix, $_,$_, $_) } (0..3);
111 my $view = gsl_matrix_subdiagonal($matrix, 0);
112 my $vec = $view->swig_vector_get();
113 my @got = map { gsl_vector_get($vec, $_) } (0..3);
114 ok_similar( [ @got ], [ 0 .. 3 ], 'gsl_matrix_subdiagonal');
117 sub GSL_MATRIX_SWAP : Tests {
119 map { gsl_matrix_set($self->{matrix}, $_,$_, $_ ** 2) } (0..4);
120 my $matrix = gsl_matrix_alloc(5,5);
121 map { gsl_matrix_set($matrix, $_,$_, $_) } (0..4);
122 ok_status(gsl_matrix_swap($self->{matrix}, $matrix));
124 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
125 map { is($got[$_], $_) } (0..4);
126 @got = map { gsl_matrix_get($matrix, $_, $_) } (0..4);
127 map { is($got[$_], $_** 2) } (0..4);
130 sub GSL_MATRIX_MEMCPY : Tests {
132 my $matrix = gsl_matrix_alloc(5,5);
133 map { gsl_matrix_set($self->{matrix}, $_,$_, $_ ** 2) } (0..4);
134 ok_status(gsl_matrix_memcpy($matrix, $self->{matrix}));
135 ok_similar( [ map { gsl_matrix_get($matrix, $_, $_) } (0..4) ],
136 [ map { $_** 2 } (0..4) ]
140 sub GSL_MATRIX_SWAP_ROWS : Tests {
142 map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
143 map { gsl_matrix_set($self->{matrix}, 1,$_, 3) } (0..4);
144 ok_status(gsl_matrix_swap_rows($self->{matrix}, 0, 1));
145 my @got = map { gsl_matrix_get($self->{matrix}, 1, $_) } (0..4);
146 map { is($got[$_], $_) } (0..4);
147 @got = map { gsl_matrix_get($self->{matrix}, 0, $_) } (0..4);
148 map { is($got[$_], 3) } (0..4);
151 sub GSL_MATRIX_SWAP_COLUMNS : Tests {
153 map { gsl_matrix_set($self->{matrix}, $_,0, $_) } (0..4);
154 map { gsl_matrix_set($self->{matrix}, $_,1, 3) } (0..4);
155 ok_status(gsl_matrix_swap_columns($self->{matrix}, 0, 1));
156 my @got = map { gsl_matrix_get($self->{matrix}, $_, 1) } (0..4);
157 map { is($got[$_], $_) } (0..4);
158 @got = map { gsl_matrix_get($self->{matrix}, $_, 0) } (0..4);
159 map { is($got[$_], 3) } (0..4);
162 sub GSL_MATRIX_SWAP_ROWCOL : Tests {
164 map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
165 map { gsl_matrix_set($self->{matrix}, $_,2, 2) } (0..4);
166 ok_status(gsl_matrix_swap_rowcol($self->{matrix}, 0, 2));
168 my @got = map { gsl_matrix_get($self->{matrix}, $_, 2) } (0..4);
169 is_deeply( [ @got ], [ qw/2 1 0 3 4/ ] );
171 @got = map { gsl_matrix_get($self->{matrix}, 0, $_) } (0..4);
172 is_deeply( [ @got ], [ qw/2 2 2 2 2/ ] );
175 sub GSL_MATRIX_TRANSPOSE_MEMCPY : Tests {
177 map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
178 my $matrix = gsl_matrix_alloc(5,5);
179 ok_status(gsl_matrix_transpose_memcpy($matrix, $self->{matrix}));
180 my @got = map { gsl_matrix_get($matrix, $_, 0) } (0..4);
181 map { is($got[$_], $_) } (0..4);
184 sub GSL_MATRIX_TRANSPOSE : Tests {
186 map { gsl_matrix_set($self->{matrix}, 0,$_, $_) } (0..4);
187 is(gsl_matrix_transpose($self->{matrix}), 0);
188 my @got = map { gsl_matrix_get($self->{matrix}, $_, 0) } (0..4);
189 map { is($got[$_], $_) } (0..4);
192 sub GSL_MATRIX_ADD : Tests {
194 my $matrix = gsl_matrix_alloc(5, 5);
195 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
196 map { gsl_matrix_set($matrix, $_, $_, $_) } (0..4);
197 is(gsl_matrix_add($self->{matrix}, $matrix), 0);
198 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
199 map { is($got[$_], $_*2) } (0..4);
202 sub GSL_MATRIX_SUB : Tests {
204 my $matrix = gsl_matrix_alloc(5, 5);
205 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
206 map { gsl_matrix_set($matrix, $_, $_, $_) } (0..4);
207 is(gsl_matrix_sub($self->{matrix}, $matrix), 0);
208 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
209 map { is($got[$_], 0) } (0..4);
212 sub GSL_MATRIX_MUL_ELEMENTS : Tests {
214 my $matrix = gsl_matrix_alloc(5, 5);
215 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
216 map { gsl_matrix_set($matrix, $_, $_, $_) } (0..4);
217 is(gsl_matrix_mul_elements($self->{matrix}, $matrix), 0);
218 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
219 map { is($got[$_], $_**2) } (0..4);
222 sub GSL_MATRIX_DIV_ELEMENTS : Tests {
224 my $matrix = gsl_matrix_alloc(5, 5);
225 map { gsl_matrix_set($self->{matrix}, $_, $_, $_+1) } (0..4);
226 map { gsl_matrix_set($matrix, $_, $_, $_+1) } (0..4);
227 is(gsl_matrix_div_elements($self->{matrix}, $matrix), 0);
228 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
229 map { is($got[$_], 1) } (0..4);
232 sub GSL_MATRIX_SCALE : Tests {
234 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
235 is(gsl_matrix_scale($self->{matrix}, 4), 0);
236 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
237 map { is($got[$_], $_*4) } (0..4);
240 sub GSL_MATRIX_ADD_CONSTANT : Tests {
242 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
243 is(gsl_matrix_add_constant($self->{matrix}, 8), 0);
244 my @got = map { gsl_matrix_get($self->{matrix}, $_, $_) } (0..4);
245 map { is($got[$_], $_+8) } (0..4);
248 sub GSL_MATRIX_MAX : Tests {
251 map { gsl_matrix_set($self->{matrix}, $row, $_, $_**2 ) } (0..4);
253 is(gsl_matrix_max($self->{matrix}), 16);
256 sub GSL_MATRIX_MIN : Tests {
259 map { gsl_matrix_set($self->{matrix}, $row, $_, $_**2 ) } (0..4);
261 is(gsl_matrix_min($self->{matrix}), 0);
264 sub GSL_MATRIX_MINMAX : Test {
266 map { gsl_matrix_set($self->{matrix}, $_, $_, $_**2) } (0..4);
267 my ($min, $max) = gsl_matrix_minmax($self->{matrix});
268 ok_similar( [ $min, $max ], [ 0, 16], 'gsl_matrix_minmax' );
271 sub GSL_MATRIX_MAX_INDEX : Tests {
274 map { gsl_matrix_set($self->{matrix}, $row, $_, $_) } (0..4);
276 map { gsl_matrix_set($self->{matrix}, $_, $_, $_**2) } (0..4);
277 my ($imax, $jmax) = gsl_matrix_max_index($self->{matrix});
278 ok_similar( [ $imax, $jmax ], [ 4, 4 ], 'gsl_matrix_max_index' );
281 sub GSL_MATRIX_MIN_INDEX : Tests {
283 map { gsl_matrix_set($self->{matrix}, $_, $_, $_**2) } (0..4);
284 my ($imin, $jmin) = gsl_matrix_min_index($self->{matrix});
285 ok_similar( [ $imin, $jmin ], [ 0, 0 ], 'gsl_matrix_min_index' );
289 sub GSL_MATRIX_ISNULL : Tests {
291 for my $line (0..4) {
292 map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4);
294 is(gsl_matrix_isnull($self->{matrix}), 1);
296 for my $line (0..4) {
297 map { gsl_matrix_set($self->{matrix}, $line, $_, $_) } (0..4);
300 is(gsl_matrix_isnull($self->{matrix}), 0);
303 sub GSL_MATRIX_ISPOS : Tests {
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}), 0);
311 for($line=0; $line<5; $line++) {
312 map { gsl_matrix_set($self->{matrix}, $line, $_, 1) } (0..4); }
313 is(gsl_matrix_ispos($self->{matrix}), 1);
315 for($line=0; $line<5; $line++) {
316 map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4); }
317 is(gsl_matrix_ispos($self->{matrix}), 0);
320 sub GSL_MATRIX_ISNEG : Tests {
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}), 1);
328 for($line=0; $line<5; $line++) {
329 map { gsl_matrix_set($self->{matrix}, $line, $_, 1) } (0..4); }
330 is(gsl_matrix_isneg($self->{matrix}), 0);
332 for($line=0; $line<5; $line++) {
333 map { gsl_matrix_set($self->{matrix}, $line, $_, 0) } (0..4); }
334 is(gsl_matrix_isneg($self->{matrix}), 0);
337 sub GSL_MATRIX_ISNONNEG : Tests {
340 map { gsl_matrix_set($self->{matrix}, $row, $_, -1) } (0..4);
342 is(gsl_matrix_isnonneg($self->{matrix}), 0);
345 map { gsl_matrix_set($self->{matrix}, $row, $_, 1) } (0..4);
347 is(gsl_matrix_isnonneg($self->{matrix}), 1);
350 map { gsl_matrix_set($self->{matrix}, $row, $_, 0) } (0..4);
352 is(gsl_matrix_isnonneg($self->{matrix}), 1);
356 sub GSL_MATRIX_GET_ROW : Tests {
358 my $vector = gsl_vector_alloc(5);
359 map { gsl_matrix_set($self->{matrix}, 0, $_, $_) } (0..4);
360 is(gsl_matrix_get_row($vector, $self->{matrix}, 0), 0);
361 map { is(gsl_vector_get($vector, $_), $_) } (0..4);
364 sub GSL_MATRIX_GET_COL : Tests {
366 my $vector = gsl_vector_alloc(5);
367 map { gsl_matrix_set($self->{matrix}, $_, 0, $_) } (0..4);
368 is(gsl_matrix_get_col($vector, $self->{matrix}, 0), 0);
369 map { is(gsl_vector_get($vector, $_), $_) } (0..4);
372 sub GSL_MATRIX_SET_ROW : Tests {
374 my $vector = gsl_vector_alloc(5);
375 map { gsl_vector_set($vector, $_, $_**2) } (0..4);
376 is(gsl_matrix_set_row($self->{matrix}, 1, $vector), 0);
378 ok_similar( [ map { gsl_matrix_get($self->{matrix}, 1, $_) } (0..4) ],
379 [ map { $_ ** 2 } (0..4) ],
383 sub GSL_MATRIX_SET_COL : Tests {
385 my $vector = gsl_vector_alloc(5);
386 map { gsl_vector_set($vector, $_, $_**2) } (0..4);
387 is(gsl_matrix_set_col($self->{matrix}, 1, $vector), 0);
389 ok_similar( [ map { gsl_matrix_get($self->{matrix}, $_, 1) } (0..4) ],
390 [ map { $_ ** 2 } (0..4) ],
394 sub GSL_MATRIX_FREAD_FWRITE : Tests {
396 for my $line (0..4) {
397 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**2) } (0..4);
400 my $fh = gsl_fopen("matrix", 'w');
401 is( gsl_matrix_fwrite($fh, $self->{matrix}), 0);
404 for my $line (0..4) {
405 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**3) } (0..4);
408 $fh = gsl_fopen("matrix", 'r');
410 is(gsl_matrix_fread($fh, $self->{matrix}), 0);
411 for my $line (0..4) {
413 [ map { gsl_matrix_get($self->{matrix}, $line, $_) } (0..4) ],
414 [ map { $_**2 } (0..4) ],
420 sub GSL_MATRIX_FPRINTF_FSCANF : Tests {
423 for my $line (0..4) {
424 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**2) } (0..4);
427 my $fh = gsl_fopen("matrix", 'w');
428 is( gsl_matrix_fprintf($fh, $self->{matrix}, "%f"), 0);
429 ok_status(gsl_fclose($fh));
431 for my $line (0..4) {
432 map { gsl_matrix_set($self->{matrix}, $line, $_, $_**3) } (0..4);
435 $fh = gsl_fopen("matrix", 'r');
436 is(gsl_matrix_fscanf($fh, $self->{matrix}), 0);
437 for my $line (0..4) {
439 [ map { gsl_matrix_get($self->{matrix}, $line, $_) } (0..4) ],
440 [ map { $_**2 } (0..4) ],
443 ok_status(gsl_fclose($fh));
446 sub GSL_MATRIX_MINMAX_INDEX : Tests {
449 for ($line = 0; $line<4; $line ++) {
450 map { gsl_matrix_set($self->{matrix}, $line, $_, $_) } (0..4); }
451 map { gsl_matrix_set($self->{matrix}, 4, $_, $_**2) } (0..4);
452 my ($imin, $jmin, $imax, $jmax) = gsl_matrix_minmax_index($self->{matrix});
453 ok_similar( [ $imin, $jmin, $imax, $jmax ], [ 0, 0, 4, 4], 'gsl_matrix_minmax_index' );
456 sub GSL_MATRIX_ADD_DIAGONAL : Tests {
458 map { gsl_matrix_set($self->{matrix}, $_, $_, $_) } (0..4);
459 gsl_matrix_add_diagonal($self->{matrix}, 4);
460 ok_similar( [ map { gsl_matrix_get($self->{matrix}, $_, $_)} (0..4) ],
465 sub GSL_MATRIX_NEW : Tests {
467 isa_ok( $self->{obj}, 'Math::GSL::Matrix' );
468 isa_ok( $self->{obj}->raw, 'Math::GSL::Matrix::gsl_matrix' );
469 ok( $self->{obj}->rows == 5, '->rows' );
470 ok( $self->{obj}->cols == 5, '->cols' );
473 sub AS_LIST_SQUARE : Tests {
474 my $matrix = Math::GSL::Matrix->new(5,5);
475 map { gsl_matrix_set($matrix->raw, $_, $_, 5 + $_**2) } (0..4);
488 sub AS_LIST_ROW : Tests {
489 my $matrix = Math::GSL::Matrix->new(1,5);
490 map { gsl_matrix_set($matrix->raw, 0 , $_, 5 + $_**2) } (0..4);
491 is_deeply( [ 5, 6, 9, 14, 21, ],
498 my $matrix = Math::GSL::Matrix->new(5,5);
499 map { gsl_matrix_set($matrix->raw, $_, $_, 5 + $_**2) } (0..4);
500 ok_similar( [qw/0 0 9 0 0/] , [$matrix->row(2)->as_list ] );
501 map { gsl_matrix_set($matrix->raw, 0, $_, $_) } (0..4);
502 ok_similar( [qw/0 1 2 3 4/] , [$matrix->row(0)->as_list ] );
506 my $matrix = Math::GSL::Matrix->new(3,3);
507 map { gsl_matrix_set($matrix->raw, $_, $_, 7 + $_**2) } (0..2);
508 ok_similar([7,0,0], [$matrix->col(0)->as_list]);
511 sub NEW_SETS_VALUES_TO_ZERO : Tests {
512 my $matrix = Math::GSL::Matrix->new(5,5);
515 map { $sum += $_ } $matrix->as_list;
516 ok( $sum == 0, 'new sets values to zero');
519 sub SET_ROW : Tests {
520 my $m = Math::GSL::Matrix->new(3,3);
521 $m->set_row(0, [1,2,3]);
522 ok_similar([$m->row(0)->as_list], [1,2,3]);
524 sub SET_ROW_CHAINED : Tests {
525 my $m = Math::GSL::Matrix->new(3,3);
526 $m->set_row(1, [4,5,6])
527 ->set_row(2, [9,8,7]);
528 ok_similar([$m->row(1)->as_list], [4,5,6]);
529 ok_similar([$m->row(2)->as_list], [9,8,7]);
532 sub SET_COL_CHAINED : Tests {
533 my $m = Math::GSL::Matrix->new(3,3);
534 $m->set_col(1, [4,5,6])
535 ->set_col(2, [9,8,7]);
536 ok_similar([$m->col(1)->as_list], [4,5,6]);
537 ok_similar([$m->col(2)->as_list], [9,8,7]);
540 sub GSL_MATRIX_VIEW_ARRAY : Tests {
541 my $array = [8,4,3,7];
542 my $matrix_view = gsl_matrix_view_array ($array, 2,2);
543 ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 0, $_) } 0..1], [8, 4]);
544 ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 1, $_) } 0..1], [3, 7]);
547 sub GSL_MATRIX_VIEW_ARRAY_WITH_TDA : Tests {
548 my $array = [8,4,3,7,5];
549 my $matrix_view = gsl_matrix_view_array_with_tda ($array, 2,2, 3);
550 ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 0, $_) } 0..1], [8, 4]);
551 ok_similar([map { gsl_matrix_get($matrix_view->{matrix}, 1, $_) } 0..1], [7, 5]);
554 sub GSL_MATRIX_OO_ADDITION_CONSTANT : Tests {
555 my $m = Math::GSL::Matrix->new(3,3);
556 $m->set_col(1, [4,5,6])
557 ->set_col(2, [9,8,7]);
559 ok_similar([$m->col(2)->as_list], [9,8,7]);
560 ok_similar([$m->col(1)->as_list], [4,5,6]);
561 ok_similar([$m->col(0)->as_list], [0,0,0]);
563 ok_similar([$m2->col(1)->as_list], [8,9,10]);
564 ok_similar([$m2->col(2)->as_list], [13,12,11]);
565 ok_similar([$m2->col(0)->as_list], [4,4,4]);
568 ok_similar([$m3->col(1)->as_list], [8,9,10]);
569 ok_similar([$m3->col(2)->as_list], [13,12,11]);
570 ok_similar([$m3->col(0)->as_list], [4,4,4]);
573 sub GSL_MATRIX_OO_ADDITION_MATRICES : Tests {
574 my $m = Math::GSL::Matrix->new(3,3);
575 $m->set_col(1, [4,5,6])
576 ->set_col(2, [9,8,7])
577 ->set_col(0, [1,2,3]);
579 ok_similar([$m->col(0)->as_list], [1,2,3]);
580 ok_similar([$m->col(2)->as_list], [9,8,7]);
581 ok_similar([$m->col(1)->as_list], [4,5,6]);
583 ok_similar([$m2->col(0)->as_list], [2,4,6]);
584 ok_similar([$m2->col(1)->as_list], [8,10,12]);
585 ok_similar([$m2->col(2)->as_list], [18,16,14]);
588 sub GSL_MATRIX_OO_SUBSTRACTION_CONSTANT : Tests {
589 my $m = Math::GSL::Matrix->new(3,3);
590 $m->set_col(1, [4,5,6])
591 ->set_col(2, [9,8,7]);
593 ok_similar([$m->col(2)->as_list], [9,8,7]);
594 ok_similar([$m->col(1)->as_list], [4,5,6]);
595 ok_similar([$m->col(0)->as_list], [0,0,0]);
597 ok_similar([$m2->col(1)->as_list], [0,1,2]);
598 ok_similar([$m2->col(2)->as_list], [5,4,3]);
599 ok_similar([$m2->col(0)->as_list], [-4,-4,-4]);
602 sub GSL_MATRIX_OO_SUBSTRACTION_MATRICES : Tests {
603 my $m = Math::GSL::Matrix->new(3,3);
604 my $m3 = Math::GSL::Matrix->new(3,3);
605 $m->set_col(1, [4,5,6])
606 ->set_col(2, [9,8,7])
607 ->set_col(0, [1,2,3]);
608 $m3->set_col(1, [1,2,3])
609 ->set_col(2, [9,8,7])
610 ->set_col(0, [1,2,3]);
612 ok_similar([$m->col(0)->as_list], [1,2,3]);
613 ok_similar([$m->col(2)->as_list], [9,8,7]);
614 ok_similar([$m->col(1)->as_list], [4,5,6]);
616 ok_similar([$m2->col(0)->as_list], [0,0,0]);
617 ok_similar([$m2->col(1)->as_list], [3,3,3]);
618 ok_similar([$m2->col(2)->as_list], [0,0,0]);
621 sub GSL_MATRIX_OO_MULTIPLICATION_CONSTANT : Tests {
622 my $m = Math::GSL::Matrix->new(3,3);
623 $m->set_col(1, [4,5,6])
624 ->set_col(2, [9,8,7]);
626 ok_similar([$m->col(2)->as_list], [9,8,7]);
627 ok_similar([$m->col(1)->as_list], [4,5,6]);
628 ok_similar([$m->col(0)->as_list], [0,0,0]);
630 ok_similar([$m2->col(1)->as_list], [16,20,24]);
631 ok_similar([$m2->col(2)->as_list], [36,32,28]);
632 ok_similar([$m2->col(0)->as_list], [0,0,0]);
635 ok_similar([$m3->col(1)->as_list], [16,20,24]);
636 ok_similar([$m3->col(2)->as_list], [36,32,28]);
637 ok_similar([$m3->col(0)->as_list], [0,0,0]);
640 sub GSL_MATRIX_OO_MULTIPLICATION_MATRICES : Tests {
641 my $m = Math::GSL::Matrix->new(3,3);
642 my $m3 = Math::GSL::Matrix->new(3,3);
643 $m->set_col(1, [4,5,6])
644 ->set_col(2, [9,8,7])
645 ->set_col(0, [1,2,3]);
646 $m3->set_col(1, [1,2,3])
647 ->set_col(2, [9,8,7])
648 ->set_col(0, [1,2,3]);
650 ok_similar([$m->col(0)->as_list], [1,2,3]);
651 ok_similar([$m->col(2)->as_list], [9,8,7]);
652 ok_similar([$m->col(1)->as_list], [4,5,6]);
654 ok_similar([$m2->col(0)->as_list], [1,4,9]);
655 ok_similar([$m2->col(1)->as_list], [4,10,18]);
656 ok_similar([$m2->col(2)->as_list], [81,64,49]);
659 sub GSL_MATRIX_EIGENVALUES: Tests(6) {
660 my $matrix = Math::GSL::Matrix->new(2,2)
661 ->set_row(0, [0,-1] )
662 ->set_row(1, [1, 0] );
663 my @eigs = $matrix->eigenvalues;
664 ok_similar( [ Re($eigs[0]), Im($eigs[0]) ], [ 0, 1 ] ); # i
665 ok_similar( [ Re($eigs[1]), Im($eigs[1]) ], [ 0, -1 ] ); # -i
667 my $rect = Math::GSL::Matrix->new(2,4);
668 dies_ok( sub { $rect->eigenvalues }, 'eigenvalues for square matrices only' );
670 my $matrix2 = Math::GSL::Matrix->new(2,2)
671 ->set_row(0, [1, 0] )
672 ->set_row(1, [0, 1] );
673 my @eigs2 = $matrix2->eigenvalues;
674 ok_similar( [ @eigs2 ], [ 1, 1 ] );
676 my $matrix3 = Math::GSL::Matrix->new(2,2);
677 ok_similar( [ $matrix3->eigenvalues ], [ 0, 0 ], 'zero matrix eigenvalues = 0');
679 my $matrix4 = Math::GSL::Matrix->new(2,2)
680 ->set_row(0, [1, 3] )
681 ->set_row(1, [4, 2] );
682 ok_similar( [ $matrix4->eigenvalues ], [ -2, 5 ] );
685 sub GSL_MATRIX_EIGENPAIR : Tests(11) {
686 my $matrix = Math::GSL::Matrix->new(2,2)
687 ->set_row(0, [0,-1] )
688 ->set_row(1, [1, 0] );
690 my ($eigenvalues, $eigenvectors) = $matrix->eigenpair;
691 cmp_ok( $#$eigenvalues, '==', $#$eigenvectors, 'same # of values as vectors');
693 my ($eig1,$eig2) = @$eigenvalues;
694 isa_ok( $eig1, 'Math::Complex');
695 isa_ok( $eig2, 'Math::Complex');
697 ok_similar( [ Re $eig1 ], [ 0 ] );
698 ok_similar( [ Im $eig1 ], [ 1 ] );
700 ok_similar( [ Re $eig2 ], [ 0 ] );
701 ok_similar( [ Im $eig2 ], [ -1 ] );
703 my ($u,$v) = @$eigenvectors;
705 isa_ok( $u, 'Math::GSL::VectorComplex' );
706 isa_ok( $v, 'Math::GSL::VectorComplex' );
708 local $TODO = qq{ VectorComplex->as_list is funky };
709 # we happen to know that these are real eigenvectors
710 my ($u1,$u2) = map { Re $_ } $u->as_list;
711 my ($v1,$v2) = map { Re $_ } $v->as_list;
712 my $sqrt2by2 = sqrt(2)/2;
714 ok_similar( [ $u1, $u2 ], [ $sqrt2by2, - $sqrt2by2 ] );
715 ok_similar( [ $v1, $v2 ], [ $sqrt2by2, $sqrt2by2 ] );
719 sub DOT_PRODUCT_OVERLOAD : Tests {
720 my $A = Math::GSL::Matrix->new(2,2)
722 ->set_row(1, [4, 2] );
723 my $B = Math::GSL::Matrix->new(2,2)
725 ->set_row(1, [1, 3] );
728 # my @got = $C->row(0)->as_list;
729 # ok_similar([@got], [22, 13]);
730 # @got = $C->row(1)->as_list;
731 # ok_similar([@got], [16, 9]);
733 Test::Class->runtests;