Thread Datenblöcke mitteln (8 answers)
Opened by EagleFox at 2006-07-25 14:04

EagleFox
 2006-07-26 12:45
#68381 #68381
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Guten Morgen zusammen!
Vielen tausend Dank für Eure Mühen, Ihr seid echt riesig!
Eure beiden Scripte sind, soweit ich das beurteilen kann und verstanden habe, ja relativ ähnlich. Ich habe mal versucht das in ein Programm für meine Anwendung zu integrieren.

@Linuxer:
Leider kann ich nicht ganz vorraussehen was mit Deinem Code (der mal echt genial kommentiert ist!!!) passiert, aber die Datenblöcke haben NICHT alle die gleiche Größe. Die Variation beträgt aber nur +- 2 Zeilen. Wahrscheinlich passiert das selbe wie mit Ronnies code: die letzten Werte gehen natürlich voll in den Keller, weil ja nicht genausoviele Werte addiert wurden, wie bei den anderen Zeilen, aber durch genau die gleiche Anzahl geteilt wird.

Hier mal mein wahrscheinlich dilettantischer code:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#! /usr/bin/perl
# mittelt mehrere Spektren einer Datei
# Erstes Spektrum ist SPEKTRUMNUMMER
# gemittelt wird ueber ANZAHL folgende Spektren
# HOWTO: ./avg.pl DATEI SPEKTRUMNUMMER ANZAHL

use strict;
use warnings;
use Term::ANSIColor qw(:constants);

if(!defined $ARGV[0]){
printf "\nAus welcher Datei soll gemittelt werden?\n";
$ARGV[0] = <STDIN>;
chomp $ARGV[0];
}

if(!defined $ARGV[1]){
printf "\nWelcher Spektrenblock soll gemittelt werden?\n";
printf BLUE "Anfang:\t";
printf CLEAR;
$ARGV[1] = <STDIN>;
chomp $ARGV[1];
}

if(!defined $ARGV[2]){
printf "\nUeber wieviele Spektren sollen gemittelt werden?\n";
printf BLUE"Anzahl:\t";
printf CLEAR;
$ARGV[2] = <STDIN>;
chomp $ARGV[2];
}


my $file = $ARGV[0];
my $anfang = $ARGV[1];
my $ende = $ARGV[1] + $ARGV[2];

my ($in,$suffix) = $ARGV[0] =~ /(.*?)(\.[^\.]+)$/;
my $out = $in.'.avg'.$ende.'.dat';


open(my $daten,"<",$file) or die $!;
open(my $avg,">",$out) or die $!;

my $data;
my $block = 0;
my %set;
my $set_cnt = 0;

while(do {local $/="\n\n\n";defined($data = <$daten>)}){
chomp $data;

if($block > $anfang && $block < $ende){
my ($n, @m) = split (/\s+/,$data);
$set{$n}->[$_] += $m[$_] for 0 .. $#m;
$set_cnt++;
}

$block++;
}

foreach my $k (sort { $a <=> $b } keys %set) {
print $avg $k, "\t";
print $avg $_/$set_cnt, "\t" for @{$set{$k}};
print $avg "\n";
}


close $avg;
close $file;


Das Programm läuft und das Ergebnis ist super! Bis auf die letzten (variierenden) Zeilen. Macht aber nichts, die letzten Werte kann ich ja im Plot abschneiden. (oder mir bei Gelegenheit überlegen, wie ich das Problem mit dem Teilen anders in den Griff bekomme.)
Ich danke Euch!

View full thread Datenblöcke mitteln