【问题标题】:How do I multiply more than two matrices in perl?如何在 perl 中将两个以上的矩阵相乘?
【发布时间】:2012-02-29 10:18:02
【问题描述】:

我正在发送一个引用数组,这是我的子程序:

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];
            }
    }
 }

这个子程序适用于两个参数,但是当发送两个以上的参数时,如何将矩阵相乘?

【问题讨论】:

    标签: arrays perl reference parameters


    【解决方案1】:

    您想直接使用@_ 数组。您将无法像您在示例 b/c 中找到的那样直接分配您的参考资料,您不知道通过的项目数量。好消息是,你也不需要。所有参数都通过特殊的@_ 数组传递给 Perl 子例程。当您看到my $x = shift; 时,这个数组就是数据被转移到本地变量的地方。在这里,由于无法提前知道要创建多少个 var,所以可以直接使用数组。典型的数组函数适用。 (即要获得大小,您可以使用标量(@_))

    以下示例显示了您将使用常规标量编写的子例程的类型。引用也是一样,您只需要在使用前取消引用即可。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多