Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Elektrotechnik für Informatiker mit MATLAB und Multisim

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Werte vergleichen, Zeile löschen

 

Shucki
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.05.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 05.05.2020, 10:45     Titel: Werte vergleichen, Zeile löschen
  Antworten mit Zitat      
Hallo liebes Forum,

Ich bin Matlab-Anfänger und habe eine Frage.
Ich habe zwei Tabellen und möchte, dass drei Werte aus einer Zeile der einen Tabelle mit drei Werten aus einer Zeile der anderen Tabelle übereinstimmen. Zwei weitere Werte werden auch auf Übereinstimmung geprüft und wenn diese nicht mit den Werten aus Tabelle zwei übereinstimmen, möchte ich die Zeile aus der ersten Tabelle löschen.

Ich dachte mir jetzt, dass die Zeilen mit einer For-schleife durchlaufen werden mithilfe von Height und ich bei if ungleich die aktuelle Zeile aus der Tabelle lösche. Also in etwa so:
Code:

Tbl1 = csvread(´Tabelle1´)
Tbl2 = csvread(´Tabelle2´)
H = height(Tbl1)

For row = 1:H
if Tbl1.data == Tbl2.data && Tbl1.data2 == Tbl2.data2 && Tbl1.data3 == Tbl2.data3 && Tbl1.data4 ~=Tbl2.data4
aktuelle Zeile soll gelöscht werden?
end
end
 


Abgesehen davon ob es rein logisch die richtige Vorgehensweise wäre, frage ich mich auch wie man sicherstellt, dass die Werte bei der zweiten Tabelle aus einer Zeile kommen?

Vielen Dank und Grüße,
Shucki
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

die for-Schleife lässt sich hier über Verwendung von ismember(..., 'rows') vermeiden.

Mir ist folgendes noch nicht klar:
Zitat:
dass drei Werte aus einer Zeile der einen Tabelle mit drei Werten aus einer Zeile der anderen Tabelle übereinstimmen. Zwei weitere Werte werden auch auf Übereinstimmung geprüft und wenn diese nicht mit den Werten aus Tabelle zwei übereinstimmen

Wie soll jetzt zwischen den ersten drei und den anderen beiden Werten unterschieden werden? Auch: 3 + 2 = 5, in deinem Code-Schnipsel vergleichst du aber 4 Werte?

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
 
Shucki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.05.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 05.05.2020, 11:30     Titel:
  Antworten mit Zitat      
Oh, ich wollte eigentlich 5 vergleichen und habe den letzten vergessen, sorry.

Beide Tabellen bestehen aus viel mehr Spalten als den 5, die ich vergleichen möchte. Ich dachte durch Tbl1.data2 und Tbl2.data2 würde ich die Spalte auswählen die ich vergleichen möchte.

Mit ismember würde man zwar die Werte suchen, die in beiden Tabellen stehen, aber nicht ob sie in der richtigen Spalte vorkommen, oder?

Danke schon einmal für die schnelle Antwort.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Beide Tabellen bestehen aus viel mehr Spalten als den 5, die ich vergleichen möchte.

Kein Problem. Für ismember kann man ja jeweils die 5 Spalten extrahieren.

Zitat:
Ich dachte durch Tbl1.data2 und Tbl2.data2 würde ich die Spalte auswählen die ich vergleichen möchte.

Das sieht nach Tables aus. csvread gibt meines Wissens aber ein double-Array zurück.

Zitat:
Mit ismember würde man zwar die Werte suchen, die in beiden Tabellen stehen, aber nicht ob sie in der richtigen Spalte vorkommen, oder?

Doch, mit der Option 'rows' schon. Aus der Doku:
Zitat:
Lia = ismember(A,B,'rows') treats each row of A and each row of B as single entities and returns a column vector containing logical 1 (true) where the rows of A are also rows of B. Elsewhere, the array contains logical 0 (false).


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
 
Shucki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.05.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 05.05.2020, 13:47     Titel:
  Antworten mit Zitat      
Zitat:
Das sieht nach Tables aus. csvread gibt meines Wissens aber ein double-Array zurück.

Ich habe jetzt readtable genommen.

Code:

    NM = readtable('NM.csv');
    FM = readtable('FM.csv');

ismember(NM.lac_tac_sid, FM.lac_tac, 'rows')

 


So die Theorie, aber ich komme nicht dahinter, wie ich 5 Argumente auf einmal in einer Zeile suchen kann. Mit &&-Operator funktioniert es nicht.

Gruß,
Shucki
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich kenne die Spaltennamen jetzt nicht, aber prinzipiell etwa so:
Code:
ismember(NM{:, ["col1", "col2", ..., "col5"]}, FM{:, ["col1", "col2", ..., "col5"]}, "rows")


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
 
Shucki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.05.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 07.05.2020, 10:59     Titel:
  Antworten mit Zitat      
Danke, das war schon einmal sehr hilfreich für mich und meine Abfrage funktioniert jetzt auch.

Die Auswertung hat mich jetzt allerdings vor ein weiteres Problem gestellt.

Ich würde gerne immer zwei aufeinanderfolgende Zeilen in einer Tabelle auf Übereinstimmung einer Spalte prüfen und nur dann die ismember-Abfrage starten, wenn es doppelt vorliegt. Dann eine der Spalten löschen und dann weiter durch die Tabelle gehen.

Grüße,
Shucki
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
auf Übereinstimmung einer Spalte prüfen

Und was steht in dieser Spalte? Zahlen, Text, was ganz anderes?
Im Falle von Zahlen hilft diff.

Zitat:
nur dann die ismember-Abfrage starten, wenn es doppelt vorliegt.

Dann ismember auf das Ergebnis des vorherigen Schritts löschen.

Zitat:
Dann eine der Spalten löschen

