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 Matrixwerte extrahieren

 

Tobsi95
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 16.09.19
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 09.10.2019, 09:35     Titel: Doppelte Matrixwerte extrahieren
  Antworten mit Zitat      
Hallo,
ich bin auf der Suche nach einer bestimmten Matlab-Funktion und hoffe, dass ihr mir weiterhelfen könnt.
Ich habe eine Matrix A, welche X, Y und Z-Koordinaten (3 Spalten) enthält und das für knapp 10000 Reihen/Punkte. Ich würde gerne die Reihen/Punkte, die einen gleichen X und Z-Wert haben in eine neue Matrix schreiben und den Rest löschen. Das heißt, dass nur Reihen, deren X und Z-Werte mindestens zwei Mal vorkommen berücksichtigt werden. Der Y-Wert kann variieren. Die Einträge der Matrix sind vorher nicht bekannt. Gibt es dafür eine Funktion?

Beispiel:
1 2 3
4 6 7
7 5 3
2 4 7
1 5 3
9 7 6
2 9 7
1 6 3

Dann soll daraus werden:
1 2 3
1 5 3
2 4 7
2 9 7
1 6 3

Ich hatte bislang zwei Ideen. Einterseits habe ich über einen Loop nachgedacht:
for k = 1:end
for m = k+1:end
if A(k,1) == A(m,1) && A(k,3) ==A(m,3)
% do something
end
end
end

Allerdings bin ich mir nicht sicher, wie ich das do something definieren kann, bzw. wir die Rechendauer vermutlich hoch sein.
Mein zweiter Gedanke war, ob es vielleicht eine Negation der unique-Funktion gibt, welche man auf X und Z bezieht, damit nur gleiche Werte übernommen werden. Jedoch habe ich dazu nichts gefunden.
Ich hoffe, ihr könnt mir helfen.

LG Tobsi
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

ist die Reihenfolge wichtig? Falls nicht, würde ich zunächst mit sortrows sortieren. Dann muss man nur aufeinanderfolgende Zeilen vergleichen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 16.09.19
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 10.10.2019, 08:40     Titel:
  Antworten mit Zitat      
Hallo Harald,
die Reihenfolge wäre nicht wichtig. Wenn ich den Mathworks Beitrag zu sortrows richtig verstanden habe, kann man die Reihen nach einer bestimmten Spalte sortieren (z.B. aufsteigend). Kann man die Reihen auch mit einer Art UND-Bedingung nach mehreren Spalten sortieren (Spalte 1 und Spalte 3)?

LG
Tobsi
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobsi95
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 16.09.19
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 10.10.2019, 09:56     Titel:
  Antworten mit Zitat      
Oder geht das Sortieren mehrerer Spalten ganz einfach über:
B = sortrows(A, [-1,-3]);
?
Private Nachricht senden Benutzer-Profile anzeigen
 
matjoe
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 02.05.18
Wohnort: Deutschland
Version: 2017b
     Beitrag Verfasst am: 10.10.2019, 13:15     Titel:
  Antworten mit Zitat      
Code:

A = [1 0 1;1 10 1;1 11 2;1 12 2;1 13 3;1 14 4;1 15 5;1 16 6;1 17 7;1 18 7];
kk = 1;
AA = [A(:,1) A(:,3)];

for k = 1: length(A)
    if k>1
        if sum(sum (AA(k,:) == AA(1:k,:), 2) == 2) == 2
            B(kk,1:3) = A(k,1:3);
            kk = kk +1;
        end
    end
end

A = B;
clear B kk AA k
 


Das würde mir auf die schnelle einfallen, ist natürlich nicht schön aber sollte funktionieren. Rechenzeit sollte bei 3 Zeilen und je 10000 einträgen keine Rolle spielen.
Was hier geschieht ist dass jede Zeile durchgegangen wird und die einzelnen Spalten mit allen bisheringen Zeilen verglichen wird. Sind beide in einer Zeile identisch ist die Summe daraus 2 und die zweite Bedigung erfüllt.
Anschließend wird noch verglichen ob diese Zeile genau zweimal vorkommt, sodass nur ein zugehöriger y-Wert übernommen wird.

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

Forum-Meister


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

Vorschlag:

Code:
M = sortrows(M, [1, 3]);
% Sonderfälle:
deleteLast =  ~isequal(M(end,[1 3]), M(end-1, [1,3]));
deleteFirst =  ~isequal(M(1,[1 3]), M(2, [1,3]));
for k = size(M,1)-1:-1:2 % alle anderen
    if ~isequal(M(k,[1 3]), M(k+1, [1,3])) && ~isequal(M(k,[1 3]), M(k-1, [1,3]))
        M(k,:) = [];
    end
end
if deleteLast
    M(end,:) = [];
end
if deleteFirst
    M(1,:) = [];
end

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 16.09.19
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 28.10.2019, 09:21     Titel:
  Antworten mit Zitat      
Hallo,
ich war leider 2 Wochen nicht im Land und kann erst jetzt antworten.
Ich danke euch, Joe und Harald, für die beiden Vorschläge und werde sie mal probieren und dann mein Feedback geben.
Ich bin auf jeden Fall sehr dankbar, weil ich keine wirkliche Idee hatte, wie ich das Problem lösen kann.

LG Tobi
Private Nachricht senden Benutzer-Profile anzeigen
 
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.