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

Elemente in Bins sortieren

 

spiele-joe
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 28.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2016, 06:58     Titel: Elemente in Bins sortieren
  Antworten mit Zitat      
Hallo,

ich habe die Herausforderung einzelne Elemente in Bins zu sortieren:
Es gibt einen Vektor A mit a Elementen, wobei jeder Eintrag einen bin-Index angibt. In der Summe gibt es beispielsweise 100 Bins. In A stehen also werte von 1 bis 100.
Außerdem habe ich einen Vektor B mit a Elementen, wobei jeder Eintrag die Konzentration der zu A gehörigen Elemente angibt.
Nun möchte ich gerne alle Elemente in die zugehörigen Bins sortieren und dabei die Konzentrationen aufsummieren.

Bisher mache ich das über eine Schleife, was jedoch schrecklich langsam ist, da die Größe von A/B im Bereich von 10 Millionen Einträgen liegt. Das Ganze ist wiederum erneut in eine Schleife eingebettet, auf welche man jedoch nicht verzichten kann.
Ich habe mehrere Varianten ausprobiert, um das Problem vektoriell darzustellen, bin jedoch noch nicht auf einen grünen Zweig gekommen.

Über eine kurze Hilfestellung wäre ich daher sehr dankbar.

Viele Grüße
Johannes
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.07.2016, 09:04     Titel:
  Antworten mit Zitat      
Hallo,

ein kleines Beispiel ist da immer hilfreich.

Es klingt so, als ob findgroups / splitapply (ab R2015b) oder in älteren Versionen accumarray helfen sollte.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
spiele-joe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 28.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2016, 09:36     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine schnelle Antwort. Hier wäre ein funktionsfähiges Beispiel:
Code:
% define number of elements and bins
Nelements = 1e3;
Nbins = 100;
Nparam = 5;

% generate randomly distributed values for testing
conc = rand(Nelements, Nparam);
bins = ceil(rand(Nelements, 1)*Nbins);
binarray = 1:Nbins;

% current solution via loop
conc_bin = zeros(Nbins, Nparam);
for k = 1:Nelements
    conc_bin(bins(k),:) = conc_bin(bins(k),:) + conc(k,:);
end


Ich habe es leicht erweitert, da im tatsächlichen Programm jedes Element N verschiedene Parameter haben kann.

Vielen Dank und Grüße
Johannes
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.07.2016, 10:22     Titel:
  Antworten mit Zitat      
Hallo,

hier die Umsetzung mit findgroups und splitapply :

Code:
conc_bin2 = zeros(Nbins, Nparam);
[g, ID] = findgroups(bins);
conc_bin2(ID, :) = splitapply(@sum, conc, g);


Wenn in der "echten" Anwendung sichergestellt ist, dass die Bins durchnummeriert sind, geht es etwas einfacher:
Code:
g = findgroups(bins);
conc_bin2 = splitapply(@sum, conc, g);


So oder so, ich gewinne bei größeren Datenmengen ( Nelements = 1e6; Nbins = 1e4; ) einen Faktor 3-4.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
spiele-joe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 28.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2016, 11:42     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Lösungsvorschläge. Beide Varianten funktionieren einwandfrei.
Leider ist es so, dass sich der Geschwindigkeitsvorteil bei größeren Nparam-Werten negiert. Real kann dieser bis zu 500 betragen und schon bei 100 ist der Loop deutlich schneller (20%).
Ursprünglich hatten wir das Projekt über Fortran realisiert (in diesem Fall war es eine Schleife) und dieser Schritt war letztlich ungefähr um den Faktor 20 schneller als in Matlab. Die Parameter für ein reales Problem waren dabei üblicherweise: Nelements = 1e7, Nbins = 200 und Nparam = 250.
Jedoch gab es dort andere Probleme/Einschränkungen, sodass wir letztlich auf Matlab umgestiegen sind.
Vielleicht bekomme ich es ja noch anders gelöst, da das zugrunde liegende Program eigentlich mindestens in Realtime laufen sollte. Crying or Very sad

Vielen Dank noch einmal und Grüße
Johannes
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.07.2016, 12:51     Titel:
  Antworten mit Zitat      
Hallo,

ich hoffe, ihr habt eine Maschine mit min. 32 GB Speicher. Falls nicht und der Rechner ins Swappen gerät, ist an performantes Rechnen ohnehin nicht mehr zu denken.

Was heißt denn "in realtime laufen"?

Wenn man bestehenden Fortran-Code hat und Teile deutlich schneller sind, dann könnte man das über Fortran MEX-Files einbinden.

Ansonsten kann ich nur noch zu einem Kontakt mit dem Technischen Support von MathWorks raten. Vielleicht hat man dort noch Vorschläge für dich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
spiele-joe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 28.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2016, 13:41     Titel:
  Antworten mit Zitat      
Hallo,

unsere Maschine hat 36 Kerne und 256 GB Speicher, daran sollte es also nicht liegen.
Das Einbinden des Fortran-Code wäre in der Tat eine Möglichkeit, ich werde das einmal evaluieren.
An den Support von MathWorks werde ich mich auch wenden. Vielen Dank für den Tipp.

Grüße
Johannes

PS: Zur Realtime-Thematik. Jede Berechnung stellt letztlich einen Zeitschritt von einer Sekunde dar. Es sollen Zeiten von bis zu einem Tag berechnet werden. Bei 20s/Zeitschritt wären das entsprechend 20 Tage für eine Simulation.
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.