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.