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

Matrixelemente sinnvoll entfernen (Filterfunktion)

 

Max24
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 18.08.2014, 14:40     Titel: Matrixelemente sinnvoll entfernen (Filterfunktion)
  Antworten mit Zitat      
Hi!

Folgendes soll mein Programm tun:

Eine fertige Zeichenfunktion, mit der sich eine Linie freihand ziehen lässt, gibt eine Reihe von x und y-Werte in zwei Vektoren aus und plottet die Linie.

Eine weitere Funktion macht aus der Linie eine dreidimensionale Röhre (Tube).

Mein Problem ist, dass wenn man beim Zeichnen mit der Maus zu langsam ist, die Tube nicht mehr gleichmäßig sondern stückweise fehlerhaft ist.

Es sammeln sich also an bestimmten Koordinaten zu viele Messwerte.
Wie kann ich es nun schaffen, dass ich nur in einem gewissen Abstand Werte eintrage, bzw die falschen lösche/korrigiere? Ab ca. 0.01 Abstand kommt es zu Fehlern beim Plotten der Tube.

Hier mein Versuch den Code zu optimieren:
Code:

for(n = 1 : 1 : length(x)-1)
    if( abs([x(n+1) - x(n)]) <= 0.01)  
        x(n) = [];      
        y(n) = [];
    if( abs([y(n+1) - y(n)]) <= 0.01)
        y(n) = [];
        x(n) = [];    
    end
end
 


Klappt leider so nicht. Confused

Grüße,
Max
Private Nachricht senden Benutzer-Profile anzeigen


PinkySan
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 28.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2014, 14:58     Titel:
  Antworten mit Zitat      
Moin.

Coole Idee mit der Freihandzeichnung. Würde das gerne mal in Aktion sehen.

Meine Idee wäre einerseits über den Befehl
Code:
alle doppelten Werte zu entfernen.

Eine andere Möglichkeit (vllt auch darauf aufbauend Question Question ) ist über
Code:
Befehle das ganze auf das von dir gewünschte raster zu legen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Max24
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 18.08.2014, 15:06     Titel:
  Antworten mit Zitat      
interp2 funktioniert leider (noch) nicht richtig.

Welches interp ist denn das der Wahl in diesem Fall?
Code:

xi = linspace(1,length(x),length(x)/100);
yi = interp1(x,y,xi,'spline');


So gehts leider nicht...

Die Werte sind leider auch nicht doppelt, sondern nur nahe beieinander.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.08.2014, 15:23     Titel:
  Antworten mit Zitat      
Hallo,

was klappt denn an deinem ersten Ansatz nicht?

Das Problem könnte darin liegen, dass der Vektor durch das Löschen von Elementen kürzer wird und das in der for-Schleife nicht berücksichtigt wird.

Alternative wäre sowas:
Code:
n = 1;
while (n < length(x)-1)
    if( abs([x(n+1) - x(n)]) <= 0.01)  
        x(n) = [];      
        y(n) = [];
    elseif( abs([y(n+1) - y(n)]) <= 0.01)
        y(n) = [];
        x(n) = [];    
    else
        n = n+1;
    end
end


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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 18.08.2014, 15:26     Titel:
  Antworten mit Zitat      
Er ruft in meinem Codebeispiel nicht mehr die tube-funktion auf.

Die Spline-Interpolation klang sehr vielversprechend, ich erhalte aber:

Error using griddedInterpolant
Interpolation requires at least two sample points in each dimension.

mit interpn
Code:

 xs = linspace(min(x),max(x),1000);
interpn(x,y,xs,'spline');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.08.2014, 15:46     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Er ruft in meinem Codebeispiel nicht mehr die tube-funktion auf.

Das sollte nicht weiter überraschend sein, da im Code von so einem Aufruf nichts zu sehen ist...

Zitat:
mit interpn

Wenn x, y, und xs Vektoren sind, dann wäre interp1 deutlich sinnvoller.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 18.08.2014, 16:06     Titel:
  Antworten mit Zitat      
Habe ich probiert, bekomme die Fehlermeldung, dass meine Werte nicht streng monoton sind.

Im Internet habe ich gelesen dass ich doppelt vorhandene Werte eliminieren muss, davon gibt es komischerweise aber keine. :/
Private Nachricht senden Benutzer-Profile anzeigen
 
PinkySan
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 28.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2014, 16:22     Titel:
  Antworten mit Zitat      
