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

Filtern der Daten

 

freddy123
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 27.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.04.2013, 14:13     Titel: Filtern der Daten
  Antworten mit Zitat      
Hallo,

Ich möchte gerne Werte oberhalb 35 aus meinem Datensatz filtern, dabei würde ich gerne, die Stellen die ich gefunden habe mit dem vorherigen Wert korrigieren. Es könnte aber vorkommen, das der vorherige Wert auch Fehlerhaft sein könnte, also über der Schwelle liegen. Zusätzlich könnte beispielsweise auch der erste Wert auch außerhalb der Schwelle liegen.

Wie könnte ich diese Sachen in mein Code einbauen. Anschließend möchte ich die Anzahl der korrigierten Werte in einer Variable speichern. Nach vielen Bastelarbeiten, komm ich nicht mehr weiter.

Code:

A_filtered = A;
idx = find(A>35);
for i = idx
    A_filtered(i) = mean(A_filtered(1:i-1));
end
 


Code:
             
                A_filtered(A>35) = NaN;
                x = 1:numel(A>35);
                pointsAlt = ~isnan(A_filtered);
 
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: 04.04.2013, 00:07     Titel: Re: Filtern der Daten
  Antworten mit Zitat      
Hallo freddy123,

Ich verstehe nicht, woher der MEAN-Befehl im Code kommt. In der Beschreibungen dessen, was Du möchtest, taucht kein Mittelwert auf.

Was möchtest Du als Ergebnis, wenn der erste ungültig ist? Solche Details können wir uns nicht ausdenken.

Ich würde mit einer einfachen Schleife starten:
Code:
x = randi([30, 40], 1, 20);   % Test-Daten
if x(1) > 35
  x(1) = NaN;
end

for k = 2:length(x)
  if x(k) > 35
    x(k) = x(k - 1);
  end
end

Produziert dies das gewünschte Ergebnis? Wenn ja, könnte eine vektorisierte Lösung zwar schneller sein, es bliebe aber abzuwägen, ob man Minuten in die Programmierung stekcen sollte, wenn das Programm nur Sekundenbruchteile läuft.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2013, 00:50     Titel:
  Antworten mit Zitat      
Hi Jan,

bei dem ersten soll er dann weiterschauen bis der nächste wert unterhalb der schwelle liegt, und bei den anderen stellen, soll er nach hinten laufen und den ersten unterhalb der schwelle liegenden wert abgreifen. habs angepasst, jedoch ohne erfolg

Code:
A_filtered = A;
idx = find(A>35);
for i = idx
   if i == 1
       for k = 2:length(A)
           if A_filtered(k) > 35
                A_filtered(i) = A_filtered(k + 1);
           end
       end
   else
        for k = 2:length(A)
            if A_filtered(k) > 35
                A_filtered(i) = A_filtered(k-1);  
            end
        end
   end
end
 
 
Jan S
Moderator

Moderator


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

Zitat:
habs angepasst, jedoch ohne erfolg

Bitte lass uns nicht raten, was nicht wie gewünscht funktioniert. Man kann viel effizienter eiun Problem beantworten, wenn man es nicht zunächst erraten muss.

Es wäre auch gut zu wissen, ob mein Vorschlag die erwarteten Ergebnisse liefter oder nicht. Während das für Dich leicht zu prüfen ist, kann ich es nicht herausfinden. Bitte gib uns so viele Informationen wie möglich, weil ansonsten unsere und Deine Arbeitszeit stärker beansprucht wird als nötig.

Statt die ersten fehlende Werte auf NaN zu setzen, möchtest Du sie also mit dem ersten gültigen Wert ersetzen.
Code:
invalid = (A >= 35);
firstValid = find(~invalid, 1);
A(1:firstValid - 1) = A(firstValid);

for k = firstValid:length(A)
  if invalid(k)
    A(k) = A(k - 1);
  end
end

% Alternative, die je nach Dichte der gültigen Werte schneller oder langsamer sein könnte:
for k = find(invalid)
    A(k) = A(k - 1);
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2013, 15:41     Titel:
  Antworten mit Zitat      
habs mal jetzt ausprobiert mit

Code:
A = [46.0 18.0 26.0 16.0 36.0 56.0 0.0 50.0];


Code:

invalid = (A >= 35);
firstValid = find(~invalid, 1);
A(1:firstValid - 1) = A(firstValid);

for k = find(invalid)
    A(k) = A(k - 1);
end



Zitat:
Attempted to access A(0); index must be a positive integer or logical.


Mit der Lösung funktioniert das:
Code:
for k = firstValid:length(A)
  if invalid(k)
    A(k) = A(k - 1);
  end
end


Code:
%[18 18 26 16 16 16 0 0]


ich würd mich nur mal freuen, wenn du mal paar worte bezüglich der zweiten zeile bis 5 zeile machen könntest
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.04.2013, 16:59     Titel:
  Antworten mit Zitat      
Hallo,

