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

Brauche Hilfe bei Programmoptimierung

 

norm
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2009, 11:58     Titel: Brauche Hilfe bei Programmoptimierung
  Antworten mit Zitat      
Hi Leute

ich brauche Hilfe um folgendes Programm schneller zu machen. Mir stehen 2gb Speicher zur Verfügung. Da ich Matlab Anfänger bin, bin ich froh, dass mein Programm läuft aber mir fallen keine Ideen zur Optimierung ein.

Code:
%% Bildverbesserung
% Bildverbesserung.m

%% Clearen

clear all
clc
close all


%% Einlesen der Bilder und Berechnung

Zaehler = 0;
Summe = 0;

for i = 1 : 800: 29899
   
    clear all
   
    for q = i : 1 :  i+800
        Bild1 = imread('A (0).tif');
        assignin('caller', ['Bild' num2str(q)], imread(sprintf('A (%1d).tif', q)));
        Laufbild = evalin('caller', ['Bild' num2str(q)]);

        indices = Laufbild <= 7500;
        Hilfsbild = Laufbild;
        Hilfsbild(indices) = -65537;
        Zaehler = nnz(~indices);
        Summe = sum(Laufbild(~indices));

        Mittelwert = Summe/Zaehler;
        Summe = 0;
        Zaehler = 0;

        Laufbild = Hilfsbild - Bild1 + Mittelwert;

        Laufbild(Laufbild < 0) = 0;

        Laufbild = uint16(Laufbild);
    %     Laufbild = mat2gray(Laufbild);
        imwrite(Laufbild, ['CleanBild' num2str(q),'.tif'], 'tif')
    end
end


Die erste for Schleife habe ich benutzt, damit Matlab nicht nach ca 1000 Bildern abbricht mit Out Of Memory.

Hoffe jemand kann mir helfen, damit mein Programm deutlich schneller abläuft. Danke im Voraus Wink

Grüße
norm
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: 08.12.2009, 12:21     Titel:
  Antworten mit Zitat      
Hallo,

irgendwie kommt mir der Code bekannt vor Wink

Verbesserungsvorschläge im Kommentar:

Code:
%% Bildverbesserung
% Bildverbesserung.m

%% Clearen

clear all
clc
close all


%% Einlesen der Bilder und Berechnung

% Zaehler = 0;
% Summe = 0;

for i = 1 : 800: 29899
   
    clear all
    Bild1 = imread('A (0).tif');
   
    for q = i : 1 :  i+800
        % Bild1 = imread('A (0).tif'); <-- nicht innerhalb der FOR-Schleife!!
       
%         assignin('caller', ['Bild' num2str(q)], imread(sprintf('A (%1d).tif', q)));
%         Laufbild = evalin('caller', ['Bild' num2str(q)]);
        Laufbild = imread(sprintf('A (%1d).tif', q));
        % Erzeugen der Variable Bild_q ist unnötig, da nie damit gearbeitet wird
        % Damit wird der meiste Speicher gar nicht gebraucht, die innere
        % for-Schleife sollte unnötig sein

        indices = Laufbild <= 7500;
        Hilfsbild = Laufbild;
        Hilfsbild(indices) = -65537;
        Zaehler = nnz(~indices);
        Summe = sum(Laufbild(~indices));

        Mittelwert = Summe/Zaehler;
%         Summe = 0;
%         Zaehler = 0;

        Laufbild = Hilfsbild - Bild1 + Mittelwert;

        Laufbild(Laufbild < 0) = 0;

        Laufbild = uint16(Laufbild);
    %     Laufbild = mat2gray(Laufbild);
        imwrite(Laufbild, ['CleanBild' num2str(q),'.tif'], 'tif')
    end
end


Wenn die innere for-Schleife weggelassen werden kann (und ich denke, das kann sie), dann siehts so aus:

Code:
Bild1 = imread('A (0).tif');
for q = 1 : 29899
    %for q = i : 1 :  i+800
        % Bild1 = imread('A (0).tif'); <-- nicht innerhalb der FOR-Schleife!!
       
%         assignin('caller', ['Bild' num2str(q)], imread(sprintf('A (%1d).tif', q)));
%         Laufbild = evalin('caller', ['Bild' num2str(q)]);
        Laufbild = imread(sprintf('A (%1d).tif', q));
        % Erzeugen der Variable Bild_q ist unnötig, da nie damit gearbeitet wird
        % Damit wird der meiste Speicher gar nicht gebraucht, die innere
        % for-Schleife sollte unnötig sein

        indices = Laufbild <= 7500;
        Hilfsbild = Laufbild;
        Hilfsbild(indices) = -65537;
        Zaehler = nnz(~indices);
        Summe = sum(Laufbild(~indices));

        Mittelwert = Summe/Zaehler;
%         Summe = 0;
%         Zaehler = 0;

        Laufbild = Hilfsbild - Bild1 + Mittelwert;

        Laufbild(Laufbild < 0) = 0;

        Laufbild = uint16(Laufbild);
    %     Laufbild = mat2gray(Laufbild);
        imwrite(Laufbild, ['CleanBild' num2str(q),'.tif'], 'tif')
    %end
end


Eine weitere Beschleunigung wäre durch Einsatz der Parallel Computing Toolbox möglich.

Interessehalber: poste bitte, wie lange der Code vorher / nachher braucht.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2009, 16:20     Titel:
  Antworten mit Zitat      
Hallo Harald,

das Programm mit nur einer for Schleife läuft nun 5mal so schnell wie zuvor. Danke mal wieder für die schnelle Hilfe Smile

Grüße
norm
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.