我需要在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";
}
答案 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模块,则矩阵操作已经实现。