Prüfung von Array-Elementen auf Erfüllung von Bedingungen
Ratlos
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 09.03.2010, 16:53
Titel: Prüfung von Array-Elementen auf Erfüllung von Bedingungen
Hallo
Ich habe erst vor zwei Monaten angefangen, mit Matlab zu programmieren. Also gar keine Erfahrungen. In meinem Umfeld finde ich keine, die mir weiter helfen können.
Deshalb freuere ich mich auf eure wertvollen Tipps.
Seit einigen Tagen arbeite ich an folgendem Code.
Das Durchführen dauert ewig für
size(Q_OFF)= size(P_OFF)=size(U_OFF)= 1*10542
und
size(Q_ON)=size(P_ON)=size(U_ON)=1*1752
Aber solcher Umfang von Daten soll Matlab eigentlich mit links schaffen können.
Kann man das irgendwie beschleunigen?
Herzlichen Dank
Code:
function Q_BK = Test(Q_OFF,P_OFF,U_OFF,Q_ON,P_ON,U_ON)
erstmal ganz allgemein: Arrays vor Schleifen immer vorbelegen. Die Erweiterung eines Arrays benötigt viel Rechenzeit, die man so einsparen kann. Weiterhin kann ich dir nur die Ausführung des Skripts mit dem MATLAB Profiler empfehlen, der dir haargenau sagen kann wie lange sich das Programm in welcher Zeile aufgehalten hat.
Gruß Jan
Ratlos
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 09.03.2010, 17:20
Titel:
Jan* hat Folgendes geschrieben:
Hi,
erstmal ganz allgemein: Arrays vor Schleifen immer vorbelegen. Die Erweiterung eines Arrays benötigt viel Rechenzeit, die man so einsparen kann. Weiterhin kann ich dir nur die Ausführung des Skripts mit dem MATLAB Profiler empfehlen, der dir haargenau sagen kann wie lange sich das Programm in welcher Zeile aufgehalten hat.
Gruß Jan
Danke für deine Antwort.
Aber wie meinst du mit dem Vorbelegen? Am Anfang wusste ich noch nicht, wie groß das Array wird.
Hallo.
Du verwendest sehr viele Schleifen, daher kann sich der Rechenaufwand erhöhen. Vielleicht könntest du einige Schleifen durch Vektoroperationen ersetzen, das geht wesentlich schneller.
solltest du bei der If-Bedingung mal eine UND-Verknüpfung einfügen.
Wie bereits erwähnt wurde, solltest du auch die Arrays vorher festlegen:
Also in der Funktion test:
ich hab auf der Schnelle nur die letzte Funktion überflogen:
1) Vergleich c_min<C_alt(i)<c_max ist falsch, es wird von links nach rechts ausgewertet z.B. 2< 3 < 2 Llefert TRUE(1), Sollte aber FALSE(0) sein (Zuerst 2<3 wird ausgewertet => welche eine Eins(TRUE) zurück liefert, dann Wird nicht 3 sondern 1 mit 2 verglichen 1<2=> TRUE)
2) benutze mehr logische Indizien statt schleifen, so z.B konnte man deine Funktion vereinfachen
Code:
function[A B C] = offenes_Interval(A_alt,B_alt,C_alt,c_max,c_min)
% logische Indizien entstehen beim vergleichen
pos = c_min<C_alt & C_alt <c_max
A = A_alt(pos);
B = B_alt(pos);
C = C_alt(pos);
Indizien beziehen sich auf komplette Matrix
z.B C= A==2 bedeutet dass jede Postion in Matrix mit 2 verglichen wird
Dadurch wird für jede Position entweder True (1) oder False (0) Ergebnis angelegt.
C=
0 1
0 0
0 0
Jetzt schaut Aufruf A(C), wo true-werte sind und gibt nur diese aus
Code:
A = [1, 2; 3, 4; 5, 6];
C = A==2
B = A(C)% B = [2]
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.