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

'if' Prüfung und Ausgabe von Werten in Vektor

 

kerngehirn
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 23.12.2015, 18:34     Titel: 'if' Prüfung und Ausgabe von Werten in Vektor
  Antworten mit Zitat      
Hi,

wie schaffe ich es eine if-Prüfung von allen Werten in einem Vektor separat durchzuführen und gleichzeitig die Ausgabe zu diesem zu haben?

Ich möchte, dass jeder Wert im Vektor geprüft wird ob eine Bedingung erfüllt ist und dann an der Stelle des Werts in einem neuen Vektor das Ergebnis der if-Prüfung steht.

Code:
x = [1 2 3];
if (x==1)
       y = 1;
   elseif (x==2)
       y = 2;
   else
       y = 3;
end

y


soll also

Code:
y = [1 2 3]


ausgeben.

Das ist aber nicht möglich.

Ich möchte vermeiden jeden Wert des Vektors auszulesen, zu prüfen und einer neuen Variable zuzuordnen und dann aus den Variablen einen neuen Vektor zu machen.

Code:
t = [1 2 3]
x = t(1);
if (x==1)
       y = 1;
   elseif (x==2)
       y = 2;
   else
       y = 3;
end

r(1) = y;

x = t(2);
if (x==1)
       y = 1;
   elseif (x==2)
       y = 2;
   else
       y = 3;
end

r(2) = y;

x = t(3);
if (x==1)
       y = 1;
   elseif (x==2)
       y = 2;
   else
       y = 3;
end

r(3) = y;

r

[code] r = [1 2 3] [/code]


möchte ich daher vermeiden.

Ist das machbar?


Vielen Dank Smile
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.12.2015, 18:51     Titel:
  Antworten mit Zitat      
Hallo,

das kann man mit einer Schleife lösen.

Code:

x = [1 2 3];
y = nan(size(x)); % preallocate um die Schleife zu beschleunigen...zeros statt nan würde auch gehen

for i=1:length(x)
    if (x(i)==1)
       y(i) = 1;
    elseif (x(i)==2)
       y(i) = 2;
    else
       y(i) = 3;
    end
end
 


Zuletzt bearbeitet von DSP am 23.12.2015, 18:53, 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.12.2015, 18:53     Titel:
  Antworten mit Zitat      
Hallo,

logische Indizierung.

Code:
y = 3*ones(size(x)); % Default
y( x == 1) = 1;
y( x == 2) = 2;


Grüße,
Harald

P.S.: Ein Beispiel, in dem man mit [1,2,3] anfängt und als Ergebnis [1,2,3] haben möchte, kann recht verwirrend sein.
Private Nachricht senden Benutzer-Profile anzeigen
 
kerngehirn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 23.12.2015, 19:15     Titel:
  Antworten mit Zitat      
HI,

vielen Dank für die Antworten.

An eine Schleife hatte ich auch schon gedacht.
Da diese Schleife dann allerdings innerhalb einer anderen for-Schleife wäre, und die Vektoren riesig sind, würde die Berechnung ewig dauern.

Logische Indizierung klingt gut. Aber ich bin mir nicht sicher, ob das mit >= und <= und mit Formeln gut funktioniert.

Realisiert werden soll folgendes:

Code:

    if     (CTODepsilon <= 0.00019)
        CTODSpannung = CTODepsilon * Ec;
    elseif (0.00019 < CTODepsilon) & (CTOD <= 0.05)
        CTODSpannung = CTODepsilon * Em * (1-Vf) + CTODepsilon * Ef * Vf;
    elseif (0.05 < CTOD) & (CTOD <= 0.5 * lF)
        CTODSpannung = Pn * Nfn; %Kraft
    elseif (0.5 * lF < CTOD)
        CTODSpannung = 0;
    else
        CTODSpannung = NaN;
    end

 


CTODSpannung soll also am Ende der fertige Vektor sein.
CTODepsilon beinhaltet etwa 3000 Werte im Bereich von 0 bis 3,8.

