取平均数组

时间:2013-03-29 02:56:22

标签: arrays perl

我想获得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);
}

再次可能会或可能不会奏效。这可能是一种更简单的方法。

2 个答案:

答案 0 :(得分:5)

鉴于

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;

答案 1 :(得分: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