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

Tipp zur Beschleunigung des Programmes

 

KEH
Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 09.10.14
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 29.04.2015, 09:31     Titel: Tipp zur Beschleunigung des Programmes
  Antworten mit Zitat      
Hey Ho

Ich hab ein Programm welches eine Ordner-Struktur abfragt bis es Daten findet und dann diese Bearbeitet und in ein Array Schreibt anschließend in ein .txt .

Problem dabei ist das die Strucktur aus 45 Ordner mit je 9 Unterordnern gebildet wird und darin sind dann max 15 Datein

Das Programm Läuft aber Langsam, Bei der Berechnung finde ich es nicht so schlimm aber wenn die Ordner Leer sind braucht es auch ewig.

Code:
clear all
close all
clc



%% Folder öffnen
       
Folder1 ='C:\HSA_Projekte\Stolper_Studie\Rohdaten';
Folder1Dir = dir(Folder1);
Folder1Name = {Folder1Dir.name};
Folder1Name(strncmp(Folder1Name, '.', 1)) = [];  % Remove files with leading .

for jFolder = 1:numel(Folder1Name)
    Folder2 =[Folder1 '\' Folder1Name{jFolder}];
    Folder2Dir = dir(Folder2);
    Folder2Name = {Folder2Dir.name};
    Folder2Name(strncmp(Folder2Name, '.', 1)) = [];  % Remove files with leading .

    for iFolder = 1:numel(Folder2Name)
        Folder3 = [Folder2 '\' Folder2Name{iFolder}];
        filesDir = dir(Folder3);
        filesName = {filesDir.name};
        filesName(strncmp(filesName, '.', 1)) = [];  % Remove files with leading .
 Probanden(1:54)={iFolder};
        Kondition(1:18)= {'C'}; Kondition(19:36)= {'G'}; Kondition(37:54)= {'L'};
        Zeitpunkt(1:6)={'t1'}; Zeitpunkt(7:12)={'t2'}; Zeitpunkt(13:18)= {'t3'};
        Zeitpunkt(19:36)=Zeitpunkt(1:18); Zeitpunkt(37:54)=Zeitpunkt(1:18);
        for i=1:6:54
        Schritt(i:i+5)= {'gang'; 'Pre_Schritt'; 'Perturbation'; 'Pos_1.Schritt'; 'Pos_2.Schritt'; 'Pos_3.Schritt' };
        end
        Titel (1:40) = {zeros(1,1000)};
        Titel (1:4) = {'Proband' 'Kondition' 'Zeitpunkt' 'Schritt' };
        SZeile = iFolder*54-53;
        EZeile = SZeile+53;
        Daten_Infos(1:54*43,1:4) = {0};
        Daten_Infos(SZeile:EZeile,1:4)=[Probanden' Kondition' Zeitpunkt' Schritt'];
            zeilen = 54*43;
            Mean_SD_Matrix(1:zeilen,1:36)={zeros(1,1000)};
            %% Dateien einlesen
        if numel(filesName) < 9
            Mean_SD_Matrix(iFolder*6-5:iFolder*6,1:36)={zeros(1,1000)}; % wenn Ordner Leer oder weniger als 9 Files enthält dann schreibe 6 Zeilen mit 0
        elseif numel(filesName) >= 9 % bei mehr als 9 berechne
            for iFile = 1:numel(filesName)
   
                aFile = fullfile(Folder3, filesName{iFile});
                T = readtable(aFile, 'Delimiter', '\t');
                A = table2array(T);

    %% Leerzeilen finden ...
                [z, s] = size(A);
                hlp = NaN(1, s);
                log = false(z, 3);  % pre-allocate
                for ii = 1:z
                    log(ii) = isequaln(A(ii,:), hlp);
                end
                idx = find(log);
    % ... und entfernen
                A(idx,:) = [];
                [z,s] = size(A);
%% Zuschnitt

                [M_PertGait_roh{iFile,1}, M_PertGait_roh{iFile,2}, M_PertGait_roh{iFile,3}, M_PertGait_roh{iFile,4}] = Zuschneiden_mit_Minimas( A );
                M_PertGait_roh{iFile,4}(isnan([M_PertGait_roh{iFile,4}(:,1:20)]))=[];
            end % daten einlesen in eine Tabelle
       
%% Berechnungen und Ausgaben
            for w =7:s % winkelspalten Nach TXT definieren
                index=w-6; % um mit 1 zu starten
            for phase = 1:4 % bei 3 schritten posterior
                n=1000
            for jFiles=1:numel(filesName) % Anzahl der Perturbationen
                M_PertGait{phase}(:,jFiles)=interp1(1:length(M_PertGait_roh{jFiles,phase}(:,w)),M_PertGait_roh{jFiles,phase}(:,w),linspace(1,length(M_PertGait_roh{jFiles,phase}(:,w)),n(end)));
            end
           
            M_Mean{phase}(index,:) = (mean([M_PertGait{phase}]'));
            M_SD{phase}(index,:) = (std([M_PertGait{phase}]'));
           
            end
           
            sp=(index*2)-1;
            ze=(iFolder*6)-5;
            Mean_SD_Matrix(ze:ze+3,sp:sp+1)={M_Mean{1}(index,:) M_SD{1}(index,:);M_Mean{2}(index,:) M_SD{2}(index,:);M_Mean{3}(index,:) M_SD{3}(index,:);M_Mean{4}(index,:) M_SD{4}(index,:)};

            end
       
           
        end
    %% Exel Ausgabe
    filename = ['SS_Datenmatrix2.csv'];
    Datenmatrix = [Titel; Daten_Infos Mean_SD_Matrix ];
    cell2csv2(filename, Datenmatrix, '\t' ,2010, '.')
    %csvwrite(filename,Datenmatrix) %,sheet,xlRange)
    end

end
 


Sieht evtl jemand eine Möglichkeit meine Programm-Struktur zu optimieren?

Ich freu mich über alle Kommentare.
Falls noch infos benötigt werden sagt bescheid

Gruß
KEH
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 29.04.2015, 09:34     Titel:
  Antworten mit Zitat      
um ein programm "schneller " zu machen muss man erstmal rausfinden wo die zeit flöten geht um nicht unnötig irgendetwas zu optimieren was nix bringt. dafür sollte man erstmal den profiler benutzen.
grüße
p.s. warum clear all mist in einem programm ist wurde hier im forum schon sehr sehr oft besprochen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
KEH
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 09.10.14
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 29.04.2015, 10:12     Titel:
  Antworten mit Zitat      
Ja danke, der Läuft seit heute morgen =/
Das mit dem Clear all hab ich nur drinn weil ich soviel parallel mache und somit sicher bin das alle Parameter leer sind, aber ansich hb ich schon viel hier gelesen und seit den nutz ich es auch weniger =)
Private Nachricht senden Benutzer-Profile anzeigen
 
KEH
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 09.10.14
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 29.04.2015, 10:45     Titel:
  Antworten mit Zitat      
So nun das Ergebniss

wer kann nun helfen?

zu bemerken ist das dies das Ergebnis von einem von den 43 ordnern ist wobei hier lediglich 15 Datein enthalten sind

gruß
KEH
Private Nachricht senden Benutzer-Profile anzeigen
 
KEH
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 09.10.14
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 29.04.2015, 10:48     Titel:
  Antworten mit Zitat      
gut ... schein zu streiken
dann als jpeg

Profile_2.JPG
 Beschreibung:

Download
 Dateiname:  Profile_2.JPG
 Dateigröße:  76.04 KB
 Heruntergeladen:  249 mal
Profile_1.JPG
 Beschreibung:

Download
 Dateiname:  Profile_1.JPG
 Dateigröße:  71.79 KB
 Heruntergeladen:  277 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.04.2015, 11:27     Titel:
  Antworten mit Zitat      
Hallo,

klicke doch mal auf SS_Datenmatrix, damit du siehst, welche Zeilen wirklich die meiste Zeit brauchen. Das ist ja die entscheidende Information.

Zitat:
Das mit dem Clear all hab ich nur drinn weil ich soviel parallel mache

Wenn du mehr mit Funktionen statt Endlosskripten arbeitest, wird sich der Bedarf für ein "clear all" (ein clear ist in der Regel vollkommen ausreichend) dramatisch reduzieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 29.04.2015, 11:28     Titel:
  Antworten mit Zitat      
tja daraus geht ja hervor das die meiste zeit von der cell2csv2 verbraucht wird. diese funktion ist mir unbekannt. aber du solltest dann mal gucken wie diese funktion arbeitet. anscheinend werden dadrin ja num2str und int2str über 300k mal aufgerufen. vieleicht kann man da ansetzen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.04.2015, 11:37     Titel:
  Antworten mit Zitat      
Hallo Winkow,

ich sehe das anders: 1363s werden in SS_Datenmatrix verbracht, dagegen "nur" 385s in cell2csv2. Selbst wenn man cell2csv2 stark optimiert, wird das die Laufzeit der Anwendung also nicht spürbar verringern.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 29.04.2015, 11:46     Titel:
  Antworten mit Zitat      
ja da hast du wahrscheinlich recht. asche auf mein haupt Smile ich hatte da in meiner vorstellung was verwächselt Smile ist immer nicht so leicht wenn man nicht selber rumclicken kann Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
KEH
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 09.10.14
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 29.04.2015, 12:22     Titel:
  Antworten mit Zitat      
Ich glaub ihr habt bei de recht

1. Bild SS_Datenmatrix
2. Bild cell2csv

gibt es für cell2csv eine bessere alternative?
ich hab eine Datenmatrix in der 40spalten und 2500 zeilen zellen enthalten sind
in den letzten 36 sind je 1000 werte (zeile) enthalten die ich dann hintereinander in eine datenbank lesen möchte (ausgabe ambesten csv)

danke schon mal für die analyse tips

2-Ausführlich.JPG
 Beschreibung:
cell2csv

Download
 Dateiname:  2-Ausführlich.JPG
 Dateigröße:  81.08 KB
 Heruntergeladen:  270 mal
1-Ausführlich.JPG
 Beschreibung:
main

Download
 Dateiname:  1-Ausführlich.JPG
 Dateigröße:  78.6 KB
 Heruntergeladen:  274 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.04.2015, 13:43     Titel:
  Antworten mit Zitat      
Hallo,

ich bin zugegebenermaßen verwirrt.
Gehören die verschiedenen Screenshots wirklich zu einem Profiler-Durchlauf?

Um zu sagen, ob man cell2csv(2) besser machen kann, müsste man zunächst wissen, was es ist und macht.
300000 Aufrufe von num2str dürften aber in den seltensten Fällen nötig sein.

Für einen einfachen Import/Export von tabellarischen Daten darf ich zudem Tables (u.a. readtable/writetable) empfehlen.

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

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 09.10.14
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 30.04.2015, 08:24     Titel:
  Antworten mit Zitat      
Ja ich war auch sehr Verwirrt

Aber es ist Tatsächlich von einem durchlauf.

aber nun weis ich wo ich ansetzen kann.
Ich werde mal mein Cellarray in ein Matrix schreiben und diese als txt ausgeben.
Private Nachricht senden Benutzer-Profile anzeigen
 
KEH
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 09.10.14
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 30.04.2015, 11:15     Titel:
  Antworten mit Zitat      
So von knapp 20min auf knapp 10min runtergehandelt

noch jemand eine iIee zum schreiben der daten?
oder kann ich bei 4x36000 werten nicht mehr erwarten?
vielleicht sollte ich 54x36000 wert draus machen somit muss ich die Funktion auch seltener aufrufen... *grübel*

Ach ja der Umstruckturierte code

Code:
clear all
close all
clc

%% pre-Located
Daten_Kopfzeile (1:36004) = 0;
% Daten_Kopfzeile (1:4) = ['Proband'; 'Kondition'; 'Zeitpunkt'; 'Schritt'];
Daten_Info_Spalten(1:54*43,1:4) = 0;
Daten_Matrix(1:54*43,1:36000) = 0;

%% Folder öffnen
       
Folder1 ='C:\HSA_Projekte\Stolper_Studie\Rohdaten';
Folder1Dir = dir(Folder1);
Folder1Name = {Folder1Dir.name};
Folder1Name(strncmp(Folder1Name, '.', 1)) = [];  % Remove files with leading .

for jFolder = 1:numel(Folder1Name)
    Proband=jFolder
    Folder2 =[Folder1 '\' Folder1Name{jFolder}];
    Folder2Dir = dir(Folder2);
    Folder2Name = {Folder2Dir.name};
    Folder2Name(strncmp(Folder2Name, '.', 1)) = [];  % Remove files with leading .

    for iFolder = 1:numel(Folder2Name)
        Teilordner=iFolder
        Folder3 = [Folder2 '\' Folder2Name{iFolder}];
        filesDir = dir(Folder3);
        filesName = {filesDir.name};
        filesName(strncmp(filesName, '.', 1)) = [];  % Remove files with leading .
       
        SZeile = iFolder*54-53;
        EZeile = SZeile+53;

        Daten_Info_Spalten(SZeile:EZeile,1)=(iFolder);
        Daten_Info_Spalten(SZeile:EZeile*(1/3),2)= 1 ; Daten_Info_Spalten(SZeile+18:EZeile*(2/3),2)= 2 ; Daten_Info_Spalten(SZeile+36:EZeile,2)= 3 ; % 1=C 2=G 3=L
        Daten_Info_Spalten(SZeile:EZeile*(1/9),3)= 1 ; Daten_Info_Spalten(SZeile+6:EZeile*(2/9),3)=2 ; Daten_Info_Spalten(SZeile+12:EZeile*(3/9),3)= 3; % 1=t1 2=t2 3=t3
        Daten_Info_Spalten(SZeile:EZeile*(4/9),3)= 1 ; Daten_Info_Spalten(SZeile+6:EZeile*(5/9),3)=2 ; Daten_Info_Spalten(SZeile+12:EZeile*(6/9),3)= 3; % 1=t1 2=t2 3=t3
        Daten_Info_Spalten(SZeile:EZeile*(7/9),3)= 1 ; Daten_Info_Spalten(SZeile+6:EZeile*(8/9),3)=2 ; Daten_Info_Spalten(SZeile+12:EZeile*(9/9),3)= 3; % 1=t1 2=t2 3=t3
        for i=SZeile:6:EZeile
        Daten_Info_Spalten(i:i+5,4)= [0 1 2 3 4 5];
        end
       
        %% Dateien einlesen
        if numel(filesName) < 9
            Daten_Matrix(iFolder*6-5:iFolder*6,1:36000)=0; % wenn Ordner Leer oder weniger als 9 Files enthält dann schreibe 6 Zeilen mit 0
        elseif numel(filesName) >= 9 % bei mehr als 9 berechne
            for iFile = 1:numel(filesName)
   
                aFile = fullfile(Folder3, filesName{iFile});
                T = readtable(aFile, 'Delimiter', '\t');
                A = table2array(T);

    %% Leerzeilen finden ...
                [z, s] = size(A);
                hlp = NaN(1, s);
                log = false(z, 3);  % pre-allocate
                for ii = 1:z
                    log(ii) = isequaln(A(ii,:), hlp);
                end
                idx = find(log);
    % ... und entfernen
                A(idx,:) = [];
                [z,s] = size(A);
%% Zuschnitt

                [M_PertGait_roh{iFile,1}, M_PertGait_roh{iFile,2}, M_PertGait_roh{iFile,3}, M_PertGait_roh{iFile,4}] = Zuschneiden_mit_Minimas( A );
                M_PertGait_roh{iFile,4}(isnan([M_PertGait_roh{iFile,4}(:,1:20)]))=[];
            end % daten einlesen in eine Tabelle
       
%% Berechnungen und Ausgaben
            for w =7:s % winkelspalten Nach TXT definieren
                index=w-6; % um mit 1 zu starten
                for phase = 1:4 % bei 3 schritten posterior
                    n=1000;
                    for jFiles=1:numel(filesName) % Anzahl der Perturbationen
                        M_PertGait{phase}(:,jFiles)=interp1(1:length(M_PertGait_roh{jFiles,phase}(:,w)),M_PertGait_roh{jFiles,phase}(:,w),linspace(1,length(M_PertGait_roh{jFiles,phase}(:,w)),n(end)));
                    end
           
                    M_Mean{phase}(index,:) = (mean([M_PertGait{phase}]'));
                    M_SD{phase}(index,:) = (std([M_PertGait{phase}]'));
           
                end
           
                sp=(index*2000)-1999;
                ze=(iFolder*6)-5;
                Daten_Matrix(ze:ze+3,sp:sp+1999)=[M_Mean{1}(index,:) M_SD{1}(index,:);M_Mean{2}(index,:) M_SD{2}(index,:);M_Mean{3}(index,:) M_SD{3}(index,:);M_Mean{4}(index,:) M_SD{4}(index,:)];

            end
       
           
        end
    %% Exel Ausgabe
    filename = ['SS_Datenmatrix2.csv'];
    Datenmatrix = [Daten_Kopfzeile; Daten_Info_Spalten Daten_Matrix ];
    %cell2csv2(filename, Datenmatrix, '\t' ,2010, '.')
    csvwrite(filename,Datenmatrix) %,sheet,xlRange)
    end
stop
end
 


csvwrite_Ausführlich_zeilenZeit.JPG
 Beschreibung:

Download
 Dateiname:  csvwrite_Ausführlich_zeilenZeit.JPG
 Dateigröße:  79.86 KB
 Heruntergeladen:  270 mal
csvwrite_Ausführlich_.JPG
 Beschreibung:

Download
 Dateiname:  csvwrite_Ausführlich_.JPG
 Dateigröße:  129.99 KB
 Heruntergeladen:  229 mal
Profile_1_mit Matrix.JPG
 Beschreibung:

Download
 Dateiname:  Profile_1_mit Matrix.JPG
 Dateigröße:  133.8 KB
 Heruntergeladen:  243 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.04.2015, 11:34     Titel:
  Antworten mit Zitat      
Hallo,

das Schreiben der Datei mit csvwrite scheint die allermeiste Zeit zu benötigen. Um Alternativen benennen zu können, müsste man verstehen, was da eigentlich geschrieben wird.
Kannst du mal eine .mat-Datei mit Daten_Kopfzeile, Daten_Info_Spalten, Daten_Matrix zur Verfügung stellen?
Alternativ Datentyp und Dimensionen dieser Variablen.

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

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 09.10.14
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 30.04.2015, 13:06     Titel:
  Antworten mit Zitat      
ok bis jetztbei 76sec
danke für die Hilfe Wink
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.