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

Doppelte Elemente aus Matrix löschen

 

Reto4353

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.06.2022, 09:45     Titel: Doppelte Elemente aus Matrix löschen
  Antworten mit Zitat      
Hallo zusammen,

ich hab mehrere Messreihen mit Zeitstempel. Es kann vorkommen, dass die Zeitstempel doppelt oder dreifach verwendet werden, dann möchte ich immer nur die letzte aktuelle Messreihe speichern.

Ich hab ein Minimalbeispiel angehängt. Die Matrix ist aufgebaut als X = Wert, y = Messreihe, i=Anzahl an Messreihen

Ich dachte an etwas der Art:
Code:
for i = 1:length(Data)-1
    if Data(1,2,i+1) == Data(1,2,i)
        Data(:,:,i) = [];
    else
    end
end
 


Jedoch funktioniert das leider nicht wie gewünscht.

Besten Dank für jeden Tipp.
Reto

Example.mat
 Beschreibung:

Download
 Dateiname:  Example.mat
 Dateigröße:  7.82 KB
 Heruntergeladen:  212 mal


Reto4353

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.06.2022, 10:37     Titel:
  Antworten mit Zitat      
Ich hab eine Lösung gefunden, wenngleich diese vielleicht etwas komplizierter als nötig ist:

Code:

time = round((0.2:0.2:151)',2);

for i = 1:1025
    timestep(i,1) = round(ll(2+(i-1)*561,7)-50,2);
    timerow(1:558,1) = timestep(i,1);
    Data(:,:,i) = [ll(4+(i-1)*561:i*561, 2) timerow];
end

for i = 1:length(time)
    index = find(timestep == time(i,1),1,'last');
    indextime(i,:) = [time(i,1) index];
end

for i = 1:length(time)
    TrueData(:,i) = Data(:,1,indextime(i,2));
end
 


Viele Grüße
Reto
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.06.2022, 12:09     Titel:
  Antworten mit Zitat      
Hallo,

ich habe Schwierigkeiten, deine Lösung zu durchblicken und den Zusammenhang zur ursprünglichen Frage herzustellen. Mein Vorschlag für die ursprüngliche Frage wäre:
Code:
load Example
isSame = [squeeze(Data2(1,2,1:end-1) == Data2(1,2,2:end)); false];
Data2(:,:,isSame) = [];


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Reto4353

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.06.2022, 13:08     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für Deine Lösung. Ich versuch mal die gepostete Lösung besser zu kommentieren:

Code:

time = round((0.2:0.2:151)',2); % sind die Zeitstempel, die ich am Ende behalten möchte

% der Teil hier erstellt die Ursprungsdatei. Für das Minimalbeispiel hatte ich nur die ersten sechs Einträge genommen
for i = 1:1025
    timestep(i,1) = round(ll(2+(i-1)*561,7)-50,2);
    timerow(1:558,1) = timestep(i,1);
    Data(:,:,i) = [ll(4+(i-1)*561:i*561, 2) timerow];
end

for i = 1:length(time)
    index = find(timestep == time(i,1),1,'last'); %hiermit gleiche ich die Zeitstempel der Ursprungsdatei mit den Zeitstempel, die ich haben möchte ab und schreib den Index, wo der jeweils letzte gewünschte Eintrag in der Ursprungsdatei auftaucht heraus
    indextime(i,:) = [time(i,1) index]; % hier schreibe ich den gewünschten Zeitstempel und den dazugehörigen Index der Ursprungsdatei, wo er letzmalig auftaucht in eine Matrix
end

for i = 1:length(time)
    TrueData(:,i) = Data(:,1,indextime(i,2)); %nun kopiere ich alle Einträge der Ursprungsdatei, wo der gewünschte Zeitstempel als letztes auftaucht.
end

 


Ich hoffe es ist klarer geworden, was ich gemacht habe. Entschuldige, dass ich das vorher nicht direkt mitkommentiert habe.

Viele Grüße
Reto
 
Harald
Forum-Meister

Forum-Meister


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

ich behaupte, mein Ansatz wäre einfacher. ;) Man müsste lediglich runden - ich sehe beispielsweise, dass eine 0.2 minimal unterschiedlich zu den anderen ist.
Funktioniert mein Ansatz denn? Wenn nicht, welche Probleme gibt es damit konkret?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Reto4353

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2022, 09:55     Titel:
  Antworten mit Zitat      
Hallo Harald,

für das ursprüngliche Problem funktioniert Dein Ansatz sehr gut und ist tatsächlich deutlich einfacher. Nur ist mir mittlerweile aufgefallen, dass die Zeitstempel nicht immer chronologisch sind, wie in der Testdatei. Dort war ja: 0,2 0,2 0,4 0,6 0,6
aber es kann auch 0,2 0,4 0,6 0,2 0,4 sein. Das sollte sich aber über eine vorherige Sortierung lösen lassen.

Merci Dir vielmals und viele Grüße
Ret0
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2024 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.