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

Idee um Code zu beschleunigen

 

chill
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2012, 19:53     Titel: Idee um Code zu beschleunigen
  Antworten mit Zitat      
Hallo Zusammen,

in meinem Programm nimmt diese Funktion während einer Simulation leider sehr viel Zeit in Anspruch. Die Funktion soll von einem übergebenen Vektor rollierend das Minimum finden. Nicht mehr und nicht weniger.

Laut profile wurde auch diese Funktion als klar zeitaufwendigste identifiziert. (80 %)



Code:
function periodeMin = FXMin(Vector, Periode)
        % Initialisierung
            periodeMin = zeros(length(Vector),1);

        % Periode ausschneiden und Min bestimmen
            for i = Periode:length(Vector)
                periodeMin(i) = min(Vector(i-Periode+1:i));
            end
end



Hauptsächlich "schuld" für den Zeitaufwand ist wohl die min Funktion... Alternativ sort und dann den ersten Eintrag wählen führt dazu, dass das Programm noch langsamer wird Sad

Hab Ihr eine gute Idee um die Berechnung zu beschleunigen?
Ich wäre euch sehr dankbar...

ciao chill
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: 26.07.2012, 22:08     Titel:
  Antworten mit Zitat      
Hallo,

um hier helfen zu können, müsste man wissen, wieviele Elemente der Vektor typischerweise hat und über wieviele Elemente typischerweise gemittelt wird.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2012, 10:07     Titel:
  Antworten mit Zitat      
Hi,

der Vektor ist in der Simulation 600x1 gross, rollierend wird das Minimum über 100 Einträge bestimmt.

1. Rechnung: Minimum der Werte des Vektors 1:100
.
. ... 400x
.
Letzte Rechnung: Minimum der Werte des Vektors 401:600

Bereits eine Idee wie ich die Min-beschleunigen könnte?
VG Chill
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: 27.07.2012, 10:57     Titel:
  Antworten mit Zitat      
Hallo,

auf meinem Rechner braucht diese Funktion nur ca. 0,0014s. Wird diese Funktion wiederum sehr oft aufgerufen, oder warum ist das für dich relevant?

Ich habe mich mal noch daran gespielt und bekomme das noch etwas runter:
Code:
function periodeMin = FXMin2(Vector, Periode)
        % Initialisierung
            periodeMin = zeros(length(Vector),1);

        % Periode ausschneiden und Min bestimmen
            periodeMin(Periode) = min(Vector(1:Periode));
            for i = Periode+1:length(Vector)
                if periodeMin(i-1) ~= Vector(i-Periode)
                    periodeMin(i) = min(Vector(i), periodeMin(i-1));
                else
                    periodeMin(i) = min(Vector(i-Periode+1:i));
                end
            end
end  

Dann bin ich bei 0,0006s.

Ansonsten auch mal bei File Exchange schauen:
http://www.mathworks.com/matlabcent.....hange/24705-minmax-filter

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2012, 16:29     Titel:
  Antworten mit Zitat      
HI Harald,

vielen Dank, das beschleunigt meinen Code schon mal um mehr als 40%...
Super! Smile

Genau wie Du vermutest benutze ich die Funktion sehr oft, also normalerweise dauert eine Simulation für einen Beobachtungsraum ca. 2,5 Std. in der hauptsächliche die Minfunktion aufgerufen wird.

Da ich gerne über 100 Beobachtungsräume simulieren möchte....
2,5*100/24 bin ich bei über 10 Tagen... wenn alles "Glatt läuft" wäre ich jetzt "nur" noch bei 6 Tagen.

ciao
Chill
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: 28.07.2012, 17:04     Titel:
  Antworten mit Zitat      
Hallo,

an der Stelle wäre dann auch Parallelisierung eine Überlegung wert.
Die einfachste Möglichkeit dazu wäre, die 100 Beobachtungsräume in einer for-Schleife zu simulieren und diese dann in eine parfor-Schleife umzuwandeln.

Ich würde in jedem Fall auch die Funktion aus File Exchange ausprobieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2012, 21:23     Titel:
  Antworten mit Zitat      
Hi,

also ich hab schon einiges mit Matlab angestellt, aber mit mex hatte ich bisher noch nie was zu tun, leider bekomme ich das tool minmaxfilter nicht zum laufen

