Multiplicación de Arrays en Perl

Las arrays son arrays multidimensionales que almacenan datos en forma de filas y columnas. Perl permite realizar varias operaciones en estas arrays, como suma, resta, división y multiplicación. Perl es muy similar a C sintácticamente y es fácil para los usuarios que tienen conocimientos de C, C++.

Dado que son dos arrays, la tarea es multiplicarlas. Las arrays pueden ser cuadradas o rectangulares.

Ejemplo: 

Input : mat1[][] = {{2, 4}, 
                    {3, 4}}
        mat2[][] = {{1, 2}, 
                    {1, 3}}       
Output : {{6, 16}, 
          {7, 18}}

En primer lugar, el usuario debe proporcionar las dimensiones de las dos arrays con la ayuda de <STDIN>

Perl

print "Enter the Dimensions of matrices: ";
my $a = <STDIN>, my $b = <STDIN>,
my $c = <STDIN>, my $d = <STDIN>;

Para multiplicar dos arrays, el número de columnas de la primera array debe ser igual al número de filas de la segunda array. Para verificar si las arrays son multiplicativas , se usa el bucle condicional if-else en el código. 

Perl

if($b != $c)
{
    print "Matrix multiplication can't happen\n";
}

Ahora, si la condición anterior no se cumple, entonces sabemos que tenemos que implementar la multiplicación de arrays en nuestra condición else y para eso, primero tomaremos los valores dentro de las dos arrays con la ayuda de bucles for anidados . El primer ciclo for se usará para cambiar la fila y el segundo se usará para acceder a todas las columnas en esa fila en particular. 

Perl

#!/usr/bin/perl
 
else
{
    my @matrix1, my @matrix2, my @matrix3;
     
    # Filling up matrix 1 with user input
    print "Enter values for Matrix 1: ";
    for(my $i = 0; $i < $a; $i++)
    {
        for(my $j = 0; $j < $b; $j++)
        {
            # Taking user input
            $matrix1[$i][$j] = <STDIN>;
        }
    }
     
    # Filling up matrix 2 with user input
    print "Enter values for Matrix 2: ";
    for(my $i = 0; $i < $c; $i++)
    {
        for(my $j = 0; $j < $d; $j++)
        {
            # Taking user input
            $matrix2[$i][$j] = <STDIN>;
        }
    }
}

Después de esto, se realiza el proceso de multiplicación en el que la i-ésima columna de la primera array se multiplica con la j-ésima fila de la segunda array y se suman los productos respectivos para encontrar el valor en la posición [i][j] de la array producto. Para ejecutar esto, se utilizan tres bucles anidados en el código de la siguiente manera: 

Perl

#!/usr/bin/perl
 
# Nested loops to multiply matrices
 
# Initializing temporary variable
my $temp = 0;
 
for(my $i = 0; $i < $a; $i++)
{
    for(my $j = 0; $j < $d; $j++)
    {
        for(my $g = 0; $g < $b; $g++)
        {
            # Multiplying the matrix values and
            # adding them to temp
            $temp += $matrix1[$i][$g] *
                     $matrix2[$g][$j];
        }
         
        $matrix3[$i][$j] = $temp;
        chomp $matrix3[$i][$j];
         
        # Printing resultant matrix
        print $matrix3[$i][$j];
        print "\t";
        $temp = 0;
    }
    print "\n";
}
}

En el código escrito anteriormente, una variable temporal (temp) se inicia como 0. Después de la multiplicación de la i-ésima columna de la primera array y la j-ésima fila de la segunda array, el producto se suma a la temporal, de esta manera podremos para sumar todos los productos encontrados al multiplicar dos números a la vez. Aquí el bucle for de la variable $g nos ayuda a acceder a todas las posiciones de las dos arrays definidas previamente. Para entender la lógica, considere que para la array 1 estamos arreglando la columna con i y luego pasando a varias filas usando ‘ g ‘ y en la array 2 estamos arreglando la fila con j y luego cambiando de columna usando g . Como sabemos que $b = $c , no importa si $gva de 0 a $b o de 0 a $c . Finalmente, ponemos el valor en temp en su posición respectiva y ponemos temp nuevamente en 0 y encontramos el valor en las otras posiciones. Esto dará como resultado la formación de una array de producto que se requería.

A continuación se muestra el código final para realizar el proceso de multiplicación de arrays: 

Perl

# Perl program for matrix multiplication
use strict;
use warnings;
 
# Taking Matrix dimensions from the user
print "Enter the Dimensions of matrices: ";
my $a = <STDIN>, my $b = <STDIN>,
my $c = <STDIN>, my $d = <STDIN>;
 
# Checking if the matrices
# are multiplicative
if($b != $c)
{
    print "Matrix multiplication can't happen\n";
}
 
# Getting values for the matrix
else
{
    my @matrix1, my @matrix2, my @matrix3;
     
    # Taking values for the First matrix
    print "Enter the values for Matrix 1: ";
    for(my $i = 0; $i < $a; $i++)
    {
        for(my $j = 0; $j < $b; $j++)
        {
            # Taking user input
            $matrix1[$i][$j] = <STDIN>;
        }
    }
 
    # Taking values for the Second matrix
    print "Enter the values for Matrix 2: ";
    for(my $i = 0; $i < $c; $i++)
    {
        for(my $j = 0; $j < $d; $j++)
        {
            # Taking user input
            $matrix2[$i][$j] = <STDIN>;
        }
    }
     
    # Initializing temporary variable
    my $temp = 0;
     
    print "\nResultant matrix:\n";
     
    # Nested-loops for multiplication process
    for(my $i = 0; $i < $a; $i++)
    {
        for(my $j = 0; $j < $d; $j++)
        {
            for(my $g = 0; $g < $b; $g++)
            {
                 
                # Multiplying the matrix values and
                # adding them to temp
                $temp += $matrix1[$i][$g] *
                         $matrix2[$g][$j];
            }
             
            # Assigning the value of temp
            # into the matrix 3
            $matrix3[$i][$j] = $temp;
            chomp $matrix3[$i][$j];
             
            # printing matrix values
            print $matrix3[$i][$j];
            print "\t";
             
            # Setting temporary variable
            # back to zero
            $temp = 0;
        }
        print "\n";
    }
}

Producción: 

Multiplication of matrices

Publicación traducida automáticamente

Artículo escrito por VMehra y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *