Position vom Maximum? < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 10:31 Mi 24.01.2007 | Autor: | mawai |
Hallo,
ich habe eine Kennfeld [A] und suche das Maxiumum -> max(max[A])
dies gibt mir ja den Wert wieder. Wie aber kann ich mir auch ausgeben lassen, an welcher Position das Maxiumum ist (x-Achse 5, y-Achse 10)?
Desweiteren interpoliere ich mit x=0:0.1:1000 und y=0:0.01:1000 in das Kennfeld. Das liefgert mir ja Ausgangsgrößen (hier z.B. bei x=5 und y=10 das Maximum). Wenn ich mit dem kompletten x,y-Vektor hineininterpoliere kommt leider "Out of Memory".
Wie kann ich eine Scheleife programmieren, damit ich mit jedem Wert einzel intepoliere, das Ergebnis in eine Matrix schreibe usw. ?
Vielen Dank
|
|
|
|
Hallo,
da das Maximum immer nur entlang einer Dimension gebildet wird, muss man einen kleinen Umweg gehen:
[maxwerte, maxzeilen] = max(A);
[maxwert, maxspalte] = max(maxwerte);
maxzeile = maxzeilen(maxspalte);
Nun hast du in maxzeile bzw. maxspalte die Indizes des größten Elements der Matrix A.
Zur Schleife:
Es sollte keinen großen Unterschied machen, ob du alles auf einmal interpolierst oder einzeln. Die Endmatrix ist wohl eher das Problem. Bei ca. 10.000*100.000=1.000.000.000 (1 Milliarde!) Einträgen macht der Rechner auf jeden Fall schlapp.
Solltest du die Einträge anderweitig verarbeiten und nicht alle speichern wollen, kannst du einfach schreiben:
for x=0:0.1:1000,
for y=0:0.01:1000,
<wie üblich interpolieren und Wert verarbeiten>
end;
end;
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 18:19 Mi 24.01.2007 | Autor: | mawai |
Vielen Dank für die Antwort, das mit dem Maximum geht.
Zur Interpolation:
ich will eben die Differenz herausbekommen, wenn ich ein Kennfeld mit unterschiedlichen Schrittweiten abtaste.
Hierzu muss ich eben mit jeder Möglichkeit in das Kennfeld interpolieren.
Genau bei diesem Vorgehen kommt dann eben "Out of Memory"
Wie kann ich das Problem lösen oder umgehen?
|
|
|
|
|
Hallo,
die komplette Matrix wirst du nicht berechnen können. Du kannst sie nur elementweise berechnen (wie in der Schleife) oder in vielen kleineren Teilmatrizen.
Wenn du weiterhin Probleme hast, dann schildere dein Vorhaben etwas detaillierter. Was willst du womit vergleichen? Komplett oder elementweise oder aufsummiert? Vielleicht eine "Algorithmusbeschreibung"?
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 21:29 Mi 24.01.2007 | Autor: | mawai |
Also ich lade mir ein Datenkennfeld in Matlab. Das sieht so aus:
Kennfeld=(x,y,z) , x=Size(16x1); y=Size(16x1); z=size(16x16)
x =
-30.1000
-20.1000
-10.1000
-0.1000
9.9000
19.9000
29.9000
39.9000
49.9000
59.9000
69.9000
79.9000
89.9000
99.9000
114.9000
119.9000
y =
-30.1000
-20.1000
-10.1000
-0.1000
9.9000
19.9000
29.9000
39.9000
49.9000
59.9000
69.9000
79.9000
89.9000
99.9000
114.9000
119.9000
und eben die 16x16 z-Matrix.
Die Drehzhal und die Temperatur werden ja von Signalgebern ermittelt, dann geht man ins Kennfeld und bekommt seine z-Lösung.
Nun will ich jeden erdenklichen Betriebspunkt im Kennfeld ermitteln und darstellen. Hierzu muss ich ja mit allen möglichen X und y-Werten in das Kennfeld interpolieren.
x-Achse ist Drehzahl und geht von 0 - 5750 (1.Schrittweite 0.1 2.Schrittweite 40)
y-Achse ist Temperatur und geht von -30 - 120 (1.Schrittweite 0.01 2.Schrittweite 0.1)
Also als Ergebnis bekomme ich oder hätte ich gerne
wieder ungefähr das gleiche Kennfeld, nur viel feiner abgetastet.
Und dies eben mit zwei unterschiedl. Schrittweiten um einen Unterschied festzustellen.
|
|
|
|
|
Hallo,
nochmal an dieser Stelle: Du wirst das gesamte Feld in der höchsten Auflösung nicht interpolieren können, das überfordert den Speicher.
Es bietet sich aber vielleicht tatsächlich an, immer Teilmatrizen für beide Auflösungen zu berechnen und die Teilergebnisse auszuwerten. Allerdings ist mir nicht klar, wo der Unterschied zwischen den beiden Interpolationen sein soll. Es gibt enger zusammenstehende Werte, aber mir will nicht in den Schädel, was das bringen soll.
Etwa, dass bei der höheren Auflösung noch bessere Lösungen gefunden werden? Falls ja, würde ich mir immer zwei aufeinanderfolgende x- und y-Werte der gröberen Auflösung nehmen, die z-Werte dafür interpolieren und dann auch für die Werte dazwischen, die in der höheren Auflösung vorkommen. So könnte man immer Schritt für Schritt vergleichen.
Aber einen Programmvorschlag kann ich nicht machen, weil mir noch nicht ganz klar ist, was das Ergebnis sein soll.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:08 Mi 24.01.2007 | Autor: | mawai |
Im Prinzip richtig verstanden. Mit einer feineren Auflösung in das Kennfeld interpolieren liefert ein genaueres Ergebnis. Ich will nun ermitteln, wie groß und wo der maximale Fehler ist, wenn ich mit einer schlechteren Auflösung interpoliere.
Und den bekomme ich doch nur, ich hoffe ich verstehe das auch richtig, wenn ich mit den unterschiedl. Auflösungen in das komplette Kennfeld interpoliere.
Aber wie ich das in einer Schleife programmiere und dann auch wieder zusammenfügen kann ist mir noch ein Rätsel.
|
|
|
|
|
Hallo,
wie wär's mit folgender Vorgehensweise (in Pseudocode, an den Rändern nicht ganz korrekt):
maxError = -inf; maxErrorX = -1; maxErrorY = -1;
for x=xmin:groberXSchritt:xmax,
for y=xmin:groberYSchritt:ymax,
<Wert für x,y bestimmen, falls besser als alle bisher: Wert & Pos merken>
for xx=x-groberXSchritt/2:feinerXSchritt:x+groberXSchritt/2,
for yy=y-groberYSchritt/2:feinerYSchritt:y+groberYSchritt/2,
<besten Wert für alle xx,yy bestimmen, falls Wert für x,y übernommen wurde, xx,yy,zz merken; Fehler berechnen, falls maximal, merken>
end;
end;
end;
end;
So ungefähr... Ich weiß ja nicht genau, wie du es haben willst.
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:43 Do 25.01.2007 | Autor: | mawai |
Tut mir leid. Das vertseh ich nicht ganz und ich war auch ein wenig auf dem Holzweg.
Also nochmal von vorn:
ich habe zwei x-Vektoren und 2 y-Vektoren:
x1=(0:1:1000) y1=(0:0.1:100)
x2=(0:10:1000) y2=(0:1:100)
die maximale differenz zwischen x1/x2 und y1/y2 zu ermitteln ist klar.
Hier ist x1=5 -> x2 rundet auf 10 maximaler Fehler ist also 5
Hier ist y1=0.5 -> y2 rundet auf 1 maximaler Fehler ist 0.5
Jetzt interpoliere ich aber mit genau diesem maximalen Fehler ja auch in das Datenkennfeld.
Und dann will ich eben den Fehler herausbekommen, der dadurch entsteht. Ich krieg das in der Schleife nicht verschachtelt. Also das der Wert x1=5 zu x2=10 gehört usw........
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 09:05 Fr 26.01.2007 | Autor: | Martin243 |
Hallo,
hmmm, vielleicht hilft dir folgendes weiter. Du musst es dann in deiner Schleife unterbringen, die x1_index durchläuft (für y entsprechend)
x1_index=336; %z.B.
x2_index = find(x1(x1_index)>=x2);
x2_index=x2_index(end);
if abs(x1(x1_index)-x2(x2_index))>=abs(x1(x1_index)-x2(x2_index+1)),
x2_index=x2_index+1;
end;
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:24 Fr 26.01.2007 | Autor: | mawai |
Versteh ich jetzt wieder nicht ganz.
Wie ich es logisch machen kann ist mir echt klar, mir fehlt dann nur das Matlab-Wissen.
also z.B.
x1=(0 1 2 3 4 5 6 7 8 9 10.....100); y1=(0 1 2 3 4 5 6 7 8 9 10......100)
x2=(0 10 20 30 40.....100); y2=(0 10 20 30 40.....100)
mit diesen Werten interpoliere ich in ein Kennfeld.
Wenn x1=0;y1=0 ist x2/y2=0 und ich bekomme den gleichen Wert.
Wenn x1=4;y1=4 ist x2/y2=0 und ich bekomme einen anderen Wert für x1/x2.
Wenn x1=5;y1=5 ist x2/y2=10 und ich bekomme wieder einen anderen Wert für x1/x2.
Das zieht sich durch alle Mögliche Betriebspunkte, und am Schluss will ich an jedem Punkt die Differenz wissen und den Punkt mit der Maximalen Differenz.
Da gibt es doch die Befehle Modulus usw.
Aber wie gesagt, das Programmieren lag mir noch nie....
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:38 Fr 26.01.2007 | Autor: | martin111 |
also z.B.
x1=(0 1 2 3 4 5 6 7 8 9 10.....100); y1=(0 1 2 3 4 5 6 7 8 9 10......100)
x2=(0 10 20 30 40.....100); y2=(0 10 20 30 40.....100)
mit diesen Werten interpoliere ich in ein Kennfeld.
Wenn x1=0;y1=0 dann ist x2/y2=0 und ich bekomme den gleichen z-Wert.
Wenn x1=4;y1=4 dann ist x2/y2=0 und ich bekomme einen anderen z-Wert.
Wenn x1=5;y1=5 dann ist x2/y2=10, es wird also aufgerundet und ich bekomme wieder einen anderen z-Wert.
Das zieht sich durch alle Mögliche Betriebspunkte, und am Schluss will ich an jedem Punkt die Differenz wissen und den Punkt mit der Maximalen Differenz.
Ich muss also bestimmte z-Werte wiederum anderen z-Werte zuordnen.
Da gibt es doch die Befehle Modulus usw.
Aber wie gesagt, das Programmieren lag mir noch nie....
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:19 Sa 27.01.2007 | Autor: | Martin243 |
Hallo,
ich habe mit for-Schleifen experimentiert und die Berechnungen dauerten minutenlang... Hier meine andere Lösung:
Es sind gegeben:
x,y,z: bekannte Daten
x1,y1: feine Aufteilung der beiden Achsen
x2,y2: grobe Aufteilung der beiden Achsen
[X1,Y1]=meshgrid(x1,y1); %feines Koordinatengitter erzeugen
x2 = interp1(x2,x2,x1,'nearest');
y2 = interp1(y2,y2,y1,'nearest'); %grobe Achseneinteilung verfeinern
[X2,Y2]=meshgrid(x2,y2); %aus ursprünglich grober Einteilung Gitter derselben Größe erzeugen wie aus der feinen Aufteilung
zdiff=interp2(x,y,z,X1,Y1)-interp2(x,y,z,X2,Y2); %Differenzmatrix der beiden Interpolationen berechnen, hier vorzeichenbehaftet, für Maximumssuche -> abs
Das war es denn auch. Für jeden Punkt (x,y) der feineren Aufteilung hast du in zdiff(y,x) die Abweichung von "feiner" zu "grober Interpolation".
Natürlich sind die Werte von zdiff abhängig von der Interpolationsmethode. Schau dir dazu die Hilfe zu interp2 an!
Hier mal die absolute Abweichung für Zufallswerte für z:
[Dateianhang nicht öffentlich]
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:33 Sa 27.01.2007 | Autor: | mawai |
Klasse, vielen herzlichen Dank.
alos verstehe ich das jetzt richtig, das mit der Interpolation nearest immer auf und abrundet.
Ich hatte hatte halt bisher immer die lineare Interpolation und dadurch bekomme ich die Differenz ja nicht raus.
Und durch die Interpolation bei der Differenzberechnung mache ich auch nichts falsch?
Bin ich hier absolut von den Daten unabhängig oder geht es nur bei einer Monotonie?
Ein Problem noch:
weil ich nunmal die max. Differenz entdecken möchte muss ich ja mit jedem möglichen Betriebspunkt interpolieren.
Die tatsächliche Schrittweite ist 0.01, das geht nicht?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:45 Sa 27.01.2007 | Autor: | Martin243 |
Hallo,
> alos verstehe ich das jetzt richtig, das mit der Interpolation nearest immer auf und abrundet.
Jepp.
> Und durch die Interpolation bei der Differenzberechnung mache ich auch nichts falsch?
> Bin ich hier absolut von den Daten unabhängig oder geht es nur bei einer Monotonie?
Du bist von den Daten unabhängig, aber die x- und y-Werte müssen schon monoton sein. Ansonsten verstehe ich die Frage nicht ganz.
> Die tatsächliche Schrittweite ist 0.01, das geht nicht?
Da must du ein Vielfaches der aktuellen Berechnungen leisten. Das könnte dauern...
Wenn du dich darauf einlässt, kannst du die Berechnung für Teilmatrizen wiederholen und dir immer nur das Maximum merken. Dafür sollte der Speicher noch reichen, aber es dauert natürlich auch genau so lang.
Ach ja: Bei linearer Interpolation sollte es eigentlich auch reichen, nur für die Punkte genau zwischen den Punkten des X2/Y2-Gitters zu interpolieren.
Da sollte die Abweichung am größten sein. Dann nur mit den entsprechenden Z2-Werten im X2/Y2-Gitter vergleichen und fertig!
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:34 Sa 27.01.2007 | Autor: | mawai |
Auf die Berechnung auf Teilmatrizen muss ich mich wohl einlassen. Und zum Schluss will ich eigentl. die komplette Differenzmatrix plotten.
Muss ich also den Interpolationsbefehl stückeln, die Teilmatrizen später wieder zusammenfügen und dann Plotten?
Gibt es da keine andere Lösung.
Lineare Interpolation genau zwischen den Punkten für max. Abweichung?
Genau das kann ich doch nicht machen. Es könnte doch durchaus auch sein, das bei Schrittweite 11 der z-Wert einen Pik hat. Der wird bei der linearen dann ja nicht berücksichtigt.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:34 Sa 27.01.2007 | Autor: | Martin243 |
Hallo,
> Auf die Berechnung auf Teilmatrizen muss ich mich wohl einlassen. Und zum Schluss will ich eigentl. die komplette Differenzmatrix plotten.
Ach, ich dachte, du suchst nur das Maximum...
> Muss ich also den Interpolationsbefehl stückeln, die Teilmatrizen später wieder zusammenfügen und dann Plotten?
Hmm, wieder zusammenfügen? Wenn der Rechner das mitmacht, ist es kein Problem. Überleg nur, wie groß die Matrix am Ende wird. Evtl. musst du die Teilmatrizen getrennt in ein Koordinatensystem hineinplotten.
> Gibt es da keine andere Lösung.
Ich sehe nach wie vor das Rechenzeitproblem (ok, dann dauert es etwas länger) und das Speicherproblem (das sich nicht so leicht lösen lässt).
> Lineare Interpolation genau zwischen den Punkten für max. Abweichung?
> Genau das kann ich doch nicht machen. Es könnte doch durchaus auch sein, das bei Schrittweite 11 der z-Wert einen Pik hat. Der wird bei der linearen dann ja nicht berücksichtigt.
Ich dachte, du hättest die lineare Interpolation benutzt. Welche Art benutzt du denn?
Das Argument mit dem Peak verstehe ich nicht.
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:53 Sa 27.01.2007 | Autor: | mawai |
Ach ja: Bei linearer Interpolation sollte es eigentlich auch reichen, nur für die Punkte genau zwischen den Punkten des X2/Y2-Gitters zu interpolieren.
Da sollte die Abweichung am größten sein. Dann nur mit den entsprechenden Z2-Werten im X2/Y2-Gitter vergleichen und fertig!
So wie ich diese Aussage verstehe, soll die max. Abweichung dort sein, wo auch die max. Abweichung zwischen den Eingangsgrößen ist?
Das stimmt doch aber nicht.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 00:04 So 28.01.2007 | Autor: | Martin243 |
Hallo,
> So wie ich diese Aussage verstehe, soll die max. Abweichung dort sein, wo auch die max. Abweichung zwischen den Eingangsgrößen ist?
> Das stimmt doch aber nicht.
Warum nicht?
Schauen wir uns mal das Bild an:
[Dateianhang nicht öffentlich]
Rot sind die gegebenen Messwerte, blau sind linear interpolierte Werte. Sie liegen also auf der gestrichelten roten Geraden. Grau sind nun auch interpolierte Werte bei feinerer Einteilung. Da sie aber auch auf der roten gestrichelten Linie liegen, sieht man, welcher graue Punkt die größte vertikale Abweichung zu den blauen Punkten hat, oder?
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: gif) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:20 So 28.01.2007 | Autor: | mawai |
So ist das schon klar, ich glaube wir reden grad aneinander vorbei.
Welchen Fehler/Abweichung ich ermitteln will weißt du ja hoffentlich.
Und um diesen zu ermitteln, muss ich auf jeden Fall mit exakt der 2 unterschiedl. Auflösungen das komplette Kennfeld interpolieren, oder?
Eine andere Wahl habe ich doch nicht.
Dieser Punkt ist auch grad ein Problem, da eben sofort die Meldung "Out of Memory" kommt bei der Interpolation mit 0.01 Schrittweite.
Theoretisch sollte der Maximale Fehler durch unterschiedl. Schrittweite ja dort auftreten, wo das Kennfeld seine max.Steigung hat.
Aber ich will ja generell über den kompletten Betriebsbereich die abweichung darstellen.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:00 Mo 29.01.2007 | Autor: | mawai |
Also vor lauter interpolieren usw. verliere ich da echt so langsam den Überblick. Und mir ist echt nicht immer ganz klar, ob das richtig ist was ich mache.
Ich hab meine M-file mal angehängt, habe leider immer noch ein Problem mit der Interpolation der Teilmatrizen.
Kannst du mir hierbei bitte weiterhelfen?
[mm] [C:\Fall2_Map_allgemein.m=1] [/mm] Datei-Anhang [mm] [/C:\Fall2_Map_allgemein.m]
[/mm]
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Hallo,
ich habe es hier versucht und es ist SAULANGSAM. Ich denke, damit überforderst du so jeden Rechner. Es sind große Datenmengen und vielleicht sollte man nach jeder Interpolation die Teiloberfläche per surf ausgeben (mit hold-Befehl und ggf. Umschalten per figure(i)).
Mit fällt echt nix Besseres ein.
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:31 Di 30.01.2007 | Autor: | mawai |
Vielen Dank. Du bist der Beste......
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:44 Mo 05.02.2007 | Autor: | Martin243 |
Hallo,
ich antworte hier mal auf deine PN.
Die verwirrenden Schleifen werden verschwinden, wenn wir unsere Strategie auf die von dir genannte (größte Steigung) umstellen. Also lassen wir die mal beiseite.
Zuerst sollten wir vielleicht doch auf die gradient-Funktion verzichten und simple Differenzen in x- und in y-Richtung bilden, da uns ja nicht die Steigung in den ursprügnlichen Rasterpunkten interessiert sondern in den Flächen dazwischen.
Also nehmen wir unser altes Kennfeld z und suchen uns die Rasterflächen mit der maximalen Steigung:
diff_x = z(:,2:end) - z(:,1:end-1);
diff_y = z(2:end,:) - z(1:end-1,:);
[x_spaltenmaxima, x_spm_zeilen] = max(abs(diff_x));
[diff_x_max, diff_x_max_spalte] = max(x_spaltenmaxima);
x_max_zeile = x_spm_zeilen(diff_x_max_spalte);
[y_spaltenmaxima, y_spm_zeilen] = max(abs(diff_y));
[diff_y_max, diff_y_max_spalte] = max(y_spaltenmaxima);
y_max_zeile = y_spm_zeilen(diff_y_max_spalte);
Nun wissen wir, dass die größten Steigung in x-Richtung in der Rasterfläche zwischen x(diff_x_max_zeile, diff_x_max_spalte) und x(diff_x_max_zeile+1, diff_x_max_spalte+1) und zwischen y(diff_x_max_zeile, diff_x_max_spalte) und y(diff_x_max_zeile+1, diff_x_max_spalte+1) liegt. Dasselbe gilt in y-Richtung, nur eben mit den y_max-Werten.
Vielleicht reicht das und du suchst die Mitte dieser Rasterfläche und interpolierst um diese Mitte herum?
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:21 Mo 05.02.2007 | Autor: | mawai |
Vielen Dank.
Zur Kontrolle und Bestätigung ist das interessant.
Ich habe mir aber nochmal Gedanken gemacht:
Die Berechnung mit der Schleife klappt einwandfrei, und am schnellen Rechner geht es eigentl. recht zügig. Es scheitert eben nur an der grafischen Darstellung.
Wenn ich meine beide Matrizen habe (z1=gute Abtastung, z2=schlechte Abtastung) und berechne die Differenz zDiff.
Nun wäre es sehr interessant zu wissen, zwischen welche z1 und z2 Werten diese Differenz eben zustande kommt.
Also maximale Differenz tritt auf bei z1 bei (x1,y1) -> entspricht z2 bei (x2,y2)
Und mal angenommen ich habe nun ein "Plotfähiges" Kennfeld, kann ich mir diese Position im Plot auch automatisch kenntlich machen?
|
|
|
|
|
Hallo,
die Position (bzw. die Indizes der Matrixelemente) lässt du dir doch am besten gleich bei der Maximumssuche ausgeben. Wie das geht, siehst du in meinem vorherigen Beitrag.
Das automatische Plotten: Was meinst du damit? Wenn du x,y und z kennst, dann kannst du doch gleich an dieser Stelle ein Sternchen (oder so) plotten.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:16 Mo 05.02.2007 | Autor: | mawai |
Die Position wie du sie vorher erklärt hast verstehe ich, aber das hilft mir glaub ich nicht weiter:
[maxwerte, maxzeilen] = max(zdiff);
[maxwert, maxspalte] = max(maxwerte);
maxzeile = maxzeilen(maxspalte);
zdiff ergibt sich ja aus 2 Matrizen. Ich will nun wissen, wie die Maximale Differenz zustande kam. Und nicht nur die Position, sondern vielmehr den Wert.
1.) Schrittweite 5
z1=100, bei x1=5 und y1=5
2.) Schrittweite 10
z2=130, bei x2=10 und y2=10
wenn x1=5 und y1=5, da x2 und y2 nur 10 Schrittweite haben ergibt sich somit 130 , max Differenz ist 30.
Und wie kann ich dort dann in den Plot ein Sternchen oder Punkt hineinbringen?
|
|
|
|
|
Hmmm,
du hast die z-Werte doch vorher auch berechnet. Also kannst du nun über den Index auf die x1/y1- und x2/y2-Werte schließen. Hierfür interpolierst du nochmal und hast die Werte z1 und z2, bei denen zdiff maximal ist.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:54 Di 06.02.2007 | Autor: | mawai |
Hast du ja Recht, habs hinbekommen.
Wie kann ich jetzt das Maximum mit in den Surf Befehl bringen?
Also in dem Differenzkennfeld soll das MAximum schön ersichtlich mit einem z.B. Punkt gekennzeichnet werden.
Perfekt wäre sogar, wenn dann auch noch im Plot die Koordinate des Maximum markiert wird. Vom Punkt quasi Linien auf die Achsen gehen....
Kann man das automatisiert miteinbringen. Ohne Linien im Plot einfügen?
|
|
|
|
|
Hallo,
> Hast du ja Recht, habs hinbekommen.
Freut mich!
> Wie kann ich jetzt das Maximum mit in den Surf Befehl bringen?
Gar nicht. Ich würde es einfach mit plot3 machen. Also zuerst surf über die Fläche, dann hold on, dann plot3 mit den Koordinaten des Punktes, also z.B. plot3(xmax, ymax, zmax, 'r*');
> Also in dem Differenzkennfeld soll das MAximum schön ersichtlich mit einem z.B. Punkt gekennzeichnet werden.
> Perfekt wäre sogar, wenn dann auch noch im Plot die Koordinate des Maximum markiert wird. Vom Punkt quasi Linien auf die Achsen gehen....
> Kann man das automatisiert miteinbringen. Ohne Linien im Plot einfügen?
Automatisch geht gar nix... Neben dem obigen plot3 mit dem einen Punkt malst du noch zwei weitere Linien: eine vom Maximum zur x-Achse und eine vom Maximum zur y-Achse.
Also z.B.: surf([xmax; 0], [ymax;ymax], [zmax; zmax], 'r--');
und
surf([xmax; xmax], [ymax;0], [zmax; zmax], 'r--');
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:40 Do 08.02.2007 | Autor: | mawai |
Ich habe leider nochmal ein spezielles Anliegen wegen der Interpolation:
Und zwar habe ich mich geirrt. Die Interpolation mit "nearest" kann ich hier nicht nutzen.
Gegebene Daten:
x=0:10:100;
y=-20:10:20;
z=rand(length(x),length(y));
Nun werden die Daten mit 2 unterschiedl. Schrittweiten abgetastet:
Fall1: x1=0.5; y1=0.1
Fall2: x2=40; y2=0.8
Achtung: x2 ist so lange 0, bis x1=40 ist -> nicht schon bei 20 wie das bei "nearest" der Fall wäre !!!!!
Außerdem sollte automatisch drüberhinausinterpoliert werden falls die Grenzen mit der Schrittweite nicht aufgehen sollten.
Wie bekomme ich das hin? Habe schon vieles ausprobiert, dacht eigentl. Schon das es auch funktioniert, in der Praxis habe ich aber bemerkt, dass es an den Vektorenden nicht passt :-(
Bisher hatte ich das sogemacht, das ich mit "nearest" interpoliert habe, und habe x2 dann um die Überlappung verschoben, den Vektor dann am Anfang verlängert und hinten gekürzt. Hier mache ich wohl auch dne Fehler.
Hat mir jemand bitte eine Lösung?
|
|
|
|
|
Hallo,
> Achtung: x2 ist so lange 0, bis x1=40 ist -> nicht schon bei 20 wie das bei "nearest" der Fall wäre !!!!!
Dann nutze für die Interpolation einfach den Wert (x1-20), also den x1-Wert minus halbe x2-Schrittweite. Dann geht es wieder mit 'nearest'.
> Außerdem sollte automatisch drüberhinausinterpoliert werden falls die Grenzen mit der Schrittweite nicht aufgehen sollten.
Über die Grenzen hinaus Interpolieren gibt es nicht. Das ist dann nämlich Extrapolation. Damit begibt man sich aufs Glatteis, weil man ja außerhalb seines ursprünglichen Datenfeldes ist. Ich würde eher den Bereich der zu interpolierenden x- und y-Werte kürzen, etwa:
x1start:x1schrittweite:x2ende
Damit stellst du sicher, dass du nie über den letzten x2-Wert hinausschießt. Für deine Aufgabenstellung stellt das wohl keinen Nahcteil dar.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:17 Do 08.02.2007 | Autor: | mawai |
Das funktioniert nicht, oder ich blicks mal wieder nicht.
Im Moment sieht das so aus:
x1=x(1):xaE1:x(length(x));
y1=y(1):yaE1:y(length(y));
x2=x(1):xaE2:x(length(x));
y2=y(1):yaE2:y(length(y));
x2 = interp1(x2,x2,x1,'nearest');
y2 = interp1(y2,y2,y1,'nearest'); %grobe Achseneinteilung verfeinern
das geht nicht:
x2 = interp1(x2,x2,x1-20,'nearest');
Problem extrapolieren:
wenn in Fall1 x-Achse bis 130 geht und in Fall2 durch die Schrittweite 40 bei 120 Schluss ist, extrapoliert das Steuergerät. Ich würde das gerne berücksichtigen.
|
|
|
|
|
Hallo,
> das geht nicht:
> x2 = interp1(x2,x2,x1-20,'nearest');
Wieso nicht? Welche Fehlermeldung? Mit einfachen Zahlen ging das bei mir gerade...
> Problem extrapolieren:
>wenn in Fall1 x-Achse bis 130 geht und in Fall2 durch die Schrittweite 40 bei 120 Schluss ist, extrapoliert das Steuergerät. Ich würde das gerne berücksichtigen.
OK, aber dann musst du dir schon selber überlegen, wie das Steuergerät extrapolieren soll. Für die Interpolation war ja 'linear' die Strategie. Für die Extrapolation brauchst du auch eine geeignete Methode. Das könnte schwierig werden.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:58 Do 08.02.2007 | Autor: | mawai |
Wie?
Das sind meine Werte:
gegebene Daten:
x=0:250:5750;
y=-30:10:120;
Daten zum interpolieren, Fall1 und Fall2:
x1=x(1):0.5:x(length(x));
y1=y(1):0.1:y(length(y));
x2=x(1):40:x(length(x));
y2=y(1):0.8:y(length(y));
x2 = interp1(x2,x2,x1-20,'nearest');
y2 = interp1(y2,y2,y1-0.4,'nearest'); %grobe Achseneinteilung verfeinern
Jetzt repräsentiert Fall2 solange x2=0, bis x1=40 erreicht. Dann ist x2 solange 40, bis x1=80 erreicht usw.
Der Befehl geht, nur bekomme ich eben am Anfang NaNs wegen <0 und gegen Ende, wenn x1=>5720 geht auch NaNs.
Wie kann ich das eliminieren? Am Anfang sollte ja dann immer 0 sein und gegen Ende ab 5720 sollte Fall2 dann 5750 sein?
|
|
|
|
|
Hallo,
> Der Befehl geht, nur bekomme ich eben am Anfang NaNs wegen <0 und gegen Ende, wenn x1=>5720 geht auch NaNs.
> Wie kann ich das eliminieren? Am Anfang sollte ja dann immer 0 sein und gegen Ende ab 5720 sollte Fall2 dann 5750 sein?
Ich gebe zu, dass ich das übersehen habe. Das passiert nämlich, wenn es ans Extrapolieren geht. Das beherrscht die interp-Methode natürlich nicht.
Aber kein Problem: Wir korrigieren die NaNs einfach nachträglich:
x2 = interp1(x2,x2,x1-20,'nearest');
x2_notnan = find(~isnan(x2));
x2(1:x2_notnan(1)-1) = x(1);
x2(x2_notnan(end)+1:end) = x(end);
Entsprechendes gilt für y2.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 00:09 Fr 09.02.2007 | Autor: | mawai |
Danke, stimmt aber leider immer noch nicht ganz.
x1 ist erst bei der letzten Stützstelle 5750.
Vorher darf x2 auch nicht 5750 sein, sonder hier 5720.
Ich darf nicht alle NaNs am Schluss in 5750 umändern.......
|
|
|
|
|
Hallo,
sooo schwer klingt das nicht. Meinst du das:
x2 = interp1(x2,x2,x1-20,'nearest');
x2_notnan = find(~isnan(x2));
x2(1:x2_notnan(1)-1) = x(1);
x2(x2_notnan(end)+1:end-1) = x2(x2_notnan(end));
x2(end) = x(end);
?
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:35 Mo 12.02.2007 | Autor: | mawai |
Hallo,
Es geht leider immer noch um das lästige "Out of Memory". Ich muss auf den maximalen Fehler kommen, egal wie lange es dauert, hauptsache es kommt raus.
Anbei mal die m-file, in der ist alles erklärt.
Ich hoffe du kannst mir nochmal weiterhelfen.
Mfg Mawai
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Hallo,
ich habe etwas viel um die Ohren, deshalb nur ein paar Hinweise, die dir aber reichen sollten:
Du hast ja meine Schleife übernommen (ich sehe, sie kommt in zwei Formen vor, muss ich aber nicht verstehen, oder?). Wir sollten hier nicht die gesamten z1- und z2-Matrizen berechnen, sondern nur die gerade aktuellen Teile. Deswegen schreibe ich die erste Interpolations-for-Schleife mal um:
total_max = -1; total_max_pos1 = [0;0]; total_max_pos2 = [0;0];
%Schleife damit Interp2 nicht überlastet
for i = 1:length(y2first),
for j = 1:length(x2first),
z1 = interp2(x,y,z',x1(x2first(j):x2last(j)),y1(y2first(i):y2last(i))');
z2 = interp2(x,y,z',x2(x2first(j):x2last(j)),y2(y2first(i):y2last(i))');
z21absdiff = abs(z2 - z1); %Maximum in dieser Teilmatrix
z21maxabsdiff = max(max(z21absdiff));
if z21maxabsdiff > total_max ,
[index_y, index_x] = find(z21absdiff == z21maxabsdiff);
total_max_pos1 = [x1(index_x), y1(index_y)];
total_max_pos2 = [x2(index_x), y2(index_y)];
total_max = z21maxabsdiff;
end;
%evtl. schon hier die einzelnen Surfaces ausgeben?
[i,j] %nur zum Mitverfolgen, damit man weiß, ob man noch einen Kaffee holen soll
end;
end;
Schau dir den schnell zusammengeschusterten Code mal an, korrigier ihn ggf. und dann sollte es eigentlich gehen...
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:15 Mo 12.02.2007 | Autor: | mawai |
Hab mir den Code angeschaut und sieht auch gut aus. Kann ihn halbwegs nachverfolgen.
Allerdings kommt für mich aus unerklärlichen Gründen ein anderes Ergebnis wie zuvor heraus. Ich habe beide Schleifen mal mit einer schlechteren Schrittweite durchlaufen lassen damit man das Ergebnis plotten kann. Der Plot bestätigt eben das Maximum aus der alten Schleife?
Jetzt bin ich verwirrt welches denn nun richtig ist. Vorher hat eigentlich alles gut gepasst und das Ergebnis war recht plausibel???
Im Anhang die File....
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Hmm,
erstmal einige Anmerkungen:
Dir hätte auffallen müssen, dass die maximale z-Differenz auch bei meinem Code richtig herauskam. Also hättest du dir die Bestimmung der entsprechenden x- und y-Werte ansehen sollen.
Außerdem hatte ich geschrieben, dass du den Code ggf. korrigieren sollst, weil ich ihn mal eben heruntergeschrieben hatte. Aber das hast du gar nicht versucht (obwohl die z-Differenz stimmte)...
Da ich aber nicht so bin;) hier der richtige Code:
total_max = -1; total_max_pos1 = [0;0]; total_max_pos2 = [0;0];
for i = 1:length(y2first),
for j = 1:length(x2first),
z1 = interp2(x,y,z',x1(x2first(j):x2last(j)),y1(y2first(i):y2last(i))');
z2 = interp2(x,y,z',x2(x2first(j):x2last(j)),y2(y2first(i):y2last(i))');
z21absdiff = abs(z2 - z1); %Maximum in dieser Teilmatrix
z21maxabsdiff = max(max(z21absdiff));
if z21maxabsdiff > total_max ,
[index_y, index_x] = find(z21absdiff == z21maxabsdiff);
total_max_pos1 = [x1(x2first(j)+index_x-1), y1(y2first(i)+index_y-1)]
total_max_pos2 = [x2(x2first(j)+index_x-1), y2(y2first(i)+index_y-1)]
total_max = z21maxabsdiff
end;
end;
end;
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:57 Mi 14.02.2007 | Autor: | mawai |
Vielen Dank Martin, aber so ist das nicht ganz. Ich bin einfach eine Programmier-Assel und blick das nicht. Und da du dich in deiner Schleife gut auskennst frag ich eben, ist für dich denke ich kein großer Akt.
Danke sehr.
Und ich habe jetzt schon lange rumprobiert, bekomme aber in die jetztige Schleife nicht die Relativ-Berechnung integriert. Und die Berücksichtigung bei einer Division durch 0.
Es kommt jedenfalls nicht das richtige heraus.
Ist das zuviel verlangt? Danach wäre ich aber überglücklich
|
|
|
|
|
Hallo,
so, jetzt habe ich auch etwas mehr Zeit und bin besser gelaunt...
Das mit der Division durch Null können wir abfangen, indem wir alle Elemente, die auf Inf (Infinity=Unendlichkeit) gesetzt wurden, durch -1 ersetzen. Ansonsten ist die Berechnung analog zu der absoluten.
total_max = -1; total_max_pos1 = [0;0]; total_max_pos2 = [0;0];
rel_max = -1; rel_max_pos1 = [0;0]; rel_max_pos2 = [0;0];
warning off MATLAB:divideByZero;
for i = 1:length(y2first),
for j = 1:length(x2first),
z1 = interp2(x,y,z',x1(x2first(j):x2last(j)),y1(y2first(i):y2last(i))');
z2 = interp2(x,y,z',x2(x2first(j):x2last(j)),y2(y2first(i):y2last(i))');
z21absdiff = abs(z2 - z1); %Maximum in dieser Teilmatrix
z21maxabsdiff = max(max(z21absdiff));
if z21maxabsdiff > total_max ,
[index_y, index_x] = find(z21absdiff == z21maxabsdiff);
total_max_pos1 = [x1(x2first(j)+index_x-1), y1(y2first(i)+index_y-1)];
total_max_pos2 = [x2(x2first(j)+index_x-1), y2(y2first(i)+index_y-1)];
total_max = z21maxabsdiff;
end;
z21reldiff = abs(z21absdiff ./ z1);
z21reldiff(z21reldiff==Inf) = -1; %Neutralisieren der Inf's bei Div. durch Null
z21maxreldiff = max(max(z21reldiff));
if z21maxreldiff > rel_max ,
[index_y, index_x] = find(z21reldiff == z21maxreldiff);
rel_max_pos1 = [x1(x2first(j)+index_x-1), y1(y2first(i)+index_y-1)]
rel_max_pos2 = [x2(x2first(j)+index_x-1), y2(y2first(i)+index_y-1)]
rel_max = z21maxreldiff
end;
end;
end;
warning on MATLAB:divideByZero;
Ach ja, wenn du Prozent haben willst, musst du die Abweichung noch mit 100 multiplizieren. Ich habe ohne gerechnet.
Und wie immer gibt es keine Gewähr, dass der Code richtig ist.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:43 Mi 14.02.2007 | Autor: | mawai |
Super, Vileen Dank. Funktioniert. Braucht aber echt ne Ewigkeit, voll ätzend.
1.Kannst du mir biite noch die Division/0 erklären. Warum -1 ? Und ändert er hier wirklich nur inf=-1, wenn eine Division/o stattfindet oder immer wenn inf drinsteht?
2.Kann ich mir auch noch bei den Berechnungen in der Schleife jetzt auch noch den entsprechenden z-Wert ausgeben lassen. Also zwischen welchen z-Werten ergibt sich zMAx absolut und relativ?
Danke
|
|
|
|
|
Hallo,
> Super, Vileen Dank. Funktioniert. Braucht aber echt ne Ewigkeit, voll ätzend.
Freut mich, dass es geht. An der Geschwindigkeit können wir nicht mehr viel schrauben, fürchte ich.
> 1.Kannst du mir biite noch die Division/0 erklären. Warum -1 ?
Ich habe einfach -1 genommen, weil wir ja nachher das Maximum unter positiven Zahlen suchen. Die -1 wird dann keine Rolle spielen. Ist also willkürlich gewählt mit dem Vorwissen, in welcher Weise wir die Zahlen später verwenden.
> Und ändert er hier wirklich nur inf=-1, wenn eine Division/o stattfindet oder immer wenn inf drinsteht?
Nein, war es denn gefordert? Es wird jetzt immer nur auf Inf untersucht, aber wie sollte es denn sonst zustandekommen? Notfalls sollte man sich die Berechnungen vorher ansehen und testen, ob es noch andere Möglichkeiten gibt, wie z.B. -log(0).
Eine andere Möglichkeit wäre einfach die Elemente durch -1 zu ersetzen, die an der entsprechenden Position in z1 Null sind. Das würde dann so aussehen:
z21reldiff(z1==0) = -1;
Hier würden wir wirklich eine Division durch Null aufspüren!
> 2.Kann ich mir auch noch bei den Berechnungen in der Schleife jetzt auch noch den entsprechenden z-Wert ausgeben lassen. Also zwischen welchen z-Werten ergibt sich zMAx absolut und relativ?
Wenn du das entsprechende (also für absolut oder relativ) [mm] (index_y, index_x)-Paar [/mm] berechnet hast, kannst du direkt [mm] z1(index_y,index_x) [/mm] oder [mm] z2(index_y,index_x) [/mm] nehmen. Bitte teste das mal, weil ich mir wegen der Transosition im interp2-Befehl etwas unsicher bin. Es sollte aber stimmen.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:00 Mi 14.02.2007 | Autor: | mawai |
Tut mir leid. Hab es wie unten abgebildet eingefügt, stimmt aber nicht....
total_max = -1; total_max_pos1 = [0;0]; total_max_pos2 = [0;0];
rel_max = -1; rel_max_pos1 = [0;0]; rel_max_pos2 = [0;0];
warning off MATLAB:divideByZero;
for i = 1:length(y2first),
for j = 1:length(x2first),
z1 = interp2(x,y,z',x1(x2first(j):x2last(j)),y1(y2first(i):y2last(i))');
z2 = interp2(x,y,z',x2(x2first(j):x2last(j)),y2(y2first(i):y2last(i))');
z21absdiff = abs(z2 - z1); %Maximum in dieser Teilmatrix
z21maxabsdiff = max(max(z21absdiff));
if z21maxabsdiff > total_max ,
[mm] [index_y, index_x] [/mm] = find(z21absdiff == z21maxabsdiff);
total_max_pos1 = [mm] [x1(x2first(j)+index_x-1), y1(y2first(i)+index_y-1)]; [/mm]
total_max_pos2 = [mm] [x2(x2first(j)+index_x-1), y2(y2first(i)+index_y-1)]; [/mm]
total_max = z21maxabsdiff;
[mm] z1max_abs=z1(index_x,index_y)
[/mm]
[mm] z2max_abs=z2(index_x,index_y)
[/mm]
end;
|
|
|
|
|
Hallo,
> Hab es wie unten abgebildet eingefügt
Hehe, hast du nicht. Achte bei z1(...) und z2(...) auf die Reihenfolge von [mm] index_y [/mm] und [mm] index_x. [/mm]
Das Problem ist, dass die interp-Funktionen (wie üblich) zuerst x und dann y benutzen. Sonst ist in Matlab aber die Reihenfolge y, x (also Zeile, Spalte) üblich, wie es eben bei Matrizen ist.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 18:00 Do 22.02.2007 | Autor: | mawai |
Danke schön, dieses Problem war ja schnell lösbar
Jedenfalls ist jetzt der Fasching rum und ich mal wieder ne Frage:
Habe die Schleife nun an mehreren Kennfeldern durchlaufen lassen. Allerdings bekomme ich nun wirklich große Differenzen. Das Ergebnis ist auch korrekt, aber ohne grafische Lösung doch etwas beschissen.
Wenn ich mein Ergebnis habe und die Postion des Maximum habe, möchte ich gerne den Bereich um dieses Maximum plotten.
Also Maximum1 zmax bildet sich aus z1 und z2, dass ist bei:
z1 ist bei Stelle y1,x1;
z2 ist bei Stelle y2,x2;
Beides evt. in einem Plot, wie geht das? Die Stützstellenverteilung wäre ja gleich.
Oder gibts viell. auch ne andere Lösung das große Kennfled zu plotten?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:51 Fr 23.02.2007 | Autor: | mawai |
Okay, habe jetzt nach langem probieren eine halbwegs gute Lösung bekommen. Kann mir jetzt den Bereich um den maximalen Fehler plotten.
Ist es aber nicht irgendwie möglich, das Gesamte Kennfeld zu plotten?
Definition eines anderen Gitters, viell. Auswahl der Maximas in den unterschiedl. Intervallen und dann eben grobmaschiger plotten?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:20 Sa 24.02.2007 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|