matrixProd
que realiza el producto de matrices.
Veamos un ejemplo de llamada:
lhp@nereida:~/Lperl/src$ sed -ne '58,64p' matrixproduct.pl | cat -n
1 my $A = [[1,2,3],[2,4,6],[3,6,9]];
2 my $B = [[1,2],[2,4],[3,6]];
3 my $C = matrixProd($A,$B);
4
5 print "Matriz A \n"; printMat($A);
6 print "\nMatriz B \n"; printMat($B);
7 print "\nMatriz C \n"; printMat($C);
La ejecución del programa produce la siguiente salida:
lhp@nereida:~/Lperl/src$ matrixproduct.pl Matriz A 1 2 3 2 4 6 3 6 9 Matriz B 1 2 2 4 3 6 Matriz C 14 28 28 56 42 84
Sigue el código e la función matrixProd:
lhp@europa:~/projects/perl/src/perltesting$ sed -ne '1,26p' matrixproduct.pl | cat -n
1 #!/usr/bin/perl -w
2 use strict;
3 use List::Util qw(sum);
4 use List::MoreUtils qw(any);
5 use Scalar::Util qw{reftype};
6
7 sub matrixProd {
8 my ($A, $B) = @_;
9 die "Error. Se esperaban dos matrices" if any { !defined($_) or reftype($_) ne 'ARRAY' } ($A, $B, @$A, @$B);
10
11 my $nrA = @$A;
12 my $nrB = @$B;
13 my $ncB = @{$B->[0]};
14 my @C;
15
16 die ("Las matrices no son multiplicables\n") if any { @$_ != $nrB } @$A;
17
18 for(my $i = 0; $i < $nrA; $i++) {
19 for(my $j = 0; $j < $ncB; $j++) {
20 my $k = 0;
21 $C[$i][$j] = sum(map { $A->[$i][$k++] * $_ } map { $_->[$k] } @$B);
22 }
23 }
24
25 return \@C;
26 }
Todo queda mucho mas simple usando el módulo PDL (PDL significa Perl Data Language) el cual da soporte al cálculo científico en Perl:
1 #!/usr/bin/perl -w 2 use PDL; 3 4 $a = pdl [[1,2,3],[2,4,6],[3,6,9]]; 5 $b = pdl [[1,2],[2,4],[3,6]]; 6 $c = $a x $b; # x esta sobrecargado 7 8 print "a = $a\nb = $b\nc = $c\n";PDL es un módulo diseñado para el cálculo y visualización de datos científicos.