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

for Schleifen durch Matrixoperationen ersetzen

 

fabbes

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2011, 16:12     Titel: for Schleifen durch Matrixoperationen ersetzen
  Antworten mit Zitat      
Hi,

ich habe ein Problem. Und zwar soll ich folgenden Code möglichst ohne for-schleifen realisieren. Es geht dabei um die Erstellung einer Matrix Z welche die Häufigkeitsverteilung der gemeinsamen Ergeignisse von X und Y darstellen soll.

Code:

X = power(:,3)';
Xu = unique(power(:,3)');
Y = power(:,2);
Yu = unique(power(:,2));
Z = zeros(length(Yu),length(Xu));


for w = 1:length(Xu)
    for q = 1:length(X)
       if X(q)==Xu(w)
           for m = 1:length(Yu)
               if Yu(m)==Y(q)
                   Z(m,w) = Z(m,w)+1;
               end
           end  
       end
    end    
end
contourf(Xu,Yu,Z)
 


Wär super wenn jemand eine Idee hätte! Vielen Dank. Gruß


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.09.2011, 18:42     Titel: Re: for Schleifen durch Matrixoperationen ersetzen
  Antworten mit Zitat      
Hallo fabbes,

Wieso möchtest Du dies denn ohne FOR-Schleifen implementieren?
Möchtest Du es beschleunigen? Dazu wären aber FOR-Schleifen manchmal die bessere Wahl. Um das in Deinem Fall entscheiden zu können, ist es notwendig den Typ und die Dimension der Variablen zu kennen.

Ich würde auf alle Fälle den Namen "power" vermeiden, weil das eine eingebaute Funktion ist, die danach nicht mehr aufgerufen werden kann.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.09.2011, 18:52     Titel: Re: for Schleifen durch Matrixoperationen ersetzen
  Antworten mit Zitat      
Hallo fabbes,

Ich fange schon mal mit ein paar Ideen an:
Code:

for w = 1:length(Xu)
    Xuw = Xu(w);
    for q = 1:length(X)
       Yq = Y(q);
       if X(q) == Xuw
           index = find(Yu == Yq);
           Z(index,w) = Z(index,w) + 1;
       end
    end    
end

Aber wie wäre es gleich das zweite und dritte Ausgabe-Argument von UNIQUE zu benutzen?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
fabbes

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2011, 12:00     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank schon mal für die schnelle Hilfe. Den Tipp bzgl. power hab ich direkt mal umgesetzt und der Rest vom Skript funktioniert auch.
Der Grund ist tatsächlich, dass ein Kollege meinte, dass FOR-Schleifen mir das Skript bei größeren Datenmengen unendlich langsam machen würden.
Bei den Daten handelt es sich um Integers (später evtl auch floats..) und werden in Dimensionen von 1000+ bereitstehen..

Gruß Fabian
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.09.2011, 12:33     Titel:
  Antworten mit Zitat      
Hallo fabbes,

Das Gerücht über langsame FOR-Schleifen in Matlab hält sich hartnäckig. Wenn eine vektorisierte Methode aber viel temporären Speicher benötigt, können FOR-Schleifen dank der JIT-Beschleunigung deutlich schneller sein.

Verstehen ich richtig, dass dies realistischen Testdaten wären:
Code:
data = floor(rand(2000, 3) * 100);

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
fabbes

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2011, 12:57     Titel:
  Antworten mit Zitat      
Hi Jan,

ja genau. Allerdings kann die zweite Spalte auch negative Werte enthalten.

Gruß Fabian
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.09.2011, 16:57     Titel:
  Antworten mit Zitat      
Hallo Fabian,

Wenn also negative Werte in der zweiten Spalte stehen können, wie wäre die einzufügen? Natürlich kann ich das auch machen, aber wenn Du mithilfst, ist das motivierender...
Code:
data = floor(rand(2000, 3) * 100);
data(:, 2) = data(:, 2) - 50;

Meine Versuche den Code zu vektorisieren benötigen alle mindestens die doppelte Laufzeit. Mit etwas vereinfachten FOR-Schleifen komme ich von 0.0074 sec auf 0.0066:
Code:
  X   = data(:,3)';
   Xu  = unique(X);
   nXu = length(Xu);
   Y   = data(:,2);
   Yu  = unique(Y);
   nYu = length(Yu);
   Z   = zeros(nYu, nXu);
   
   for w = 1:nXu
      Xuw = Xu(w);
      Zw  = zeros(nYu, 1);
      for q = 1:length(X)
         if X(q) == Xuw
            for m = 1:nYu
               if Yu(m) == Y(q)
                  Zw(m) = Zw(m)+1;
               end
            end
         end
      end
      Z(:, w) = Zw;
   end

Aber ist das Ganze nicht einfach ein 2D-Histogramm? Dazu gibt es mehrere Methoden in der FEX: http://www.mathworks.com/matlabcentral/fileexchange/?term=hist2.
HISTC wäre auch eine gute Idee für die einzelnen Spalten.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
fabbes

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2011, 15:02     Titel:
  Antworten mit Zitat      
Hey Jan,

ja im Prinzip ist es schon ein 2-D Histogramm, allerdings finde ich keine Möglichkeit die Matrix power auf die einzelnen Reihen und nicht auf die einzelnen Elemente hin zu untersuchen.

P = [15 3;
13 2;
15 3;
9 4;
13 2]

Ich brauche die Häufigkeiten der einzelnen Reihen:
15 3 = 2
13 2 = 2
9 4 = 1

das ganze müsste ich dann in einem contour diagramm abbilden..

hab schon versucht die einzelnen reihen über mat2cell in einzelne zellen
zu packen. allerdings klappt bei numerischen zellen die unique funktion nicht.. über hist weiss ich auch nicht wie das gehen soll. und als anfänger fehlen mir da ein bisschen die logischen zusammenhänge um eigenständig auf eine lösung zu kommen..

falls dir noch was einfällt kannst du ja gerne schreiben. aber ansonsten erstmal vielen dank.. weil funktionieren tuts ja und ich kanns auch erstmal so stehen lassen!!

gruß fabian
 
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.