Verfasst am: 29.01.2015, 23:05
Titel: Repmat alternative
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.
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.
_________________
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.
. 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 is0.000838 seconds.
tic
result2=sum(repmat(reshape(vector,1,1,21),128,128,3).*Volumen);
toc
Elapsed time is0.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.
_________________
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.
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.
_________________
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.
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
Einstellungen und Berechtigungen
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.