Die erste Spalte wir monoton hochgezählt. Die Spalten 2,3,4 enthalten x,y,z-Koordinaten und dahinter kommen mehrere Spalten Nullen. Die Original Matrix ist ~1,5Miollionen Zeilen auf 7 Spalten.
Was ich schaffen will:
Ich möchte die x und y Koordinaten vergleichen. Wenn ich ich eine Zeile finde, die dieselben x,yKoordinaten (Spalte 2 und 3) hat, wie eine andere Zeile, dann soll diese Zeile gelöscht werden. Es ist so, dass es Zeilen mit gleich xy-Koordinaten geben wird und nur z varriert. Am Ende soll eine geschrumpfte Matrix über bleiben, in der jedes xy Pärchen einmal vorkommt, und sich die Zellen mit gleichen xy entlang der z Koordinate quasi übereinander stapeln. (Die Matrix muss aber nicht danach sortiert werden, war nur zum erklären der Idee).
Ich hatte erst den Plan es mit einem elend komplizierten Schleifenkonstrukt zu machen. Aber das ist garantiert sehr langsam und nicht elegant. Obendrein müsste ich dann ja durch jede Zeile gehen mit einer Schleife und in dieser Schleife noch eine Schleife haben, die dann in allen anderen Zeilen guckt, ob die Werte passen.
Dann habe ich nach passenden Operatoren gesucht. Gefunden habe ich unter anderem any und find.
Mit diesen Konstrukten habe ich an der Beispielmatrix oben rumprobiert, aber ich finde keine Lösung das zu berwerkstelligen, was ich will. (Unique habe ich auch gefunden, aber auch nichts hinbekommen).
In der Beispielmatrix oben sollte Zeile 4 (oder auch die 1 alternativ) gelöscht werden, da beide 2,2 als xy-Koordinate haben. Die Spalten mit reichlich Nullen am Ende sind künstlich angefügt und werden später, wenn die Matrix gecleant ist befüllt. Wenn diese den Algorithmus im Weg stehen, kann ich die auch erst später anfügen.
Ich hoffe ich konnte klar machen, was ich versuche.
Bei Unique verstehe ich ehrlich gesucht das gesamte Konstrukt nicht. Unique gibt einem 2 Vektoren zurück, so wie ich das in der Hilfe gesehen habe, aber ich sehe nicht, dass das irgendwas damit zu tun hat, was ich tun möchte.
Unique gibt einem 2 Vektoren zurück, so wie ich das in der Hilfe gesehen habe, aber ich sehe nicht, dass das irgendwas damit zu tun hat, was ich tun möchte.
ich glaube es ist genau das was du willst. allerdings ist deine aussage was mit den unterschiedlichen zwerten bei gleichen y werten passieren soll etwas schwammig. ich glaube aber trotzdem das dir unique hilft.
_________________
Ich will alle Zeilen einer Matrix finden, die in den Spalten 2 und 3 die gleich x und y Koordinaten haben. Zeilen, die ich finde, die dieses Kriterium erfüllen, will ich löschen.
Wenn ich also beispielsweise in meiner Riesenmatrix Drei Zeilen mit den x y Koordinaten 1,2 habe, will ich zwei davon löschen. Am Ende soll jede vorhande x y Koordinate nur einmal vorkommen
das klappt wunderbar mit unique
ich bin kein freund davon vertige lösungen zu posten wie du sihst versuch dich doch einfach mal an dem befehl und wir helfen dir dann dabei ihn richtig umzusetzen. wenn etwas nicht klappt.
_________________
%Wieviele unterschiedliche einzigartige x-Koordinaten gibt es
maxdiffvalues=max(ic);
%Schleife um zugehörige y-Koordinaten zu jedem der einzigartigen x-Koordinaten in Vektoren
%zu schreiben (Vektor vect enthält die y-Koordinaten) for i=1:1:maxdiffvalues
vect=0;
for j=1:1:icsize(1) if ic(j)==i
vect=[vect,A(j,3)]
vect(1)=[];
vectsize=size(vect);
%Von diesen y-Koordinaten herausfinden, ob es doppelte gibt
[D,id,ie]=unique(vect);
if vectsize(2)~=0 %Bedingung, dass der vect nicht leer ist (wenn vect leer gibt es keine mehrfach vorkommenden y-Koordinaten)
%Bedingung die herausfindet, ob bei den gleichen
%y-Koordinaten ebenfalls gleich x-Koordinaten vorliegen und
%die entsprechenden Zeilen der Matrix rausschreibt
for k=1:1:vectsize(2) if x-Koordinate an Stelle=1 = x-Koordinate an Stelle 2 und beide haben dieselbe y-Koordinate
RedunantMatrixRows=
end end end end end end
Yeah!
Ich kriege die Bedingung in der innersten Schleife gerade nicht zusammen, um dann abzuprüfen, ob das jeweils dieselben Koordinaten sind.
Obendrein habe ich das Gefühl, dass es so wieder in ein Schleifen mit IF-Massaker ausartet und ich das falsch mache. Komme da jetzt echt nicht weiter.
Ich denke unique verrät mir alle Stellen mit gleichen x Koordinaten in dem Beispiel. Ist ja alles kommentiert.
Könntet ihr mir bitte dazu helfen, erstens diese Bedingung zu schreiben und zweitens das ganze ohne so ein Massaker zu programmieren?
% %Zeilenweise durch die xyMatrix gehen und mit den Koordinaten durch die % %aktuelle Ergebnismatrix gehen - METHODE 1 % for j=1:1:Sxy(1) % x=xyMatrix(j,2); % y=xyMatrix(j,3); % for e=1:1:S(1) % if (Matrix(e,2)==x) && (Matrix(e,3)==y) && (Matrix(e,4)>0) % xyMatrix(j,5)=xyMatrix(j,5)+Matrix(e,5); % xyMatrix(j,6)=xyMatrix(j,6)+Matrix(e,6); % end % end % end
%Zeilenweise durch die xyMatrix gehen und mit den Koordinaten durch die
%aktuelle Ergebnismatrix gehen - METHODE 2 for j=1:1:Sxy(1)
x=xyMatrix(j,2);
y=xyMatrix(j,3);
marker=find(Matrix(:,2)==x & Matrix(:,3)==y);
Smarker=size(marker);
if Smarker(1)>=1 for e=1:1:Smarker(1)
xyMatrix(j,5)=xyMatrix(j,5)+Matrix(marker(e),5);
xyMatrix(j,6)=xyMatrix(j,6)+Matrix(marker(e),6);
end end end
xyMatrix
Die beiden einzulesenden Test-Datein mit den Matrizen sind angehängt.
Der Code funktioniert genau so wie ich es will.
Beim durchrechnen der Matrizen habe ich 2 Methoden ausprobiert. Erst eine einfach mit for-Schleifen, die sich aber mal wieder als viel zu langsam erwiesen hat. In Methode 2 (aktiv) ist das finden der Zellen mit dem entsprechenden Koordinatenpärchen durch eine MatlabFunktion find gelöst, was Faktor 6 in der Zeit gebracht hat.
Die beiden Testmatrizen anbei sind winzig. Wie gesagt habe ich für die reelle Berechnung Matrizen mit 1,5 Mio * 7 Spalten. Und davon eine ganze Menge.
Ich denke der letzte ineffiziente Teil im Code ist die for-Schleife, in der dann die finalen Additionen durchgeführt werden. (Zum Glück hat diese Schleife gemessen an der Zeilenanzahl der Matrizen, sehr viel weniger Durchläufe).
Wozu ich gerne noch Anregungen hätte:
- Seht ihr offensichtliche Performance-Fresser und könnt mir einen Ansatz zur Verbesserung nennen?
-(parfor habe ich nicht zur Verfügung)
Ziel ist es für mich auch mein Verständnis für die Performance-Optimierung zu steigern, damit ich in Zukunft besseren Code schreibe.
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.