Könnte das klappen? Ich werde es ausprobieren, aber der Code ist schon ziemlich lang, und bis ich das als Amateur da eingepflegt hab wird dauern. Very Happy
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.12.2015, 19:31     Titel:
  Antworten mit Zitat      
Hallo,

ich sehe für beide Ansätze keinen Grund, warum das nicht klappen sollte.

10 Zeilen Code würde ich jetzt nicht als "ziemlich lang" bezeichnen. Wenn du die Idee verstanden hast, sollte die Umsetzung relativ unproblematisch sein.

Wenn die echte Anwendung so überschaubar ist, kann ich nur empfehlen, bei der Frage auch gleich die echte Anwendung statt eines konstruierten Beispiels mitzuliefern.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 23.12.2015, 19:45     Titel:
  Antworten mit Zitat      
Okay. Dank dir Smile

Mit ziemlich lang meinte ich, der gesamte Code. Das ist nur ein Teil davon.

Bei einer Schleife habe ich wie gesagt Angst, dass der Spaß dann zu lange dauert.
Die erste Schleife dauert schon etwa eine halbe Stunde bis sie durchgerechnet ist. Wenn ich dann in diese Schleife noch eine Schleife mit 3000 Operationen packe, dauert das ja unendlich lang.

Ich habe es jetzt so gemacht:

Code:
   CTODSpannung = NaN*ones(size(CTODepsilon));
    CTODSpannung(CTODepsilon <= 0.00019) = CTODepsilon * Ec;
    CTODSpannung((0.00019 < CTODepsilon) & (CTOD <= 0.05)) = CTODepsilon * Em * (1-Vf) + CTODepsilon * Ef * Vf;
    CTODSpannung((0.05 < CTOD) & (CTOD <= 0.5 * lF)) = Pn * Nfn; %Kraft
    CTODSpannung(0.5 * lF < CTOD) = 0;


Wird das funktionieren? Wenn nicht, wie löse ich das Problem der 2 Bedingungen?
Ich kann es leider noch nicht ausführen, da der Code noch nicht ganz fertig ist.

Danke Smile
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.12.2015, 19:48     Titel:
  Antworten mit Zitat      
Hallo,

sieht gut aus.
Bei Performance-Problemen kann ich nur den Profiler empfehlen, um die zeitkonsumierenden Teile des Codes aufzuspüren und ggf. gezielt verbessern zu können.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.11.15
Wohnort: ---
Version: MATLAB R2015a
     Beitrag Verfasst am: 23.12.2015, 20:08     Titel:
  Antworten mit Zitat      
Was ist der Profiler? Ich kenne nur "Analyze Code"

...


Ich bekomme nun den Fehler
Zitat:
In an assignment A(I) = B, the number of elements in B and I must be the same.


,bei Zeile zwei des oben stehenden Codes.

Alle Vektoren haben die gleiche Länge.

edit: Jetzt ist mir klar warum. Ich muss hinter dem Gleichzeichen natürlich auch nen Wert für die Zeile angeben. Ist aber natürlich so nicht möglich.
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.12.2015, 22:54     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Was ist der Profiler?

Die Frage sollte sich an sich mit Forum, Doku oder Suche in der Hilfe beantworten lassen. Siehe z.B. hier:
http://de.mathworks.com/help/matlab.....mproving-performance.html

Wenn es um Vektoren geht, müssen diese auch auf der rechten Seite entsprechend indiziert werden, also z.B.
Code:
CTODSpannung(CTODepsilon <= 0.00019) = CTODepsilon(CTODepsilon <= 0.00019) * Ec;


Grüße,
Harald
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: 24.12.2015, 14:39     Titel:
  Antworten mit Zitat      
Hallo kerngehirn,

Zitat:
Bei einer Schleife habe ich wie gesagt Angst, dass der Spaß dann zu lange dauert.

Wenn es tatsächlich nur um ein paar Tausend Operationen geht, ist Deine Angst wahrscheinlich unbegründet. Wenn die Ergebnis-Arrays ordentlich pre-allociert sind, berechnet Matlab Schleifen schnell und effizient. Probiere es doch einfach mal aus.

Statt "NAN*ones(...)" schreibt man besser: "NaN(...)".

Gruß, Jan
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.