如何在不使用Perl中的矩阵库的情况下使用矩阵?

时间:2019-12-09 14:06:41

标签: perl matrix

我需要在Perl中编写一个矩阵,而无需使用该库。 如何在代码中实施以下操作? -转置矩阵 -计算每行和每列的平均值,(我尝试在下面的脚本中进行计算) -在整个矩阵中找到最小值, -查找值总和最小的行的索引。

我将此代码用于矩阵运算,但可以,但是我完全不了解如何执行这些运算。预先谢谢你

#!usr/bin/perl 
use strict; 
use warnings; 



my(@MatrixA, @MatrixB, @Resultant) = ((), (), ()); 

# Asking for User Input for Matrix A 
print"Let's begin with the matrix A dimensions\n"; 
print"\tPlease, enter how many rows should Matrix A have:"; 
chomp(my$rowA= <>);  # CHOMP TO TAKE USER INPUT 
print"\tPlease, enter how many columns should Matrix A have:"; 
chomp(my$columnA= <>); 

# Asking for User Input for Matrix B 
print"Then we have matrix B:\n"; 
print"\tPlease, enter how many rows should Matrix B have:"; 
chomp(my$rowB= <>); 
print"\tPlease, enter how many columns should Matrix B have:"; 
chomp(my$columnB= <>); 

# Asking User to input elements of matrices 
if($rowA== $rowB and $columnA== $columnB) #checking the dimensions whether they match
{ 
    print"Enter $rowA * $columnA elements in MatrixA:\n";  
    foreach my $m(0..$rowA- 1) 
    { 
        foreach my $n(0..$columnA- 1) 
        { 
            chomp($MatrixA[$m][$n] = <>);  # reading the values
        } 
    } 

    print"Enter $rowB * $columnB elements in MatrixB:\n";  
    foreach my$m(0..$rowB- 1) 
    { 
        foreach my $n(0..$columnB- 1) 
        { 
            chomp($MatrixB[$m][$n] = <>);  # reading the values 
        } 
    } 

    # Performing Addition operation 
    foreach my $m(0..$rowB- 1) 
    { 
        foreach my $n(0..$columnB- 1) 
        { 
            $Resultant[$m][$n] = $MatrixA[$m][$n] +  
                                 $MatrixB[$m][$n]; 
        } 
    } 

    # Printing Matrix A 
    print"MatrixA is :\n";  
    foreach my $m(0..$rowB- 1) 
    { 
        foreach my $n(0..$columnB- 1) 
        { 
            print"$MatrixA[$m][$n] "; 
        } 
        print"\n"; 
    } 

    # Printing Matrix B 
    print"MatrixB is :\n";  
    foreach my$m(0..$rowB- 1) 
    { 
        foreach my$n(0..$columnB- 1) 
        { 
            print"$MatrixB[$m][$n] "; 
        } 
        print"\n"; 
    } 

    # Printing the sum of Matrices 
    print"SUM of MatrixA and MatrixB is :\n";  
    foreach my $m(0..$rowB- 1) 
    { 
        foreach my $n(0..$columnB- 1) 
        { 
            print"$Resultant[$m][$n] "; 
        } 
        print"\n"; 
    } 

    # Printing the average of Matrices 
    print"The average of Matrices (row) :\n";  
    foreach my $m(0..$rowB- 1) 
    { 
        my $sum_r += $m;
        my $average_r = $sum_r/$rowB;
        print "Average is $average_r\n";
            print"\n";        
    }
    print"The average of Matrices (column) :\n";
    foreach my $n(0..$columnB- 1) 
          { 
        my $sum_c += $n;
        my $average_c = $sum_c/$columnB;
        print "Average is $average_c\n";
            print"\n";
          }     
} 

# Error if Matrices are of different order 
else
{ 
    print"Matrices order does not MATCH, Addition is not Possible"; 
} 

2 个答案:

答案 0 :(得分:2)

Павел,почемутывводишьматрицупоэлементно? Этооченьнеэффективно! Чтобудетеслитыдопустилошибкупривводе? Будешьвсюматрицуввводитьссамогоначала?

Вследующемпримередотехпорпокатыненажал'Enter'тыможешредактироватьэлементыстрокиматри。 Вводпустойстрокиявляетсяиндикаторомокончаниявводаматрицы。

Матрицавводится'построчно',делитсянаэлементыивматрицудобавляетсяссылканастрокуэлемент。

use strict;
use warnings;

use feature 'say';

say "
Вводите матрицу построчно разделяя элементы матрицы пробелами
Ввод пустой строки является указателем окончания ввода матрицы

>> Ввод инициирован:
";

my @matrix_A;
my $index = 0;

while( <> ) {
    last if /^$/;               # пустая строка индикатор конца ввода матрицы
    push @{$matrix_A[$index++]}, split ' ';
}

say "Вы ввели следующую матрицу";

foreach my $row (@matrix_A) {
    say  join ' ', @{$row};
}

Операциинадматрицами-https://www.webmath.ru/poleznoe/formules_6_3.php

Perl的Книгикоторыепомогутосвоить-https://docstore.mik.ua/orelly/bookshelfs.html

答案 1 :(得分:0)

以下是如何转置矩阵的示例:

my @MatrixA = ([1,2,3], [4, 5, 6]);
my @MatrixA_T = transpose(@MatrixA);

sub transpose {
    my (@M) = @_;

    my @MT;
    for my $i (0..$#M) {
        for my $j (0..$#{$M[0]}) {
            $MT[$j][$i] = $M[$i][$j];
        }
    }
    return @MT;
}

请注意,如果您使用PDL模块,则矩阵操作已经实现。