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

Repmat alternative

 

AureusPhoenix

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2015, 23:05     Titel: Repmat alternative
  Antworten mit Zitat      
Hi Leute, ich habe folgendes Problem:

Ich habe ein Array mit Koeffizienten (sagen wir A=[1 2 3]) und möchte dieses so mit einem Bilderstapel (sagen wir B mit Dimensionen 128x128x3) multiplizieren, das am Ende C(:,:,1)=A(1).*B(:,:,1); C(:,:,2)=A(2).*B(:,:,2) usw. bei raus kommt.

Nun habe ich zwei Ansätze versucht.
a) Schleife
b) Reshape und repmat

Das Problem ist, das repmat so extrem lahm ist, dass selbst die Schleife schneller durchgelaufen ist. Da der Code-Teil aber mein momentan mit Abstand langsamster ist und ich nen iterativen Algorithmus schreibe, wäre es echt cool, wenn ich das etwas beschleunigen könnte.

Im Grunde bläht repmat ja jeden Koeffizienten zu 128x128 auf. Theoretisch sollte das also auch irgendwie in der Art "A.*ones(128,128)" gehen. Das Funktioniert aber natürlich nicht, da die Dimensionen nicht stimmen.

Kann mir da jemand auf die Sprünge helfen?

Vielen Dank im Voraus!


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.01.2015, 07:24     Titel:
  Antworten mit Zitat      
Zitat:
Das Problem ist, das repmat so extrem lahm ist

hmm was meisnt du denn mit lahm? bei mir braucht der entsprechende code 0.000323 sek. in welcher größenordnung brauchst du denn die berechnung. bei mir ist da sogar noch n reshape mit drin der nochmal zeit verbraucht. der repmat alleine wäre bestimmt noch n bisschen schneller.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
AureusPhoenix

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2015, 07:49     Titel:
  Antworten mit Zitat      
Meine genauen Matrix-Dimensionen sehen so aus:

Ich hab ein 128x128x21 großes Volumen (Bilder-Stack) das komplex ist. Und eine Vektor mit 21 Werten der Skalar ist. Jetzt multipliziere ich jedes Bild mit dem Wert des Vektors und addiere am Ende noch alle Bilder auf.

Da ich das in nem genetischen Algorithmus mache, muss das für jedes Individuum sein. Das heißt ich rufe diese Funktion ungefähr 200mal je Iteration auf.

Wenn ich es als Schleife programmiere, d.h.
Result=zeros(128,128)
for index=1:21
Result=Result+Volumen(:,:,index).*vector(index);
end

ist es ungefähr doppelt so schnell wie die Methode mit Repmat und Reshape. Das kann ja irgendwo nicht sein. Es heißt ja immer Matlabs interne Routinen seien viel schneller als schleifen.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.01.2015, 08:02     Titel:
  Antworten mit Zitat      
Zitat:
. Es heißt ja immer Matlabs interne Routinen seien viel schneller als schleifen.

hmm das ist mir unbekannt. kann mich auch nicht erinnern das in der dokumentatin gelesen zu haben. viele matlab interne sachen werden mit schleifen bearbeitet und aufgrund der variablen anzahl von eigabe parametern die erst überprüft werden müssen dauert das zum teil ein bisschen länger. grade wenn man so winzig kurze berechnungen wie deine durchführt.

Code:
vector=1:21;
Volumen=rand(128,128,21);
Result=zeros(128,128);
tic
for index=1:21
Result=Result+Volumen(:,:,index).*vector(index);
end
toc
Elapsed time is 0.000838 seconds.
tic
result2=sum(repmat(reshape(vector,1,1,21),128,128,3).*Volumen);
toc
Elapsed time is 0.001754 seconds.
 

