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?
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.
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 ;)
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)?
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.
M = sortrows(M, [1, 3]);
% Sonderfälle:
deleteLast = ~isequal(M(end,[13]), M(end-1, [1,3]));
deleteFirst = ~isequal(M(1,[13]), M(2, [1,3]));
for k = size(M,1)-1:-1:2% alle anderen if ~isequal(M(k,[13]), M(k+1, [1,3])) && ~isequal(M(k,[13]), M(k-1, [1,3]))
M(k,:) = [];
end end if deleteLast
M(end,:) = [];
end if deleteFirst
M(1,:) = [];
end
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 ;)
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
Einstellungen und Berechtigungen
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
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.