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

Zeilen löschen bei Erfüllung spezieller kriterien

 

joker1.8t
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2018, 10:14     Titel: Zeilen löschen bei Erfüllung spezieller kriterien
  Antworten mit Zitat      
Hallo liebes Forum,

ich habe ein Problem mit einem Datensatz aus Excel ,welchen ich gerne mit Matlab filtern möchte.
Um das Problem zu vereinfachen möchte ich es anhand einer 10x10 Matrix erläutern.

Es sollen Zeilen gelöscht werden, wenn die Zeilen von Spalte 1-5 gleich sind. In abhängig von dem Wert in Spalte 7, es soll die Zeile stehen bleiben mit dem höchsten Wert in Spalte 7.


Ich bin schon auf den Befehl unique gestoßen, weiß aber nicht wie ich das mit meiner Bedingung verknüpfen soll.

Schon mal Danke für die Hilfe im voraus.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

schau dir mal findgroups und splitapply an. Das sollte helfen.
Wenn du weitere Unterstützung brauchst, wäre ein ganz konkretes Beispiel ideal.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
joker1.8t
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2018, 12:13     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Antwort.

1 10 7 0 8
1 10 7 0 7
1 10 7 0 6
1 10 7 0 5
2 5 7 0 8
2 5 7 0 7
3 4 7 0 3
4 68 7 0 5
5 7 7 0 4


Hier mal ein Beispiel. Aus diesem müssten die Zeilen 2, 3, 4 und 6 gelöscht werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.06.2018, 13:25     Titel:
  Antworten mit Zitat      
Hallo,

Code:
[gp, c1, c2, c3, c4] = findgroups(M(:,1), M(:,2), M(:,3), M(:,4));
c5 = splitapply(@max, M(:,5), gp);

Mneu = [c1, c2, c3, c4, c5]


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
joker1.8t
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2018, 13:39     Titel:
  Antworten mit Zitat      
Super, vielen Dank Harald.
Private Nachricht senden Benutzer-Profile anzeigen
 
joker1.8t
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2018, 14:13     Titel:
  Antworten mit Zitat      
Irgendwie wende ich die Funktionen falsch an...

Code:

M = {1 10 7 0 8;1 10 7 0 7;1 10 7 0 6;1 10 7 0 5;2 5 7 0 8;2 5 7 0 7;3 4 7 0 3;4 68 7 0 5;5 7 7 0 4}


[gp, c1, c2, c3, c4] = findgroups(M(:,1), M(:,2), M(:,3), M(:,4));
c5 = splitapply(@max, M(:,5), gp);

Mneu = [c1, c2, c3, c4, c5]


Ich verstehe aber auch die Nutzung von gp nicht wirklch.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.06.2018, 14:49     Titel:
  Antworten mit Zitat      
Hallo,

du definierst M als Cell Array { } statt als numerische Matrix [ ]

Unten in der Doku von findgroups ist eine schöne Abbildung, die die Arbeitsweise von findgroups / splitapply zeigt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
joker1.8t
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2018, 15:04     Titel:
  Antworten mit Zitat      
Okay jetzt funktioniert auch mein Beispiel, danke.

Was meinst du mit unten in der Doku? (Doku=Hilfe?)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.06.2018, 15:53     Titel:
  Antworten mit Zitat      
Ja, z.B.
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
joker1.8t
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2018, 11:19     Titel:
  Antworten mit Zitat      
Das Beispiel hatte gestern super Funktioniert aber es scheitert bei mir doch an der Praxis.

Aktuell sieht es bei mir wie folgt aus.

Code:

%Gruppen finden und nach Kriterium filtern
[gp, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11] = findgroups(M(:,1), M(:,2), M(:,3), M(:,4), M(:,5), M(:,6), M(:,7), M(:,8), M(:,9), M(:,10), M(:,11));
c13 = splitapply(@max, M(:,13), gp);

%Matrix neu aufbauen
Mneu = [c1, c2, c3, c4, c5, c6, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, c31, c32, c33, c34, c35, c36]
 


Ich weiß bereits, dass der Fehler darin liegt, dass die Spalten c12 und c14:c36 nicht definiert sind. Aber wie mache ich das, die sollen ja nicht geprüft werden? Ich möchte diese Spalten quasi nur "Mitschleifen".
Private Nachricht senden Benutzer-Profile anzeigen
 
joker1.8t
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2018, 11:36     Titel:
  Antworten mit Zitat      
Achso und meine Werte sind eigentlich alle vom Typ table.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

je mehr (und genauere) Infos du von Anfang an zur Verfügung stellst, desto besser. Jetzt haben wir einen anderen Datentyp und "mitzuschleifende" Spalten, so dass der ursprüngliche Ansatz deutlich angepasst werden muss.

Versuch bei findgroups mal die Syntax
Code:

und schau dann, ob du bei splitapply eine selbstgeschriebene Funktion verwenden kannst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
joker1.8t
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2018, 10:17     Titel:
  Antworten mit Zitat      
Hallo,
da mir der Datentyp Tabelle zu große Schwierigkeiten bereitet hatte, habe ich nun die Daten vom Typ double vorliegen.

Das mit dem Filtern bzw. Zeilen löschen klappt eigentlich ganz gut aber ich weiß nicht wie ich die Spalten anpasse, die nicht zum Prüfkriterium gehören.

Code:

% einlesen Matrix
M = Matrix;

c11 = M(:,11);
c12 = M(:,12);
c14 = M(:,14);
c15 = M(:,15);
c16 = M(:,16);
c17 = M(:,17);
c18 = M(:,18);
c19 = M(:,19);
c20 = M(:,20);
c21 = M(:,21);
c22 = M(:,22);
c23 = M(:,23);
c24 = M(:,24);
c25 = M(:,25);
c26 = M(:,26);



% Gruppen finden und nach Kriterium filtern
[gp, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10] = findgroups(M(:,1), M(:,2), M(:,3), M(:,4), M(:,5), M(:,6), M(:,7), M(:,8), M(:,9), M(:,10));

 c13 = splitapply(@min, M(:,13), gp);

% Matrix neu aufbauen
 Mneu = [c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21, c22, c23, c24, c25, c26] ;

% Neue Matrix speichern

[file, path] = uiputfile('test.xls','Speichern');
xlswrite([path file],Mneu,'Tab','A1');



Schon mal Danke für die Antwort
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

versuch mal sowas in der Art:

Code:
c = splitapply(@myfun, M, gp);

und
Code:
function y = myfun(x)
[~, idx] = min(x(:,13));
y = x(idx, :);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
joker1.8t
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.06.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2018, 11:34     Titel:
  Antworten mit Zitat      
Mal wieder Danke Harald für die schnelle Antwort. Ich probiere deine Ansetze gleich aus.
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 - 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.