ich verstehe aber auch den optimirungs bedarf grade noch nicht ganz. in der zeit in der ich die antwort verfasst hab hier hätte ich das ganze schon 22k mal durchlaufen lassen können. falls du eine sehr große anzahl an bildern verarbeitest würde sich da ewentuell paralelisierung anbieten.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
AureusPhoenix

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2015, 08:16     Titel:
  Antworten mit Zitat      
Zitat:
falls du eine sehr große anzahl an bildern verarbeitest würde sich da eventuell paralelisierung anbieten.

Mmh, das ist natürlich ne Idee. Hab ich zwar bisher noch nie gemacht, wäre aber sicher auch mal ne spannende Sache.

Zitat:
ich verstehe aber auch den Optimierungsbedarf grade noch nicht ganz

Das Problem ist der genetische Algorithmus. Ich hab halt nen 21-dimensionalen Parameterraum mit haufenweise lokalen Minima. Das heißt, damit mein Algorithmus konvergiert braucht es schon ne Weile. Um im Moment geb ich ihm schon ein sehr einfaches Ziel von dem ich weis, dass es mit den vorhandenen Freiheitsgraden 100%ig erreicht werden kann. Ich werd natürlich weiter versuchen den Algorithmus selbst zu optimieren aber es hatte mich gewundert, dass man an dieser Stelle nicht mehr raus holen kann.

Danke auf jeden Fall!
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.01.2015, 08:39     Titel:
  Antworten mit Zitat      
vielleicht könnte man auch was erreichen wenn man da ne mex file einbaut aber da bin ich mir nicht sicher.
http://www.mathworks.com/matlabcent.....reader/view_thread/240293 bsxfun ist nicht wirklich schneller bei deiner anwendung. aber vielleicht würde die in dem post erwähnte schnellere version von repmat was bringen aber das habe ich selber noch nicht ausprobiert. direct indexing ist in diesem fall ja schon relativ schnell.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 30.01.2015, 08:56     Titel:
  Antworten mit Zitat      
Ein paar Anmerkungen. Zunächst einmal zum Thema Schleifen und Performance. MATLAB gibt es seit 1984. Tatsächlich war es anfangs so, dass Schleifen sehr langsam waren und Matrixoperationen sehr schnell und alle Professoren und Trainingsunterlagen das beschrieben haben. Da das Internet nichts vergisst gibt es alles diese Aussagen noch und ich kenne aktuelle MATLAB Kurse von Hochschulen, die es auch noch niht vergessen haben...

Vor über zehn Jahren wurde innerhalb MATLAB die JIT Accelerator Technologie eingeführt, den Unterschied in der Performance sehr stark vermindert hat. Weiterhin gibt es so viele Unterscheidungen je nach Datentyp und Operation, dass die pauschale Aussage einfach nicht mehr haltbar ist.

Für das Problem selber: Ich denke das ist doch ein Klassiker für den Technischen Support. Natürlich sollte der komplette Code zur Verfügung stehen und dann kann man telefonisch Optionen besprechen. Viele Anwender wissen auch nicht welche Produkte zum paralleln und verteilten Rechnen an einer Hochschule / im Unternehmen schon existieren. Der Support weiss das und kann vermitteln.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


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

Bei Code hängt die Performance immer von verschiedenen Details ab. Eine allgemeine Beschreibung wie "die Methode mit Repmat und Reshape" erlaubt es nicht, wirklich nachzuvollziehen, was Du genau machst. Wenn eine Pre-Allocation fehlen würde, wäre das z.B. ein massiver Nachteil.
Bitte poste also ein lauffähiges relevantes Stück des Codes.

Code:
Result=zeros(128,128);
for index=1:21
      Result=Result+Volumen(:,:,index).*vector(index);
end

Wenn man hier per REPMAT ein großes 3D-Array baut, ist der Zugriff auf den Speicher der Flaschenhals und die FOR-Schleife kann viel effizienter sein. BSXFUN ist dann oft eine Abhilfe. Aber prinzipiell ist gegen diese Schleife nichts einzuwenden.

Gruß, Jan
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 - 2024 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.