Ja, da ist ein Bug. Ich habe leider kein Matlab um es selbst auszuprobieren. Wenn die ersten Werte invalid sind, darf man sie nicht nochmal überschreiben:
Code:
A = [46.0 18.0 26.0 16.0 36.0 56.0 0.0 50.0];
invalid = (A >= 35);
firstValid = find(~invalid, 1);   % Find ersten validen Wert
if invalid(1)                           % Wenn der erste nich valid ist
  A(1:firstValid - 1) = A(firstValid);   % setze alle führenden invaliden Werte
  invalid(1:firstValid - 1) = false;  % Markiere sie als valide.
end

for k = find(invalid)
   % Ersetze jeden validen Punkt successive durch seinen Vorgänger
    A(k) = A(k - 1);
end

Funktioniert die besser?

Welches sind denn die "zweite bis 5. Zeile"? Helfen die paar Kommentare bereits?

Gruz, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2013, 21:04     Titel:
  Antworten mit Zitat      
japp das läuft jetzt gut, danke.

ich würde aber gerne jetzt noch das ganze so erweitern, dass anstelle der nan werte, das arithmetische Mittel von den bisherigen werte ersetzt werden. wichtig das es nur valide werte zur berechnung von arith. mittel verwendet werden.

dabei soll der erste wert , mit dem nächsten validen wert überschrieben, falls es nan ist.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.04.2013, 09:20     Titel:
  Antworten mit Zitat      
Hallo,

Was hast Du bisher ausprobiert und was läuft nicht wie gewünscht?
In diesem Thread sind bereits alle Methoden gezeigt worden, die zur Lösung benötigt werden. Woran hängt es dann konkret?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2013, 13:16     Titel:
  Antworten mit Zitat      
Code:
idx = find(A>35);
for i = idx
     A_filtered(i) = mean(A_filtered(1:i-1));
end


ich hab das gleiche problem mit dem ersten nicht validen wert--
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.04.2013, 16:49     Titel:
  Antworten mit Zitat      
Hallo,

Was genau ist "das gleiche" Problem? Bedenke, dass Du den ganzen Tag vor Deinem Problem sitzt, aber die Leser im Forum lesen dutzende Threads am Tag.
Wir hatten verschiedene Methoden hier im Thread benutzt um ungültige Punkte am Anfang zu behandeln. Wieso nutzen diese Methoden nun nichts?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 27.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 22:30     Titel:
  Antworten mit Zitat      
Naja eine Frage habe ich noch zu deinem ursprünglichen Code-Vorschlag:

Ich habe dein Code-Vorschlag für mehrere beispiele (random) angewendet. Im groben und ganzen läuft es, nur manchmal, bekomme ich folgende Fehlermeldung:

Attempted to access A(0); index must be a positive integer or logical.

Error in beispiel (line 43)
A(k) = A(k - 1);


Code:
A = [46.0 18.0 26.0 16.0 36.0 56.0 0.0 50.0];
invalid = (A >= 35);
firstValid = find(~invalid, 1);   % Find ersten validen Wert
if invalid(1)                           % Wenn der erste nich valid ist
  A(1:firstValid - 1) = A(firstValid);   % setze alle führenden invaliden Werte
  invalid(1:firstValid - 1) = false;  % Markiere sie als valide.
end

for k = find(invalid)
   % Ersetze jeden validen Punkt successive durch seinen Vorgänger
    A(k) = A(k - 1);
end
 
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: 10.04.2013, 22:42     Titel:
  Antworten mit Zitat      
Hallo,

mit den genannten Daten läuft der Code durch.
Du solltest schon ein Beispiel bringen, bei dem du die Fehlermeldung auch bekommst.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 23:25     Titel:
  Antworten mit Zitat      
ok danke, ich werde mir es mal anschauen.
 
freddy123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 27.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2013, 20:41     Titel:
  Antworten mit Zitat      
bislang habe ich die vaaliden werte mit invalid = (A >= 35) ermittelt
nun habe ich aber die funktion angepasst, ich würde gerne die funktion auf folgendes problem übertragen, das macht es probleme

Code:
[quote]
T2 = strfind([false, diff(A) == 0, false], [false, true(1, 5), false]);
R2 = zeros(1, n);
R2(T2) = 1;
R2(T2+5-1) = -1;
R2 = cumsum(R2);[/quote]
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.04.2013, 11:07     Titel:
  Antworten mit Zitat      
Hallo freddy123,

Ich hatte einige Rückfragen gestellt, die nicht beantwortet worden sind. Stattdessen kommen neue Fragen von Dir. Das ist keine sinnvolle Nutzung des Forums und der Arbeitszeit der Antwortenden.

Zitat:
ich würde gerne die funktion auf folgendes problem übertragen, das macht es probleme

Ich verstehe nicht, was genau "folgendes Problem" ist und wie es sich von den vorherigen unterscheidet. Und es wäre hilfreich, wenn Du "es macht Probleme" mit irgendwelchen Details erklären würdest.

Gruß, Jan
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.