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

Prüfung von Array-Elementen auf Erfüllung von Bedingungen

 

Ratlos

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2010, 16:53     Titel: Prüfung von Array-Elementen auf Erfüllung von Bedingungen
  Antworten mit Zitat      
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. Laughing

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.
Crying or Very sad Kann man das irgendwie beschleunigen?

Herzlichen Dank Embarassed

Code:

function Q_BK = Test(Q_OFF,P_OFF,U_OFF,Q_ON,P_ON,U_ON)

% Bedingung 1: P_OFF>P_ON
Index_1 = 1;
Array_1 = [];

for i = 1:length(Q_OFF)
    [Q_ON1 U_ON1 P_ON1] = offenes_Interval(Q_ON,U_ON,P_ON,P_OFF(i),0.95*P_OFF(i));
    t =length(Q_ON1);
    if ~isempty(Q_ON1)
       Array_1(Index_1:Index_1+t-1,1) = Q_OFF(i);
       Array_1(Index_1:Index_1+t-1,2) = P_OFF(i);
       Array_1(Index_1:Index_1+t-1,3) = U_OFF(i);
       Array_1(Index_1:Index_1+t-1,4) = Q_ON1;
       Array_1(Index_1:Index_1+t-1,5) = P_ON1;
       Array_1(Index_1:Index_1+t-1,6) = U_ON1;
       Index_1 = Index_1+t;
    end
end

if isempty(Array_1)
   error('Keine Punkte gefunden, die Bedingung 1: P_OFF>P_ON erfüllen.');
end

% Bedingung 2: U_OFF<U_ON
Index_2 = 1;
Array_2 = [];

for i = 1:size(Array_1,1)
    if Array_1(i,3)<Array_1(i,6)
       Array_2(Index_2,:) = Array_1(i,:);
       Index_2 = Index_2+1;
    end
end

if isempty(Array_2)
   error('Keine Punkte gefunden, die Bedingung 2: U_OFF<U_ON erfüllen.');
end

% Bedingung 3: I_3^2>0

Array_2(:,7) = Strom_Betrag(Array_2(:,1),Array_2(:,2),Array_2(:,3));
Array_2(:,8) = Strom_Betrag(Array_2(:,4),Array_2(:,5),Array_2(:,6));
h = Array_2(:,2)-Array_2(:,5)-3*R_1*Array_2(:,7).^2-3*R_2*(Array_2(:,8)*ue_2).^2;
Index_3 = 1;
Array_3 = [];
h_3 = [];
for i = 1:length(h)
    if h(i)>0
       Array_3(Index_3,:) = Array_2(i,:);
       h_3(Index_3,1) = h(i);
       Index_3 = Index_3+1;
    end
end

if isempty(Array_3)
   error('Keine Punkte gefunden, die Bedingung 3: I_3^2>0 erfüllen.');
end  

Q_BK = 3*X_1*Array_3(:,7).^2+3*X_2*Array_3(:,8).^2+h_3./R_3*X_3+Array_3(:,4)-Array_3(:,1);

 


function [A B C] = offenes_Interval(A_alt,B_alt,C_alt,c_max,c_min)

Index = 1;

A = [];
B = [];
C = [];

for i = 1:length(A_alt)
    if c_min<C_alt(i)<c_max
       A(Index) = A_alt(i);
       B(Index) = B_alt(i);
       C(Index) = C_alt(i);
       Index = Index+1;
    end
end
       
 


Test.m
 Beschreibung:

Download
 Dateiname:  Test.m
 Dateigröße:  1.93 KB
 Heruntergeladen:  408 mal


Jan*
Forum-Century

Forum-Century


Beiträge: 178
Anmeldedatum: 06.11.09
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 09.03.2010, 17:11     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Ratlos

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2010, 17:20     Titel:
  Antworten mit Zitat      
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. Sad
 
Coja
Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 20.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2010, 17:32     Titel:
  Antworten mit Zitat      
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.

In deiner Funktion
Code:
offenes_Interval

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:

Code:
Array_1(length(Q_ON1),6)=[];

Ein paar Beispieldaten könnten das Überprüfen für uns vereinfachen.
Noch ein Beispiel für Vektoroperationen:
Code:
A=[2 3 0 -3 6];
B=[1 5 -7 6 6];
C=A<B
D=A(~(A==B))
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 09.03.2010, 17:47     Titel:
  Antworten mit Zitat      
Hallo,


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);
     
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Ratlos

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2010, 13:57     Titel:
  Antworten mit Zitat      
Hallo

Ich habe eine Frage zu logischen Indizien.
Zum Beispiel soll die Spalte einer Matrix mit mindenstens ein 2 als Element ausgegeben.
Code:

A = [ 1, 2; 3, 4; 5, 6];
C = (A==2)
B = A(:,C(:,2));          %  B = [1; 3; 5]
D = A(C(:,2),:);          %  D =[1,2]
 


Was habe ich dabei falsch gemacht?
Danke
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.03.2010, 14:26     Titel:
  Antworten mit Zitat      
Hallo
meinst dass nur 2 ausgegeben werden soll?

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]

 
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.