http://www.perlmonks.org?node_id=661784


in reply to to calculate mean and variance

couple general suggestions: Hmm .. actually, it might be your split -- try split(' ') instead -- see the split() docs for full info, including that "split(/ /)" will give you as many null initial fields as there are leading spaces. so it could be that your data file has leading spaces in it somewhere.

Here's a little refactoring example, too, to demo several more "perlish" constructs:
#!/usr/bin/perl -w use strict; my @sum; my @sumsq; my $n = 0; while( <DATA> ){ my @fields = split / /; foreach my $i ( 0..$#fields ){ $sum[$i] += $fields[$i]; $sumsq[$i] += $fields[$i]**2; } $n++; } $_ /= $n for @sum, @sumsq; my @stddev = map { sqrt( $sumsq[$_] - $sum[$_]**2 ) } 0 .. $#sum; print join(" ", @stddev) . "\n"; #foreach my $i ( 0 .. $#sum ){ # printf "%5s %10s %10s\n", $i, $sum[$i], $stddev[$i]; #} __DATA__ 1.8 2.5 3.8 1.9 -3.5 -3.5 3.2 -3.9 4.2 4.5 2.8 -1.3 -0.9 -0.7 -0.4 -0.8 -3.5 -3.5 -1.6 -4.5

Replies are listed 'Best First'.
Re^2: to calculate mean and variance
by cdfd123 (Initiate) on Jan 11, 2008 at 07:35 UTC
    Thanks may be misconception atyually i want to calculate along the rows __DATA__ 1.8 2.5 3.8 1.9 -3.5 -3.5 3.2 -3.9 4.2 4.5 2.8 -----> calculate mean and variance -1.3 -0.9 -0.7 -0.4 -0.8 -3.5 -3.5 -1.6 -4.5 ---> calculate mean and variance regards
      First, can you use <code></code> tags to display your data? It's hard to see exactly what you're using when it's normal text ...

      Ah -- along rows is even easier .. here's an example:
      #!/usr/bin/perl -w use strict; my @stddev; while( <DATA> ){ my @fields = split ' ', $_; my $N = scalar(@fields); my $sum = 0; $sum += $_ for @fields; my $mean = $sum / $N; $sum = 0; $sum += ($_ - $mean)**2 for @fields; push @stddev, sqrt($sum/$N); } print map {"$_\n"} @stddev; __DATA__ 1.8 2.5 3.8 1.9 -3.5 -3.5 3.2 -3.9 4.2 4.5 2.8 -1.3 -0.9 -0.7 -0.4 -0.8 -3.5 -3.5 -1.6 -4.5