Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8156[/thread]

Vergleich von zwei Kurven



<< >> 5 Einträge, 1 Seite
Gast Gast
 2006-07-11 11:22
#68034 #68034
hi Leute,
ich koennte etwas Hilfe gebrauchen, ich komm nicht weiter.
Ich moechte zwei Kurven vergleichen und den quadratischen Fehler daraus berechnen. Die Kurven sind als Wertepaerchen in zwei Dateien gespeichert. Also immer Zeit und Wert der Kurve. Bis jetzt hab ich immer die Kurve 1 als Referenz genommen und sie mit der 2ten verglichen. Fehlende Punkte hab ich mit Interpolation hinzugefuegt. Ich habs mit Arrays und mit hash probiert, bin aber bei beiden auf keinen gruenen Zweig gekommen, weil sich sobald ich Werte hinzufuege immer die Laufvariablen bzw. schluessel aendern.
Hat einer von nen kleinen genialen Einfall der mich wieder auf die richtige Spur bringt?
Thx
esskar
 2006-07-11 13:08
#68035 #68035
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
wie durchläufst du denn das array?
Thorium
 2006-07-11 15:26
#68036 #68036
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ist eigentlich ganz simpel...

Du speicherst die Daten einfach so:

Code: (dl )
1
2
3
my %punkt = ( x => $wert_x, y => $wert_y );
my @kurve = [ \%punkt, \%punkt ];
@kurve = sort { $kurve[$a]->{x} <=> $kurve[$b]->{x} }, @kurve;


Ein Punkt ist also eine hashref (also eine Referenz auf ein Hash). Das Problem was wir haben ist, dass wir ja nicht wissen, ob die X-Werte nur Natürliche Zahlen sind, deshalb können wir kein Array benutzen. Man könnte das hashref auch durch ein Arrayref ersetzen - vielleicht bringt das Geschwindigkeitsvorteile (erster Wert X, zweiter Wert Y).

Mit dem Sort garantieren wir, dass die X-Werte im Array in aufsteigender Reihenfolge im Array stehen - wenn das File das schon garantiert, kann man sich diesen Schritt schenken.

Du kannst die zwei Kurven nun zu einer Kombinieren:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my @kurve_f = (); # wie oben beschrieben
my @kurve_g = (); # wie oben beschrieben
my %kurven;

foreach my $punkt (@kurve_f) {
$kurven{$punkt->{x}} = [ $punkt->{y}, undef ];
}

foreach my $punkt (@kurve_g) {
$kurven{$punkt->{x}}[1] = $punkt->{y};
}


jetzt hast du ein Hash das folgendermassen aussieht:
Code: (dl )
1
2
3
4
5
6
7
8
my %kurven = (
-3.1 => [ 22, 1 ],
-2.4 => [ 14, 2 ],
-2 => [ 5, 5 ],
-1 => [ undef, 8 ],
0.1 => [ -30, undef ],
5 => [ -3, 61 ],
);

Die undefinierten werte kannst du nun durch Interpolation berechnen...
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
SuKo
 2006-07-17 12:30
#68037 #68037
User since
2006-07-17
3 Artikel
BenutzerIn
[default_avatar]
Danke, das war ne super idee. Bei mir sieht der hash jetzt auch so aus.
Nur wenn ich jetzt die undef-werte interpolieren will hab ich folgendes Problem.
Ich kann den hash durchsuchen und mir die stelle raussuchen an dem ein punkt nicht definert ist, aber den dazugehoerigen Zeitwert (also Schluessel) kann ich mir nicht richtig ausgeben lassen.
Wie kann ich den dafuer sorgen das mir zu der Stelle
(in deinem Beispiel -1 => [ undef , 8 ] )
die '-1' augeben wird.
Ich hoff einer von euch kann mit meiner Problemstellung etwas anfangen, ich weiss die formulierung ist nict so gluecklich. :D
esskar
 2006-07-17 12:43
#68038 #68038
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
foreach my $key (keys %kurven) {
print "$key\n";
}
<< >> 5 Einträge, 1 Seite



View all threads created 2006-07-11 11:22.