1

1 つ以上の配列の平均値を取得したいと考えています。

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

上記の 4 つの配列の平均は(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);
 }

これは機能する場合と機能しない場合があります。これを行う簡単な方法はありますか?おそらくモジュール内の関数ですか?

2番目のものに対する私の解決策。考えてみると、これは実際には簡単だと思います:

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 に答える