Ejemplo: El Producto de Matrices

El siguiente ejemplo muestra una subrutina 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

Producto de Matrices Usando Referencias

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  }

El Módulo PDL

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.



Subsecciones
Casiano Rodríguez León
2009-10-04