habe mal wieder ein kleines Problemchen und da mit hier jetzt schon öfter geholfen wurde versuch ich es mal hiermit:
Ich habe eine GUI gebaut, die auch eine Recht umfangreiche Dateneinlesefunktion enthält. Diese dauert recht lange und führt zu nahezu hundert Prozent Prozessorauslastung. Da die Funktion somit die volle Leistung beansprucht, kann ich während des Einlesens nichts an meiner Gui machen. Eigentlich soll das Einlesen aber eher eine Hintergrundfunktion sein und die Bedienung der GUI nicht beeinträchtigen.
Hat da jemand ne Idee?
Ich hatte mir so etwas vorgestellt wie die maximale Prozessorlast zu limitieren oder wie bei Windows eine Priorität zuzuweisen.
(Alternativ würde mir auch eine Beschleunigung des Codes weiterhelfen. Habe schon mit dem Profiler optimiert und soweit möglich verktorisiert. Oder hat jemand ne Idee wie ich eine Schleife in der mehrfach in die selbe Zelle geschrieben werden soll vektorisiert werden kann?)
(Alternativ würde mir auch eine Beschleunigung des Codes weiterhelfen. Habe schon mit dem Profiler optimiert und soweit möglich verktorisiert. Oder hat jemand ne Idee wie ich eine Schleife in der mehrfach in die selbe Zelle geschrieben werden soll vektorisiert werden kann?)
Möglicherweise, aber dafür müsste man den Code sehen...
_________________
Hi nschlange,
ich hatte gedacht, das andere (Prozessorauslastung) wäre vielleicht leichter zu beantworten. Aber sinnvoller ist vielleicht tatsächlich noch mehr zu vektorisieren.
Also dann versuch ich's mal zu erklären:
Code:
foraxis=1:3 for point=1:n % n sehr groß, u. Umständen > 30000
z1=ZeilenIndex(point,axis); % Index für die Zeile aus einem Array holen
s1=Spaltenindex(point,1,axis); % Index für die Spalte aus einem Array holen
% In Array (Größe ca. 1600x300x3) schreiben: % zu allen Elementen der Zeilen z1 bis (z1+b(axis) der Spalte % s1 soll ein Wegstück ds addiert werden % Für Unterschiedliche Punkte können sich dabei sowohl die % Zeilen als auch die Spalten überlappen, d.h. es wird mehrfach % in eine Zelle (i,j,axis) ein Weg hinzuaddiert
% Das gleiche dann hier nochmal; der Zeilenbereich ist nur um % einen konstanten Wert ( l(axis) ) verschoben, die % Spaltenindizes sind komplett verschieden
Ich hoffe es ist so klar was gemacht werden soll. Ich denke es wäre ein sehr großer Fortschritt die innere Schleife zu eliminieren - die äußere macht denk ich mal nicht so viel aus. Zudem muss das was ich hier dargestellt habe in der Schleife eigentlich dreimal gemacht werden. Dieser Teil benötigt zu Zeit ca 95% der Gesamtrechenzeit meines Programms.
hier mal eine Datei, die die beiden Index-Arrays für ein Beispiel mit n=17713 enthält. Hab eine mat-Datei mal in ein Archiv gepackt um es hochzuladen. Hoffe das ist so ok - wusste nicht wie ich's sonst reinstellen könnte.
Das 'Array' ist effektiv ein Feld in der handles-Struktur meiner GUI welches schon bei Programmstart angelegt (bzw. geladen) wird. Es ist also "preallociert".
Über meine Laufvariable hab ich mir ehrlich gesagt nicht viel Gedanken gemacht - es funktionierte ja. Vielleicht etwas naiv - werd ich mal ändern.
Ansonsten bin ich gespannt ob du ne Lösung dafür hast.
ne, noch nicht wirklich. Wenn ich etwas Zeit hab guck ich noch mal drauf.
_________________
Viele Grüße
nschlange
"Chuck Norris ejakuliert fluessigen Stahl!"
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.