WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Problem mit Interpolation

 

jeko87
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 21.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2010, 09:01     Titel: Problem mit Interpolation
  Antworten mit Zitat      
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.

Code:
 
      x=evalin('base','X');                    % X-5, X, X+5
      y=evalin('base','Y');                    % Y-5, Y, Y+5
      anz=evalin('base','anzBilder');
      xi=0:size(x):anz;
      yi=interp1(x,y,xi,'linear');
      plot(yi,'r');                                 % interpolation ausgeben
 


kann mir vielleicht jemand weiterhelfen, wie ich den Bereich über der Interploation nicht mit anzeigen kann ?

Danke
mfg

plot.jpg
 Beschreibung:

Download
 Dateiname:  plot.jpg
 Dateigröße:  42.81 KB
 Heruntergeladen:  469 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.07.2010, 17:56     Titel: Re: Problem mit Interpolation
  Antworten mit Zitat      
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?

Code:
 
      x=evalin('base','X');                    % X-5, X, X+5
      y=evalin('base','Y');                    % Y-5, Y, Y+5
      anz=evalin('base','anzBilder');
 


jeko87 hat Folgendes geschrieben:
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!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
jeko87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 21.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2010, 18:16     Titel:
  Antworten mit Zitat      
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 Confused

also ich hab mal im Internet und auch in der Hilfe nachgeschaut, dort bin ich auf folgende Möglichkeit gestoßen:
Code:

p=plot(...); % "originalplot"
set(p, 'xdata', xneu);
set(p, 'ydata', yneu);
 


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

danke
mfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.07.2010, 19:01     Titel:
  Antworten mit Zitat      
Ja, die Idee ist gut.

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.

Gruß Jan[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
jeko87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 21.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2010, 19:36     Titel:
  Antworten mit Zitat      
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.

Code:

x=evalin('base','X');               % X-5, X, X+5
y=evalin('base','Y');                % Y-5, Y, Y+5
anz=evalin('base','anzBilder');
xi=0:size(x):anz;
yi=interp1(x,y,xi,'linear');
plot(yi,'r');                              % interpolation ausgeben

z=evalin('base','data');
[M N]=size(z);
p=plot(1:M, z(:,3));                % Originalplot          
     
test1=get(p,'xdata');              % alle Werte der 1.Spalte werden angezeigt
disp(test1);
           
test2=get(p,'ydata');               % alle Werte der 3.Spalte werden angezeigt
disp(test2);
     
%     set(p, 'xdata', xneu);      % hier müsste ich dann die "neuen" Werte
                                            % zuweisen
%     set(p, 'ydata', yneu);      
 


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 Confused

danke
mfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.07.2010, 21:11     Titel:
  Antworten mit Zitat      
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).

Viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
jeko87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 21.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2010, 21:41     Titel:
  Antworten mit Zitat      
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:
Code:

bereich1=startpunktX:1:stoppunktX;
 


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

mfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.07.2010, 23:04     Titel:
  Antworten mit Zitat      
Ein Beispiel:
Code:
x = 0:0.001:2*pi;
y = sin(x);
range = find(and(x >= 0.4, x <= 0.9));
start = range(1);
stop = range(end);

newx = [x(1:start - 1), 0.4:0.1:0.9; x(stop + 1:end)];
newy = [y(1:start - 1), sin(0.4:0.1:0.9); y(stop + 1:end)];


Mit FIND findest Du also die zu ändernden X- und Y-Werte gleichzeitig.

Viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
jeko87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 21.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2010, 09:57     Titel:
  Antworten mit Zitat      
Hallo,

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

newx = [x(1:start - 1), startpunkt:1:stoppunkt; x(stop + 1:anzBilder)];

% 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

newy = [y(1:start - 1), sin(0.4:0.1:0.9); y(stop + 1:end)];
 


ich dank dir schon mal im Voraus

mfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.07.2010, 11:03     Titel:
  Antworten mit Zitat      
Hallo,

Code:
newx = [x(1:start - 1), 0.4:0.1:0.9; x(stop + 1:end)];
newy = [y(1:start - 1), sin(0.4:0.1:0.9); y(stop + 1:end)];


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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
jeko87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 21.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2010, 19:06     Titel:
  Antworten mit Zitat      
ja, das mit der Schrittweite leuchtet mir ein...
du hast gesagt, ich muss nur noch die Werte einfügen über die ich interpolieren möchte...

um diese Werte zu finden, hab ich mir einfach einen Vektor erstellt...
Code:

x= [startpunkt, startpunkt+5,startpunkt+10];
y= [stoppunkt, stoppunkt+5,stoppunkt+10];
interpol= [x,y];
 


hab mir das ganze zuerst so auf dem Papier aufgezeichnet und die Kurve scheint mir zumindest mal korrekt...

desweiteren hab ich mir den code von vorhin in Matlab mal ausgeben lassen;
Code:

test1=x1(1:start-1);
test2=x1(stop+1:end);
 


Die Ausgabe stimmt, also die Bereiche werden jeweils korrekt dargestellt.
So, dann hab ich versucht, die Werte einzufügen über die interpoliert werden soll:
Code:

newx = [x1(1:start-1), interpol; x1(stop+1:end)];
 


Aber jedesmal wenn ich versuche den code auszuführen, kommt folgende Fehlermeldung:
Code:

??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

Error in ==> gui>btnInterpolation_Callback at 166
       newx = [x1(1:start-1), interpol; x1(stop+1:end)];
 


so jetzt bin ich langsam wirklich am Ende...ich dachte echt, dass ich es jetzt verstanden hätte und eine passende Lösung hab
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.07.2010, 19:11     Titel:
  Antworten mit Zitat      
Hallo,

da wurden , und ; gemischt. Das sollte zumindest den Fehler beheben:
Code:
newx = [x1(1:start-1), interpol, x1(stop+1:end)];

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
jeko87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 21.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2010, 20:33     Titel:
  Antworten mit Zitat      
Ja danke Very Happy

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 kommt wieder die Fehlermeldung
Code:

??? Error using ==> horzcat
CAT arguments dimensions are not consistent.

Error in ==> gui>btnInterpolation_Callback at 168
       newy = [y1(1:start-1), y, y1(stop+1:end)];
 


auch wenn ich , durch ; ersetze hilft nicht...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.07.2010, 20:43     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
jeko87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 21.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2010, 17:49     Titel:
  Antworten mit Zitat      
So ich hab nun alles soweit fertig...also die neuen X-Werte und die neuen Y-Werte stimmen wenn ich sie mit "disp" ausgebe...

nun will ich die neuen Werte meinem Plot zuordnen
Code:

% p steht für meinen Plot
set(p,'XData',newx);
set(p,'YData',newy);
 


wenn ich dann mein Programm starte, kommt immer die Warnung
Code:

Warning: line XData length (419) and YData length (412) must be equal
 


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      
       
range = find(and(x1 >= evalin('base','x1'), x1 <= evalin('base','x6')));
start = range(1);
stop = range(end);
       
newx = [x1(1:start-1), x, x1(stop+1:end)];
newy = [y1(1:start-1); y'; y1(stop+1:end)];  
       
set(p,'XData', newx);    
set(p,'YData', newy);      
 
% hier soll nun der Plot mit meinen neuen Werten angezeigt werden            
plot(p);
 


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


danke
mfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.