Умножение матриц

Проблема

Требуется перемножить два двумерных массива. Умножение матриц часто используется в математических и инженерных вычислениях.

Решение

Воспользуйтесь модулями 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);

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: