Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: to calculate mean and variance

by davidrw (Prior)
on Jan 11, 2008 at 03:01 UTC ( [id://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.
  • Add some debugging statements. (Data::Dumper can be quite helpful, too)
    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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://661784]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (6)
As of 2024-03-28 21:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found