Ich meine, dass bedeutet, dass deine x-Werte monoton steigen müssen!!!

Ansonsten versteht der Algorithmus die Werte nicht, auf der einen Seite (dein "ziel-X" ist stetig steigend) auf der anderen Seite (dein "ursprungs-x" ist nicht unbedingt steigend). Wenn nun dein Ziel steigt und dein Original fällt, weiß der Algorithmus nicht, wie er damit umzugehen hat.

Dadurch, dass deine x-Werte ja an einigen Stellen quasi aufeinanderliegen, bedeutet es, dass die Werte um den Punkt schwanken.

1. x-sortieren (sort-Befehl mit index übergeben lassen, damit du auch deine y-Werte in die gleiche Reihenfolge bringen kannst (zu jedem x-gehört ja ein y)
2. danach interpolieren
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: 18.08.2014, 20:59     Titel: Re: Matrixelemente sinnvoll entfernen (Filterfunktion)
  Antworten mit Zitat      
Hallo Max24,

"Klappt nicht" ist nicht hilfreich, um das Problem zu erklären.
Was klappt nicht?
In deinem Code fehlt z.B. ein END oder das zweite IF sollte eigentlich ein ELSEIF sein.
Das Verkürzen während der Schleife ist aber auch ein Fehler.

Wie wäre dies:
Code:
remove = find(diff(x) <= 0.01 | diff(y) <= 0.01) + 1;
x(idx) = [];
y(idx) = [];


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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 21.08.2014, 13:35     Titel:
  Antworten mit Zitat      
Okay, hi nochmal! Smile
Also die eine hier verbesserte Funktion läuft ganz gut.
Code:

 n=1;
while (n < length(x)-1)
    if( abs([x(n+1) - x(n)]) <= 0.075)  
        x(n) = [];      
        y(n) = [];  
    elseif( abs([y(n+1) - y(n)]) <= 0.075)
        y(n) = [];
        x(n) = [];    
    else
        n = n+1;
   end
end
 


Auf jeden Fall treten weitaus weniger Fehler auf.
Nun passiert es aber gerne, dass zu viele Werte abgeschnitten werden, bzw. es treten immer noch Fehler auf, wenn man die Maus zu langsam bewegt.

Gibt es vielleicht eine Alternatividee, wie das Problem zu lösen ist?
Bei der Interpolation bin ich mir nicht sicher.
Private Nachricht senden Benutzer-Profile anzeigen
 
alsastar112
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 18.12.13
Wohnort: München
Version: ---
     Beitrag Verfasst am: 21.08.2014, 14:41     Titel: fspecial
  Antworten mit Zitat      
Ich habe auch das gleiche problem. ich weiß es nicht wie ich die Ausreißerwerte ausblenden kann. kann man nicht mit Gausian-filter für Bildbearbeitung was machen ! schau mal fspecial in help. Leider habe ich fspecial nicht mit diesem Matlab-Version. Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Gibt es vielleicht eine Alternatividee, wie das Problem zu lösen ist?

Alternativen wird's viele geben, aber nur du wirst sagen können, was da sinnvoll ist. Wir können bestenfalls bei der Implementierung helfen.

Was ich mir noch vorstellen könnte:
- die Distanz aufeinanderfolgender Werte ausrechnen und cumsum darauf anwenden--> Vektor d. Man könnte das als Zeitvektor verstehen.
- Interpolieren mit d als x- und deinen Datenpunkten (x- und y-Werte getrennt voneinander) als y-Werten. xi sollte äquidistant sein, und du bekommst neue x- bzw. y-Werte.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 04.09.2014, 09:59     Titel:
  Antworten mit Zitat      
Hallo!

Nochmal eine Rückfrage, bzgl. der Sortierung.
Man muss die Daten ja sortieren, bevor man interpoliert.

Also gegeben ist ein Datensatz [x,y].

Mein Code:

Code:

[x,index] = sort(x);
xi = [1:2:100]; % 50 Stützpunkte
yi = interp1(x,y(index),xi);
 


Leider erhalte ich auch hier die Fehlermeldung, dass meine Daten unsortiert seien.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.09.2014, 10:10     Titel:
  Antworten mit Zitat      
Hallo,

bitte die Fehlermeldung kopieren, nicht interpretieren, und einen Beispieldatensatz zur Verfügung stellen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 04.09.2014, 10:37     Titel:
  Antworten mit Zitat      
Der Datensatz ist ziemlich groß! Confused Das wird ziemlich unübersichtlich!
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.