1

我想获得 1 个或多个数组的平均值。

my @w = (0,2);
my @x = (1,3);
my @y = (2,2);
my @z = (1,1);

这样上面四个数组的平均值是(1,2)因为 (0+1+2+1)/4 = 1 和 (2+3+2+1)/4 = 2。

的平均值my @r = (3,4,1,4,5)(3/5, 4/5, 1/5, 4/5/, 1)

这是我的第一个解决方案。

my @AoA = (\@w, \@x, \@y, \@z);
my @sums;

foreach my $column(0..$#@w){
    my $average;
    my $size = @w;
    foreach  my  $aref (@AoA){
     $average += ($aref -> [$column]) / $size ;
    }
  push(@sums, $average);
 }

这可能会也可能不会。有没有更简单的方法来做到这一点?也许是模块中的一个函数?

我的第二个解决方案。我认为现在我想这个实际上更容易:

my $scalar = @r;
my @new_r;

foreach my $x (@r) { 
    $x = $x / $scalar; 
    push(@new_r, $x);
}

再次可能会或可能不会工作。可能有一种更简单的方法可以做到这一点。

4

2 回答 2

6

给定

use List::Util qw( sum );
sub avg { sum(@_)/@_ }

你可以使用

my @w = (0,2);
my @x = (1,3);
my @y = (2,2);
my @z = (1,1);

my @avg = map {
   my $i = $_;
   avg map $_->[$i], \@w, \@x, \@y, \@z
} 0..$#w;

或者,如果您有 AoA:

my @matrix = ([0,2], [1,3], [2,2], [1,1]);

my @avg = map {
    my $i = $_;
    avg map $_->[$i], @matrix
} 0..$#{$matrix[0]};

至于 的“平均值” @r

my @avg_r = map $_/@r, @r;
于 2013-03-29T03:33:47.390 回答
3

大概是这样的?

use strict;
use warnings;

use List::Util 'sum';

my @w = (0, 2);
my @x = (1, 3);
my @y = (2, 2);
my @z = (1, 1);

my @arrays = \(@w, @x, @y, @z);

my @avg;
for my $i (0..$#w) {
  $avg[$i] =  sum(map $_->[$i], @arrays) / @arrays;
}
print "@avg\n";

my @r = (3, 4, 1, 4, 5);
my @avg_r = map $_ / @r, @r;

print "@avg_r\n";

输出

1 2
0.6 0.8 0.2 0.8 1
于 2013-03-29T03:30:17.830 回答