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

Indexieren

 

Flaschenhals

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2013, 16:59     Titel:
  Antworten mit Zitat      
ok läuft, danke. doch wie kann ich nun die zu verändernden Positionen ermitteln. Ich möchte nur die Positionen in einem Array haben.

Mit pre und numels gebe ich ja indirekt die Positionen an:
pre(1):pre(1)+numels(1) = 2 3 4 5
pre(2):pre(2)+numels(2) = 7 8 9

positionen = [2 3 4 5 7 8 9] das soll als Ergebnis ausgegeben werden


Flaschenhals

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2013, 23:02     Titel:
  Antworten mit Zitat      
Nun ja, noch eine weitere Frage bleibt offen, und zwar wie könnte ich die NaN's, durch die letzte Zahl ersetzen.

Mal angenommen, ich habe [1 NaN NaN NaN NaN 6 4 4 4 8]
Da möchte ich das die NaN's durch 1 ersetzt werden, weil die 1 die letzte gültige Zahl ist.

Bei dem Fall, dass die Reihe wie folgt aussieht [1 NaN NaN NaN NaN 6 NaN NaN NaN 8] sollte als Ergebnis folgendes rauskommen [1 1 1 1 1 6 6 6 6 8]

Problematisch ist es wenn die erste Zahl ungültig ist (also Nan), sollte der nächste mögliche Wert ersetzt werden. Beispielsweise sollte bei
[NaN NaN NaN NaN NaN 6 4 4 4 8] folgendes ausgegeben werden
[6 6 6 6 6 6 4 4 4 8]
 
Flaschenhals

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2013, 16:32     Titel:
  Antworten mit Zitat      
Jann?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.05.2013, 22:44     Titel:
  Antworten mit Zitat      
Hallo Flaschenhals,

Es ist ineffizient, wenn Du die Aufgabe schrittweise veränderst. Wenn Du von Anfang an erklärst, was das gewünschte Ziel ist, könnte man direkt auf eine Lösung hinarbeiten.
Wieso sollte man zuerst NaNs in die Daten einfügen, wenn sie hinterher wieder überschrieben werden?

Was hast Du bisher versucht, um die NaNs zu ersetzen? Eine FOR-Schleife wäre eine gute Idee.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2013, 23:46     Titel:
  Antworten mit Zitat      
Also das war der letzte Ansatz, den ich noch machen wollte. ich wollte noch ein thread aufmachen, da dachte ich mir, das ich es gleich hier anhänge. Wenn du mir bissl mehr Tipps geben würdest. Könnte ich es probieren.
 
Flaschenhals

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2013, 16:14     Titel:
  Antworten mit Zitat      
Ich hab versucht den Ansatz hier zu verwenden, jedoch konnte ich es nicht auf das problem transferieren..

Schau Thread[url] http://www.gomatlab.de/filtern-der-daten-t28173.html[/url]

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
 
 
Flaschenhals

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2013, 16:42     Titel:
  Antworten mit Zitat      
nur noch die letzte Hilfestellung bitte, dann hab ich die aufgabe gelöst
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.05.2013, 00:43     Titel:
  Antworten mit Zitat      
Hallo Flaschenhals,

Es würde mich mehr motivieren zu antworten, wenn Du hier im Thread zeigst, was Du genau probiert hast. Die notwendigen Änderungen sind klein: Statt "invalid = (A >= 35)" benötigst Du "invalid = isnan(A)".

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2013, 21:55     Titel:
  Antworten mit Zitat      
Code:
A = [1 2 2 2 2 6 4 4 4 8 3 3 3 5 2 2];
pre = [2 7 11];
numels = [4 3 3];

match = numels > 2;
pre = pre(match);
numels = numels(match);

indexD = zeros(size(A));
indexD(pre) = 1;
indexD(pre + numels) = -1;
index = logical(cumsum(indexD(1:end - 1)));
result = A;
result(index) = NaN;

invalid = isnan(A);
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
 
 


Zitat:
Ergebnis null zeros
 
Jan S
Moderator

Moderator


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

Und ist das Problem nun gelöst oder nicht? Ich verstehe nicht, was "null zeros" bedeutet.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2013, 14:44     Titel:
  Antworten mit Zitat      
A = [1 2 2 2 2 6 4 4 4 8 3 3 3 5 2 2];

Zwischenschritt 1 funktioniert ja:

A = [1 NaN NaN NaN NaN 6 NaN NaN NaN 8 NaN NaN NaN 5 2 2];

Ich möchte nun die NaN's, durch den letzten gültigen Wert ersetzen.

A = [1 1 1 1 1 6 6 6 6 8 8 8 8 5 2 2];

Mit dem jetzigen Code bekomme ich nur zeros
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.05.2013, 15:33     Titel:
  Antworten mit Zitat      
Hallo Flaschenhals,

Es ist effizienter, wenn man nicht zuerst erraten muss, was z.B. "Zwischenschritt 1" ist. Je genauer Du Dein problem erklärst, desto mehr Zeit bleibt den lesern, eine Antwort zu überlegen.

Auch "Ergebnis null zeros" ist verglichen mit "ich bekomme nur zeros" nicht unbedingt hilfreich.
Zitat:
A = [1 1 1 1 1 6 6 6 6 8 8 8 8 5 2 2];

Bekommst Du dies oder ist dies Dein Ziel?
Heißt "ich bekomme nur zeros" vielleicht, dass dies das Ergebnis ist:
Code:
A = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];

?
Ich schlage vor, Du verwendest einfach den Debugger und gehst Zeile für Zeile durch den Code. Dann kannst Du selbst herausfinden, woran es hängt.

Benötigst Du das Zwischenergebnis mit den NaNs überhaupt? Wenn sie doch sowieso wieder überschrieben werden, könnte man das doch weglassen.

Also, ich komme nicht drumherum zu sagen, dass sich das Thema ausgesprochen hinzieht. Eigentlich ist die Aufgabe wohl kurz und kompakt, aber wir kommen irgendwie nicht auf den Punkt, sondern halten und zu viel mit Rückfragen nach Unklarheiten auf.
Ist es das Ziel, mehr als 3 benachbarte gleiche Zahlen durch den Vorgänger des Gebietes zu ersetzen? Das könnte man mit einem oder zwei Sätzen ausdrücken und dann auch viel klarer programmieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2013, 08:35     Titel:
  Antworten mit Zitat      
Ich würds auf die Schnelle so machen.
Code:
A = [1 2 2 2 2 6 4 4 4 8 3 3 3 5 2 2];
result = zeros(1,numel(A));
pre = [2 7 11];
numels = [4 3 3];

match = numels > 2;
pre = pre(match);
numels = numels(match);

indexD = zeros(size(A));
indexD(pre) = 1;
indexD(pre + numels) = -1;
index = [logical(cumsum(indexD(1:end - 1))),1];

for i=1:numel(index)
         result(i) = A(find(~index(1:i),1,'last'));
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.