如何在perl中乘以两个以上的矩阵?

时间:2012-02-28 02:12:37

标签: arrays perl reference parameters

我发送引用数组,这是我的子程序:

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 个答案:

答案 0 :(得分:5)

您想直接使用@_数组。您将无法像在您的示例b / c中那样直接分配您的引用,因为您发现,您不知道传递的项目数。好的是,你也不需要。所有参数都通过特殊的@_数组传递给Perl子例程。当您看到my $x = shift;时,此数组是数据从局部变量转移到的位置。在这里,由于您无法提前知道要创建多少个变量,因此可以直接使用该数组。典型的阵列功能适用。 (即获得大小,你可以使用标量(@_))

以下示例显示了使用常规标量编写的子例程的类型。对于引用来说它是相同的,你只需要在它们使用之前取消引用它们。

#!/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;
}

答案 1 :(得分:0)

要结合RC的答案,解释@_是什么以及如何使用它,你也可以递归:

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

它不会像他的答案那么快,但对于更复杂的任务,可以更容易实现。