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

Kompliziertes Matrixaufräumen

 

Leech
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 12.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2014, 15:32     Titel: Kompliziertes Matrixaufräumen
  Antworten mit Zitat      
Hallo,

ich habe hier ein Problem, zu dem mir aktuell keine Lösung gelingen will. Vielleicht könnt ihr mir weiter helfen.

Ich habe eine Matrix folgender Form:
Code:
A=[1,2,2,4,0,0;2,3,4,5,0,0;3,5,8,6,0,0;4,2,2,5,0,0;5,2,3,7,0,0]

A =

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


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.

Code:
a(any(isnan(a')),:)=[];
und
Code:
A(find(A(:,2)==0),:)=[]


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.

Vielen Dank!

Pierre
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.12.2014, 15:43     Titel:
  Antworten mit Zitat      
Zitat:
Unique habe ich auch gefunden, aber auch nichts hinbekommen

das ist nicht sehr aufschlussreich ^^
was hast du denn nicht hinbekommen ?
Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Leech
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 12.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2014, 15:52     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.12.2014, 15:55     Titel:
  Antworten mit Zitat      
Zitat:
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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Leech
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 12.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2014, 15:58     Titel:
  Antworten mit Zitat      
Nochmal in Kurzfassung:

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.12.2014, 16:01     Titel:
  Antworten mit Zitat      
das klappt wunderbar mit unique Smile
ich bin kein freund davon vertige lösungen zu posten wie du sihst Smile versuch dich doch einfach mal an dem befehl und wir helfen dir dann dabei ihn richtig umzusetzen. wenn etwas nicht klappt.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Leech
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 12.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2014, 18:10     Titel:
  Antworten mit Zitat      
So, ich habe da mal weiter rumprobiert.
Achtung hier mal ein ungetüm an schlechtem Code:

Code:
%Matrix anlegen
A=[1,2,2,4,0,0;2,3,4,5,0,0;3,5,8,6,0,0;4,2,2,5,0,0;5,2,3,7,0,0];

%Einzigartige x-Koordinaten finden
[C,ia,ic]=unique(A(:,2));

%Länge von ic
icsize=size(ic);

%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?

Vielen Dank
Pierre
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.12.2014, 18:14     Titel:
  Antworten mit Zitat      
na das ist doch schonmal ein anfang aber ich dachte du wolltest x und y raus haben ? warum machst du das dann nicht gleich mit unique ?
Code:
[C,ia,ic]=unique(A(:,2:3),'rows');

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Leech
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 12.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2014, 09:32     Titel:
  Antworten mit Zitat      
Crying or Very sad Ich wusste, dass ich mich verzettelt hatte. Das ist ja quasi ein Einzeiler gegen einen wüsten Haufen..

Vielen Dank, ich hoffe, dass ich damit weiter komme!

Pierre

Code:
%Matrix anlegen
A=[1,2,2,4,0,0;2,3,4,5,0,0;3,5,8,6,0,0;4,2,2,5,0,0;5,2,3,7,0,0];

%Einzigartige Kombinationen x,y finden
[C,ia,ic]=unique(A(:,2:3),'rows');

%Vektor sortieren
iasort=sort(ia);

%Neue Matrix, die nur die einzigartigen Zeilen enthält
B=A(iasort,:);


--> Kann dann geschlossen werden Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Leech
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 12.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2014, 11:20     Titel:
  Antworten mit Zitat      
Hi,

es geht jetzt nicht mehr um die Problematik zu Eingang. Eher möchte ich noch ein bisschen was dazu lernen. Hier der aktuelle Code:

Code:
function [ output_args ] = Test( input_args )

%Matrix einlesen
xyMatrix=dlmread('Koordinaten.usr','%d %f %f %f %f %f %f');
[C,ia,ic]=unique(xyMatrix(:,2:3),'rows');
iasort=sort(ia);
xyMatrix=xyMatrix(iasort,:);
xyMatrix(:,4)=-5;
xyMatrix(:,5)=0;
xyMatrix(:,6)=0;
Sxy=size(xyMatrix);

%Schleife über alle Zeitschritte und Dateien
for i=1001:1:1001
   
    %Daten einlesen,z in positive Werte wandeln und Maxima/Minima rechnen
    Ergebnisfile=['Output_' num2str(i,'%04d') '.usr'];
    Matrix=dlmread(Ergebnisfile,'%d %f %f %f %f %f %f');
    Matrix(:,4)=Matrix(:,4)*(-1);
    S=size(Matrix);
   
%     %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

end
   
   
       


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.

Vielen Dank und viele Grüße
Pierre

TEST.rar
 Beschreibung:
Enthält die beiden Test-Matrizen

Download
 Dateiname:  TEST.rar
 Dateigröße:  253 Bytes
 Heruntergeladen:  241 mal
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 - 2025 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.