Code:
>> minmaxfilt1([1 2 3 4]',1)
Attempt to execute SCRIPT lemire_nd_minengine as a function:
C:\Program Files\MATLAB\R2012a\toolbox\MinMaxFilterFolder\lemire_nd_minengine.m

Error in minmaxfilt1 (line 90)
    [minval minidx] = lemire_nd_minengine(A, minidx, window, shapeloc);



skuriel, obwohl die Installation eigentlich funktionierte...
Help Smile


Code:
>> mex -setup
 
Welcome to mex -setup.  This utility will help you set up  
a default compiler.  For a list of supported compilers, see  
http://www.mathworks.com/support/compilers/R2012a/win64.html
 
Please choose your compiler for building MEX-files:
 
Would you like mex to locate installed compilers [y]/n? y
 
Select a compiler:
[1] Microsoft Software Development Kit (SDK) 7.1 in C:\Program Files (x86)\Microsoft Visual Studio 10.0
 
[0] None
 
Compiler: 1
 
Please verify your choices:
 
Compiler: Microsoft Software Development Kit (SDK) 7.1
Location: C:\Program Files (x86)\Microsoft Visual Studio 10.0
 
Are these correct [y]/n? y
 
***************************************************************************
  Warning: MEX-files generated using Microsoft Windows Software Development
           Kit (SDK) require that Microsoft Visual Studio 2010 run-time  
           libraries be available on the computer they are run on.
           If you plan to redistribute your MEX-files to other MATLAB
           users, be sure that they have the run-time libraries.
***************************************************************************
 
 
Trying to update options file: C:\Users\CHiLL\AppData\Roaming\MathWorks\MATLAB\R2012a\mexopts.bat
From template:              C:\PROGRA~1\MATLAB\R2012a\bin\win64\mexopts\mssdk71opts.bat
 
Done . . .
 
**************************************************************************
  Warning: The MATLAB C and Fortran API has changed to support MATLAB
           variables with more than 2^32-1 elements.  In the near future
           you will be required to update your code to utilize the new
           API. You can find more information about this at:
           http://www.mathworks.com/help/techdoc/matlab_external/bsflnue-1.html
           Building with the -largeArrayDims option enables the new API.
**************************************************************************
 
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: 28.07.2012, 22:31     Titel:
  Antworten mit Zitat      
Hallo,

ich kenne das Programm nicht. Im Zweifel würde ich also beim Autor des Programms nachfragen.

Beim Öffnen der .m-Datei sollte jedoch klar werden, wo das Problem liegt: das ist nur eine Hilfsdatei, die die Doku enthält. Man sollte die entsprechenden .c-Dateien mit mex kompilieren. Dann hat die mex-Datei Vorrang gegenüber der .m-Datei.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2012, 09:03     Titel:
  Antworten mit Zitat      
Heute morgen läuft es, obwohl ich keinen Neustart oder sonstiges gemacht habe.

gut wenn man mal drüber "schläft" Wink

später mal einbauen und dann schauen ob es schneller ist

ciao
Chill
Private Nachricht senden Benutzer-Profile anzeigen
 
chill
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2012, 16:46     Titel:
  Antworten mit Zitat      
ok, irgendwas hab ich an Matlab <-> Mex nicht ganz verstanden,
nach der Installation der Mex-Dateien, funktioniert es, soweit ich in dem Ordner bin wo alle Dateien (aus dem auch installiert wurde) liegen.

Da ich diesen Ordner bei Matlab mit "set path" hinzugenommen habe, sollte dies doch dann von "überall" ausführbar sein!?!?

Ich bekomme, sofern ich in einem anderen Ordner die Funktion aufrufe, dann aber folgende Fehlermeldung:

Code:
Attempt to execute SCRIPT lemire_nd_minengine as a function:
C:\Program Files\MATLAB\R2012a\toolbox\minmaxfilterfolder\lemire_nd_minengine.m

Error in minmaxfilt1 (line 90)
    [minval minidx] = lemire_nd_minengine(A, minidx, window, shapeloc);


mir ist nicht klar, was Matlab mir hier mitteilen möchte
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: 29.07.2012, 18:01     Titel:
  Antworten mit Zitat      
Hallo,

das Problem hatte ich an sich schon beschrieben. Die mex-Datei wurde entweder nicht erzeugt oder wird durch etwas anderes überlagert.

Kann es sein, dass das Verzeichnis, in dem du das installiert hast, ein anderes als C:\Program Files\MATLAB\R2012a\toolbox\minmaxfilterfolder ist, beide Verzeichnisse auf dem Suchpfad liegen, das letztgenannte Verzeichnis im Suchpfad vor dem anderen liegt?
Falls ja: C:\Program Files\MATLAB\R2012a\toolbox\minmaxfilterfolder vom Suchpfad nehmen oder nach unten verschieben.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2012, 20:02     Titel:
  Antworten mit Zitat      
Die Lösung ist etwas "komisch"

indem ich den eingetragenen Ordner bei "set path" nach ganz unten gesetzt habe... läuft es nun Smile

ciao
Chill
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: 29.07.2012, 21:45     Titel:
  Antworten mit Zitat      
Hallo,

als "komisch" würde ich die Lösung nicht bezeichnen.
Das Problem war schlicht und einfach, dass die falsche lemire_nd_minengine.* die höchste Priorität hatte. Und dieses Problem hast du durch das Verschieben im Suchpfad gelöst.

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