Verfasst am: 11.07.2010, 09:01
Titel: Problem mit Interpolation
Hallo, also ich hab ein Problem mit der Interpolation. Ich kann in meinem Plot 2 Punkte markieren und anschließend über eine Schaltfläche 'Interpolieren' die Interpolation durchführen/anzeigen.
Dazu merke ich mir jeweils ein paar Punkte (Startpunkt -5, Startpunkt, Startpunkt+5, das gleiche für den Stoppunkt).
Die Interpolation wird auch angezeigt (richtig), das Problem ist, dass weiterhin die Werte im Plot angezeigt werden die eientlich durch die Interpolation entfernt werden sollen.
Ich hab mal meine Ausgabe als Bild angehangen um das Problem zu verdeutlichen.
Verfasst am: 11.07.2010, 17:56
Titel: Re: Problem mit Interpolation
Hallo Jek087,
jeko87 hat Folgendes geschrieben:
Die Interpolation wird auch angezeigt (richtig), das Problem ist, dass weiterhin die Werte im Plot angezeigt werden die eientlich durch die Interpolation entfernt werden sollen.
In Deinem Code-Beispiel ist nicht zu sehen, dass Du versuchst die Orginal-Werte irgendwie zu löschen. Wieso erwartest Du, dass sie entfernt sind?
Kann mir vielleicht jemand weiterhelfen, wie ich den Bereich über der Interploation nicht mit anzeigen kann?
Du kannst die entsprechenden Werte in der Orginal-Kurve überschreiben und dann die ganze Kurve nochmal zeichnen - und die alte Kurve löschen.
Nebenbei: EVALIN ist keine gute Methode um Werte zu transportieren. Es ist viel besser eine Funktion zu schreiben und die Werte als Argumente zu übergeben!
Ja ich wollte mit meinem code eigentlich nur zeigen wie ich die Interpolation durchführe...
es ist mir bewusst, dass ich meine "Originalwerte" löschen muss, jedoch bin ich was Matlab angeht noch nicht soweit integriert
also ich hab mal im Internet und auch in der Hilfe nachgeschaut, dort bin ich auf folgende Möglichkeit gestoßen:
jedoch bin ich nicht weitergekommen, da ich nicht weiß was ich für xneu und yneu einsetzen muss...
anschließend müsste ich dann den Plot p wohl wieder neu ausgeben
deshalb wäre ich froh wenn mir jemand helfen kann oder mir sagen kann ob der Lösungsansatz richtig ist...wäre echt super
Wenn Du noch nicht richtig in Matlab integriert bist, wundert mich der komplexe Ansatz mit EVALIN ausgesprochen. Ich würde sehr einen Aufruf einer Funktion mit Argumenten empfehlen.
Du kannst die XData und YData eines Plots mit GET bekommen und mit SET ändern.
Wenn Du ein vollständiges lauffähiges Program postest, könnte ich entsprechende Änderungsvorschläge machen.
ja also ich hab mich halt einarbeiten müssen in Matlab...bin mir sicher, dass mein Code nicht "sauber" ist, aber mir geht es zuerst mal um die Funktionalität...im Internet oder der Matlab Hilfe findet man schon recht viele Infos und bei Basisproblemen wie einlesen oder speichern von Variablen, anzeigen von einzelnen Spalten oder Zeilen ist es nicht so schwer...trotzdem ist schon viel Zeit draufgegangen.
aber bei spezifischen Problemen, gibt es halt keine "fertigen Lösungen", und ich hab echt Probleme mir dann mit den Erklärungen der Matlab Hilfe Lösungen zu meinem Problem zu basteln...
wenn ich mein Programm öffne, hab ich die Möglichkeit mittels Pfadangabe eine Datei zu laden, von der dann der Originalplot angezeigt wird:
Code:
z=evalin('base','data');
[M N]=size(z);
plot(1:M, z(:,3)); % plot ausgeben - 1.Spalte (id - x achse), % 3.Spalte (fläche - y achse) % nur die 1. und die 3.Spalte enthalten % wichtige Werte für den Plot
hier ist der Code der aufgerufen wird wenn ich die Schaltfläche 'Interpolieren' betätige.
Es wird dann auch eine Linie zwischen den ausgewählten Punkten gezogen, was ja auch richtig ist.
ich weiß nicht ob dies dir weiterhilft, aber ich hoffe ich konnte dir ein wenig klar machen wie ich vorgehe...
ich hab auch die GET Methode eingebaut, nur bin ich nicht sicher ob sie auch so richtig ist, da mir sowohl für xdata als auch für ydata alle Werte angegeben werden
Du musst nun nur noch die interpolierten x und y Werte in die orginalen Vektoren aus XData und YData einfügen. Dafür musst Du die Indices derjenigen x Werte finden, die Du interpoliert hast. Stichworte: FIND, STRFIND (findet nicht nur in Strings, trotz des Namens).
hm ok...
also 'find' sucht mir ja eigentlich alle Indizes oder Werte wo nicht 0 drin steht...also müsste es ja irgendwie damit klappen
meiner Meinung nach müsste ich überprüfen, welche Werte zwischen Start- und Stoppunkt liegen.
aber dazu brauche ich eigentlich die 'find' Funktion nicht ? wenn ich dich richtig verstanden hab
hab mir mal einen Vektor gebastelt für die X-Werte, also:
wenn ich mir die Ausgabe anschaue, ist diese korrekt.
dies liefert mir alle Werte die zwischen dem Bereich Start und Stop liegen (X-Achse)
also hätt ich mal die Werte für die X-Achse ??
dann könnte ich XData also 'Bereich1' mit 'set' übergeben...
mein Problem ist aber, dass ich jetzt auch so ein Vektor für die Y Werte basteln möchte, nur das ist viel komplizierter hab ich gerade gemerkt...
aber wie gesagt, die Funktion 'find' brauch ich doch dafür nicht ?
ist vielleicht aber auch wieder ein Denkfehler, aber die einzige Möglichkeit dir mir persönlich jetzt einfällt
danke erstmal für dein Code Beispiel. Das Problem ist mir jetzt mal etwas klarer.
Aber es tut mir leid wenn ich dir langsam auf die Nerven geh, aber ich hab immer noch einige Probleme damit.
Hier ist mal meine Version:
Code:
x = 0:1:anzBilder; % X-Achse, Anzahl aller Bilder
y = z(:,3); % Y-Achse, alle Werte der 3. Spalte aus der Datei
% Bereich zwischen Start- und Stoppunkt
range = find(and(x >= startpunt, x <= stoppunkt));
start = range(1); % 1. Element aus dem Bereich ?
stop = range(end); % letzte Element aus dem Bereich ?
% Hier ist nun mein Problem... % für X glaub ich es verstanden zu haben... % von Beginn bis zu 1. Punkt vor dem Startpunkt % 1.Punkt nach Stoppunkt bis zum Ende % bei der Schrittweite bin ich mir hingegen nicht sicher ob dies stimmt
% für y fällt es mir ehrlich gesagt echt schwer zu verstehen % ich denke mal, dass es gleich ist wie bei X, aber die Schrittweise (sin(..)) % ist ein Problem für mich...hab versucht es aufzuzeichnen, aber komm % nicht drauf
Die Schrittweite für die Einfügung in den Y-Werten muss genauso groß sein wie in den X-Werten. Andernfalls wäre der Graph verzerrt und hätte unterschiedlich viele X- und Y-Werte (was einen Fehler produzieren würde).
Statt "0.4:0.1:0.9" und "sin(0.4:0.1:0.9)" muss Du die interpolierten Zeit-Punkte und die entsprechenden Werte eintragen.
Vielleicht hilft es Dir, die Kurve mal mit dem Stift in einem Diagramm aufzumalen und die X-Achse zu beschriften. Dann schneide einen vertikalen Streifen heraus als Zeitabschnitt, der interpoliert werden soll. Wenn Du jetzt den einen geänderten vertikalen Streifen einsetzt, ist es ganz offensichtlich, dass die neuen X- und Y-Werte die gleiche Schrittweite und die gleichen Indices bzgl des neuen gesamten Graphen bekommen müssen.
Die Ausgabe stimmt, also die Bereiche werden jeweils korrekt dargestellt.
So, dann hab ich versucht, die Werte einzufügen über die interpoliert werden soll:
Die Fehlermeldung ist weg und wenn ich mir den Bereich jetzt ausgeben lasse für die interpolierten Zeitpunkte stimmt dieser auch.
also für X wäre es also:
Code:
% wobei x ein Vektor ist, welcher jeweils die Werte % StartpunktX, StartpunktX+5, StartpunktX+10 % StoppunktX-10, StoppunktX-5, StoppunktX % enthält
newx = [x1(1:start-1), x, x1(stop+1:end)];
nun muss ich also noch die Werte zu den passenden Zeitpunkten finden, also die Werte für Y.
nur wenn ich so vorgehe wie für die X-Werte, also:
Code:
% wobei y ein Vektor ist, welcher jeweils die Werte % StartpunktY-5, StartpunktY, StartpunktY+5 % StoppunktY-5, StoppunktY, StopppunktY+5 % enthält
newy = [y1(1:start-1), y, y1(stop+1:end)];
dann schau dir mal am besten die Dimensionen von y und y1 im Workspace Browser an. Vermutung: eines ist ein Zeilenvektor, eines ein Spaltenvektor - und den dann transponieren.
hier ist mal der code den ich für die ganze Schaltfläche habe, vielleicht kann mir ja nochmal jemand helfen
Code:
z=evalin('base','data');
[M N]=size(z);
% plot - 1.Spalte (id - x achse), 3.Spalte (fläche - y achse) % nur die 1. und die 3.Spalte enthalten % wichtige Werte für den Plot
p=plot(1:M, z(:,3));
x1 = 0:1:anz; % enthält Werte von 0 bis Anzahl an Bilder
y1 = z(:,3); % 3.Spalte von a_results.txt -> Fläche
wenn ich die Schaltfläche anklicke, kann ich im Workspace, dass die Werte eigentlich stimmen, jedoch kommt immer die Warnung und ich bekomme auch den neuen Plot nicht angezeigt
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.