Умножение матриц
Проблема
Требуется перемножить два двумерных массива.
Умножение матриц часто используется в математических и инженерных вычислениях.
Решение
Воспользуйтесь модулями PDL с CPAN. Модули PDL (Perl Data Language, то есть «язык данных Perl»)
содержат быстрые и компактные матричные и математические функции:
use PDL;
# $а и $b - объекты pdl
$с = $а * $b;
Альтернативный вариант — самостоятельно реализовать алгоритм умножения матриц для двумерных массивов:
sub mmult {
my ($m1,$m2) = @_;
my ($m1rows, $m1cols) = matdim($m1 ) ;
my ($m2rows, $m2cols) = matdim($m2);
unless ($m1cols == $m2rows) { # Инициировать исключение
die "IndexError: matrices don't match: $m1cols != $m2rows";
}
my $result = [];
my ($i, $j, $k);
for $i (range($m1rows)) {
for $j (range($m2cols)) {
for $k (range($m1cols)) {
$result->[$i][$j] += $m1->[$i][$k] * $m2->[$k][$j];
}
}
}
return $result;
}
sub range {0 .. ($_[0] - 1 }
sub veclen {
my $ary_ref = $_[0];
my $type = ref $ary_ref;
if ($type ne "ARRAY") {die "$type is bad array ref for $ary_ref" }
return scalar(@$ary_ref);
}
sub matdim {
my $matrix = $_[0];
my $rows = veclen($matrix);
my $cols = veclen($matrix->[0]);
return ($rows, $cols);
}
Комментарий
Если у вас установлена библиотека PDL, вы можете воспользоваться ее молниеносными числовыми операциями.
Они требуют значительно меньше памяти и ресурсов процессора, чем стандартные операции с массивами Perl.
При использовании объектов PDL многие числовые операторы (например, + и *) перегружаются и работают с
конкретными типами операндов (например, оператор * выполняет так называемое скалярное умножение).
Для умножения матриц используется перегруженный оператор х.
use PDL;
$а = pdl [
[ 3, 2, 3 ],
[ 5, 9, 8 ],
];
$b = pdl [
[ 4, 7 ],
[ 9, 3 ],
[ 8, 1 ]
];
$c = $a x $b; # Перегруженный оператор х
Если библиотека PDL недоступна или вы не хотите привлекать ее для столь тривиальной задачи,
матрицы всегда можно перемножить вручную:
# mmult() и другие процедуры определены выше
$x = [
[ 3, 2, 3 ],
[ 5, 9, 8 ],
];
$y = [
[ 4, 7 ],
[ 9, 3 ],
[ 8, 1 ]
];
$z = mult($x, $y);
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|