Wirklich eine der Spalten oder nicht eher die Zeilen?

Zitat:
und dann weiter durch die Tabelle gehen.

Soll was genau heißen? Das ergibt für mich nur im Zusammenhang mit einer for-Schleife Sinn. Ich sehe dafür aber gar keinen Bedarf.

Generell hilfreich sind kleine Datenbeispiele mit Input und erwartetem Output sowie bisherige Versuche der Implementierung.

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
 
Shucki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.05.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 12.05.2020, 11:01     Titel:
  Antworten mit Zitat      
Es stehen Zahlen in der Spalte, also könnte man diff benutzen, danke.
Und natürlich meine ich die Zeile löschen, sorry!

Zitat:
Soll was genau heißen? Das ergibt für mich nur im Zusammenhang mit einer for-Schleife Sinn. Ich sehe dafür aber gar keinen Bedarf.


Ich habe eine Tabelle mit Daten und wenn in aufeinanderfolgenden Zeilen derselbe Wert in einer Spalte steht, soll eine der Zeilen gelöscht werden (mit dem Ergebnis der ismember Abfrage mit einer zweiten Datenbank). So soll die ganze Tabelle durchgearbeitet werden. Wie könnte man das denn ohne eine for-Schleife realisieren?

Grüße,
Shucki
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

das Löschen doppelter Zeilen:
Code:
doppelt = diff(T.Spalte) == 0
T(doppelt, :) = [];


Wie und vor allem in welcher Reihenfolge du das nun mit ismember kombinieren willst, ist mir nicht recht klar.

Wie gesagt:
Zitat:
Generell hilfreich sind kleine Datenbeispiele mit Input und erwartetem Output


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
 
Shucki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.05.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 13.05.2020, 15:19     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wie und vor allem in welcher Reihenfolge du das nun mit ismember kombinieren willst, ist mir nicht recht klar.


Ich möchte, wenn in einer Spalte derselbe Wert in verschiedenen Zeilen auftaucht, diese Zeilen mit ismember in einer anderen Datenbank abfragen, und die Zeile, die nicht vorkommt, aus der ersten Datenbank löschen. Und das soll automatisch mit allen Zeilen gemacht werden. Der doppelte Wert taucht auch immer nur in aufeinanderfolgenden Zeilen auf.
Zeilen, bei denen der Wert nicht doppelt vorliegt, müssen drin bleiben, und diese tauchen auch nicht in der zweiten Datenbank auf.

Code:

h = height(NM)-1 % Zeilenanzahl -1, damit die beiden letzten Zeilen miteinander verglichen werden können

for row = 1:(h)
    Dif = [row,"NM.report"; (row+1);"NM.report"] %aktuelle Zeile und Zeile darunter?
    if diff(Dif)% == 0  % wenn Element gleich ist
        nichtDB = ismember(NM{:,["..."]}, FM{:,["..."]}, "rows") == 0 % beide Zeilen sollen mit Werten aus zweiter DB verglichen werden
       NM(nichtDB, :) = [];       % Zeile die nicht in FM vorkommt wird gelöscht
    else
    end
end
 


Das funktioniert natürlich nicht, ich bin auch sehr unerfahren und finde es nicht so einfach, die richtigen Befehle für mein Problem zu finden und diese dann auch richtig einzusetzen.
Sorry und nochmal vielen Dank für die Hilfe!

Grüße, Shucki
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wie bereits gesagt: poste doch bitte ein (kleines) Datenbeispiel mit Input und erwartetem Output! Vorzugsweise eines, in dem alle Fälle vorkommen.

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
 
Shucki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.05.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 13.05.2020, 16:57     Titel:
  Antworten mit Zitat      
Hallo,

    report;sys_time;lac_tac_sid;long_cid;node_id_nid;cid_bid;cell_lat;cell_long;
    0;2,02004E+13;4503;27143940;106031;4;53.856.698;10.704.809;
    0;2,02004E+13;4503;27143940;106031;4;5.386.940.002;1.069.862.366;
    55;2,02004E+13;4503;27004676;105487;4;5.387.626.648;1.069.862.366;

Das ist ein Beispiel für die Tabelle, in der ich überprüfen möchte, ob report doppelt vorliegt. Wenn es doppelt vorliegt (wie die beiden ersten Zeilen), möchte ich überprüfen, ob lac_tac_sid, node_id_nid, cid_bid, cell_lat und cell_long in der zweiten Tabelle vorkommen.

Hier ein Auschnitt aus der zweiten Tabelle:
    lac_tac;node_id;cid;cell_lat;cell_long
    4503;106031;4;5.386.940.002;1.069.862.366

Die Zeile, dessen Werte in der zweiten Tabelle nicht vorkommen, soll gelöscht werden. Also sollte es danach so aussehen:
    report;sys_time;lac_tac_sid;long_cid;node_id_nid;cid_bid;cell_lat;cell_long;
    0;2,02004E+13;4503;27143940;106031;4;5.386.940.002;1.069.862.366;
    55;2,02004E+13;4503;27004676;105487;4;5.387.626.648;1.069.862.366;


Grüße, Shucki
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

da werden ja Kommas als Dezimaltrennzeichen verwenden und . als Tausendertrennzeichen. Wie liest du die Datei denn überhaupt ein?
Ich habe Zweifel, dass readtable damit direkt umgehen kann...

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
 
Shucki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.05.20
Wohnort: ---
Version: R2020a
     Beitrag Verfasst am: 13.05.2020, 17:29     Titel:
  Antworten mit Zitat      
Hallo,

Wenn ich mir die Tabellen im Workspace anschaue, zeigt er sie richtig an und als ich die ismember Abfrage gemacht hatte, hat er mir auch die richtigen Ergebnisse angezeigt.

Grüße, Shucki
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.