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

logische Indizierung

 

thomas0815
Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2010, 17:26     Titel: logische Indizierung
  Antworten mit Zitat      
Hallo zusammen,

ich möchte folgenden Ausdruck über logische Indizierung formulieren, damit das alles etwas schneller geht. Aber mir fehlt hier der Ansatz

Code:
for i=1:n
    for j=1:T
       
      if G_i(i,j)/Cap_Max<=1 &  G_i(:,j)/Cap_Max>=0.5
     
        i_out(i,j)=1;

    elseif G_i(i,j)/Cap_Max<0.5 & G_i(:,j)/Cap_Max>=0.2
   
        i_out(i,j)=0.6;
    elseif G_i(i,j)/Cap_Max<0.2 & G_i(:,j)/Cap_Max>=0

       i_out(i,j)=0.25 ;

end
end


Ich habe für die erste if-Anweisung folgenden Ansatz, aber der funktioniert so nicht:

Code:
l=(reshape((G_i(:,j)/Cap_Max),n,j));
        ind1=(l(:,j)<=1 && >= 0.5);


weil ich die und-bedingung da nicht mit rein bekomme.

Wenn jemand Hinweise hast, dann wäre ich dafür sehr dankbar.

Viele Grüße,
Thomas
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: 22.09.2010, 18:03     Titel:
  Antworten mit Zitat      
Hallo,

erstmal Rückfragen:
Ist mit
Code:
G_i(:,j)/Cap_Max>=0.5
gemeint, dass alle Elemente der Spalte diese Bedingung erfüllen sollen?
Was soll mit den i_out(i,j) passieren, die nicht explizit belegt werden?
Hast du i_out außerhalb der Matrix vorbelegt (z.B. mit zeros)?

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

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 09:29     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort. Ja, mit dem ersten Ausdruck sollen jedes Element der Spalte überprüft werden, ob die Bedingung erfüllt ist.

i_in und i_out sind mit zeros vorbelegt.

wenn jetzt z.B. ein Element von G_i(:,j die Bedingung G_i(i,j)/Cap_Max<=1 & G_i(:,j)/Cap_Max>=0.5 erfüllt, dann soll in i_out(i,j) der Wert 0.25 stehen.

Ist es jetzt etwas verständlicher?

Viele Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.09.2010, 11:42     Titel: Re: logische Indizierung
  Antworten mit Zitat      
Hallo Thomas,

also meinst Du statt:
Zitat:
Code:

      if G_i(i,j)/Cap_Max<=1 &  G_i(:,j)/Cap_Max>=0.5
 

Code:

      if (G_i(i,j)/Cap_Max <= 1) && all(G_i(:,j)/Cap_Max >= 0.5)
 

Verstehe ich das richtig?

Dann könntest Du die Vektoren aus den FOR-Schleifen herausnehmen und statt der Indices i und j einfügen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 14:01     Titel:
  Antworten mit Zitat      
Hallo,

nein, der obere Ausdruck ist richtig. Es soll nicht für alle Elemente des Vektors >= 0.5 gelten, sondern für jedes einzelne Element des Vektors einzeln geprüft werden, ob die Bedingung erfüllt ist.

Viele Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.09.2010, 14:49     Titel: Re: logische Indizierung
  Antworten mit Zitat      
Hallo Thomas,

dann verstehe ich Dein Programm gar nicht, sorry.

Du möchtest also, dass die IF Bedingung ein Vektor ist. Dann wird in Matlab implizit ein ALL ausgeführt:
Code:
if G_i(i,j)/Cap_Max<=1 &  G_i(:,j)/Cap_Max>=0.5

Meinst Du vielleicht:
Code:
if G_i(i,j)/Cap_Max<=1 &  G_i(i,j)/Cap_Max>=0.5


Zitat:
Ich habe für die erste if-Anweisung folgenden Ansatz, aber der funktioniert so nicht:
Code:

  l = reshape((G_i(:,j)/Cap_Max),n,j);
  ind1=(l(:,j)<=1 && >= 0.5);
 

Schon die erste Zeile sollte nicht funktionieren: G_i(:, j) ist ein [nx1] Vektor, der sich nicht mit RESHAPE zu einer Matrix aufblähen läßt. Der &&-Operator funktioniert auch nur mit Skalaren.

Also lass mich noch mal von vorne anfangen:
Code:

i_out = zeros(n, T);  % Pre-allocate!!! Welchen Wert brauchst Du?

% Nur einmal dividieren!
% Im worst-case dividierst Deine Version n*T*3 mal...
G2 = G_i / Cap_Max;

for i=1:n
    for j=1:T
      a = G2(i,j);  % Skalar
      b = G2(:,j);  % [n x 1] Vektor

      % Wann genau soll nun
      if G2(i,j) <= 1 && ????
         i_out(i,j) = 1;
      % etc. gesetzt werden?
      end
end
 

Gruß, Jan

Zuletzt bearbeitet von Jan S am 23.09.2010, 16:33, insgesamt einmal bearbeitet
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: 23.09.2010, 15:45     Titel:
  Antworten mit Zitat      
Hallo,

nochmal zur Klarheit: Meinst du wirklich
Code:
if G_i(i,j)/Cap_Max<=1 &  G_i(:,j)/Cap_Max>=0.5

oder
Code:
if G_i(i,j)/Cap_Max<=1 &  G_i(i,j)/Cap_Max>=0.5


Ob an der einen Stelle ein i oder ein : steht, macht einen großen Unterschied!

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.