Your skill will accomplishwhat the force of many cannot PerlMonks

### Re: to calculate mean and variance

by davidrw (Prior)
 on Jan 11, 2008 at 03:01 UTC ( #661784=note: print w/replies, xml ) Need Help??

in reply to to calculate mean and variance

couple general suggestions:
• use strict; At first, it'll generate a bunch of errors for you for undeclared variables, but it will help identify & reduce errors.
e.g. the warnings indicate that one of the values it's trying to add to the sum is a string .. so in the first for loop put something like print Dumper  [\$i, \$fields[\$i]] if \$fields[\$i] =~ /s/;
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

Create A New User
Node Status?
node history
Node Type: note [id://661784]
help
Chatterbox?
and snow settles gently...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (4)
As of 2018-02-20 08:39 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When it is dark outside I am happiest to see ...

Results (268 votes). Check out past polls.

Notices?