我想获得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);
}
再次可能会或可能不会奏效。这可能是一种更简单的方法。
答案 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