Как мне умножить более двух матриц в Perl? - PullRequest
0 голосов
/ 28 февраля 2012

Я отправляю в массив ссылок и вот моя подпрограмма:

sub multiply
{
    my @product;

    my $ref1 = $_[0];
    my $ref2 = $_[1];

    my @array1 = @$ref1;
    my @array2 = @$ref2;


    }
    my ($rowsA,$columnsA) = &dimensions(@$ref1);
    my ($rowsB,$columnsB) = &dimensions(@$ref2);

    for $i (0..$rowsA-1){
    for $j (0..$columnsB-1){
            for $k (0..$columnsA-1){
                    $product[$i][$j] += $array1[$i][$k] * $array2[$k][$j];
            }
    }
 }

Эта подпрограмма работает для двух параметров, но как мне умножить матрицы при отправке более двух параметров?

Ответы [ 2 ]

5 голосов
/ 28 февраля 2012

Вы хотите использовать массив @_ напрямую. Вы не сможете назначить свои ссылки напрямую, как в вашем примере ч / б, как вы нашли, вы не знаете, сколько элементов было передано. Хорошо, что тебе тоже не нужно. Все аргументы передаются в подпрограммы Perl через специальный массив @_. Когда вы видите my $x = shift;, в этом массиве данные перемещаются из ваших локальных переменных. Здесь, так как вы не можете знать заранее, сколько vars нужно создать, вы можете использовать массив напрямую. Применяются типичные функции массива. (то есть для получения размера вы можете использовать скаляр (@_))

В следующем примере показан тип подпрограммы, которую вы написали бы, используя обычные скаляры. Это было бы то же самое для ссылок, вам просто нужно разыменовать их перед их использованием.

#!/usr/bin/perl

my $result = multiply(2,4,5);
print "Result 1: $result\n";

$result = multiply(2,2);
print "Result 2: $result\n";

$result = multiply(2,2,3,5,6);
print "Result 3: $result\n";


sub multiply
{
    my $ans = 1;
    foreach my $x (@_) { $ans *= $x; }
    return $ans;
}
0 голосов
/ 28 февраля 2012

В сочетании с ответом RC, который объясняет, что такое @_ и как его использовать, вы также можете набрать:

sub multiply {
  return $_[0] * $_[1] if @_ <= 2;
  return shift( @_ ) * multiply( @_ );
}

Это будет не так быстро, как его ответ, но для более сложных задач его будет проще реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...