#!/usr/bin/perl -w use strict; # norm.pl - normalisoi sarakkeittain tabulaattorieroitettu taulukko; # rivien ja sarakkeitten lukumäärällä ei ole väliä kunhan se on vakio # $Id: norm.pl,v 1.2 2001/03/15 16:46:36 ltuuri Exp $ my (@tau, @ntau, $pit, $eka); # Laske otoskeskihajonta (aliohjelma) # sub keskih { my $summa = 0; for my $luku ( @{$_[0]} ) { $summa += ($luku - $_[1]) ** 2; } $summa /= $#{$_[0]}; return sqrt $summa; } # Lue taulukko muistiin - keskeytä varoitukseen jos sarakkeitten # lukumäärä vaihtelee # while (<>) { chomp; my @rivi = split /\t+/, $_; my $pit_nyt = @rivi; if (!defined($eka)) { $pit = $pit_nyt; $eka = 'sarakkeitten lukumäärä kiinnitetty'; } die "$0: Taulukon sarakemäärä ei ole vakio!\n" unless $pit == $pit_nyt; push @tau, \@rivi; } # Normalisoi sarake kerrallaan s.e. # - kerää sarakkeen arvot kaikilta riveiltä # - laske niitten keskiarvo ja lukumäärä # - vähennä jokaisesta arvosta sarakkeen keskiarvo ja jaa # tulos keskihajonnalla tallentaen tulos uuteen taulukkoon # for my $i (0..$pit-1) { my (@sarake, $summa, $riveja, $karvo, $khajonta); $summa = 0; $riveja = 0; for my $rivi (@tau) { push(@sarake, ${$rivi}[$i]); $summa += ${$rivi}[$i]; $riveja += 1; } $karvo = $summa / $riveja; $khajonta = keskih(\@sarake, $karvo); for my $rivi (0..@sarake-1) { $ntau[$rivi][$i] = sprintf "%.3f", ($khajonta == 0) ? 0 : ($sarake[$rivi] - $karvo) / $khajonta; } } # Tulosta alkuperäinen taulukko # print join("\t", @{$_}), "\n" for @tau; print "\n"; # Tulosta normalisoitu taulukko print join("\t", @{$_}), "\n" for @ntau;