Verfasst am: 24.02.2017, 11:59
Titel: Vektorisierung von for-Schleifen bei der Bildbearbeitung
Hallo ihr Lieben!
Ich bin ein Neuling in Sachen Programmierung+ Matlab und würde mich deshalb sehr über Hilfe von Euch freuen.
Mein momentanes Projekt dreht sich um Bilverarbeitungen und ich bin gerade dabei ein bestehendes Programm zu verbessern/verschnellern. Ich habe gelesen, dass for-Schleifen von Matlab meist sehr langsam bearbeitet werden, weshalb ich gern den folgenden Code vektorisieren würde. Leider weiß ich noch nicht genau wie das funktioniert.
Der Code lautet:
sum_col_x=sum(roi_rotate_volume_x(:,:,i));
norm_sum_x=sum_col_x/quantile(sum_col_x,0.70);
matrix_sum_x=repmat(norm_sum_x,1000,1);
matrix_sum_x=matrix_sum_x./max(max(matrix_sum_x));
summe_x(:,:,i)=double(roi_rotate_volume_x(:,:,i))./(matrix_sum_x);
... end ... end
Verfasst am: 25.02.2017, 19:41
Titel: Re: Vektorisierung von for-Schleifen bei der Bildbearbeitung
Hallo Chaos391,
Zitat:
Ich habe gelesen, dass for-Schleifen von Matlab meist sehr langsam bearbeitet werden, ...
Das ist ein Gerücht, dass sich wohl noch lange halten wird. Seit Matlab 6.5 beschleunigt Matlabs JIT Schleifen deutlich. Es hängt seit dem vom einzelfall ab, ob der Overhead für die Schleife oder der zum Erzeugen temporärer Arrays überwiegt.
Dies lässt sich deutlich beschleunigen: Hier wird ein Vector zunächst zu einer Matrix aufgeblasen, und danach der maximale Wert gesucht. Es ist billiger, gleich im Vektor zu suchen und die Division per BSXFUN durchzuführen:
Vielen Dank für die Antwort. Ich habe Deinen Vorschlag, Jan S, heute ausprobiert. Leider hat dieser nichts verbessert. Mein Code dauert 1,34 Sekunden, während dein Code 1,37 Sekunden braucht. Summe_x wurde vor der Schleife in ihrer Größe vordefiniert. Also daran kann es nicht liegen. Hat jemand vielleicht noch eine andere Idee?
Optimierungen lassen sich kaum im Blindflug leisten. Kannst Du ein lauffähiges Programm zusammen mit typischen Inputs posten?
Was sagt der Profiler zum Bottleneck des Codes?
Guten Morgen,
die Schleife, die ich optimieren möchte, ist ein Teil eines größeren Programms. Ich weiß nicht genau, wie ich das posten soll, damit ihr damit etwas anfangen könnt. Ich poste einfach mal die Funktion, in der die Schleife zu finden ist. Vielleicht reicht das ja schon?
Das mit der Datei anhängen hat leider nicht funktioniert. Deshalb hier die wichtigsten Werte:
roi_rotate_volume_x=1000x1200x256 uint16
opening_threshold=1.1
maxarea=100
center_threshold=1.1
Bei den Thresholds bin ich mir noch nicht ganz sicher, ob diese so bleiben.
Liebe Grüße
Chaos391
Laut dem Profiler ist wohl der Median Filter der Bösewicht Aber den muss ich ja nutzen?
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.