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

Berechnung einer neuen Variable (if bzw. elseif)

 

cpo
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2010, 11:17     Titel: Berechnung einer neuen Variable (if bzw. elseif)
  Antworten mit Zitat      
Hallo zusammen,

folgendes Problem:
Ich habe zwei Matritzen (a und b) mit positiven und negativen Werten. Aus beiden möchte ich nun eine neue Matrix (c) erstellen, für deren Berechnung folgende Bedingungen gelten sollen:

Code:

a=(Beispiel1)
b=(Beispiel2)
c=
if a>=0,b>=0
     c=abs(b-a)
elseif a>=0,b<0    
         c=a
elseif a<0,b>=0
         c=a
elseif a<0,b<0
         c=-abs(b-a)
end
 

die Matritzen a und b erscheinen zwar im Workspace, Matrix c wird jedoch nicht erstellt.

Ich hoffe das mir jeamand bei meinem Problem helfen kann.
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.03.2010, 11:39     Titel:
  Antworten mit Zitat      
Hallo

so ist es falsch, Vergleiche in Bedingung müssen verknüpft sein
(and, or, xor, &,&&, |, ||)
Code:

% Komma dient als Trenner zwischen Anweisungen
% also heißt hier nur wenn a>=0  dann b >=0
if a>=0, b>=0
end
 


deine Bedingungen sind noch nicht ganz klar,

a >= 0, b >= 0 -- Heißt das z.b , wenn a und b größer?
wenn a oder b größer?

Da es Matrizen sind, sollen es alle Elemente >= 0 sein (all-Befehl) oder reicht nur Ein Element der >= 0 ist (any-Befehl)?
Das ist wichtig,
da die Bedingung sonst nach letztem Element entschieden werden.

Code:

a = round(rand(2)*10)
b = round(rand(2)*10)

if all( and(a >= 0, b >= 0) )
   c  = abs(b-a)
elseif all( and(a >= 0, b < 0) )
   c = a
elseif all( and(a < 0, b >= 0) )
   c = a
elseif all( and(a < 0, b < 0) )
   c = -abs(b-a)
end
 


Zuletzt bearbeitet von denny am 05.03.2010, 11:41, 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: 05.03.2010, 11:39     Titel:
  Antworten mit Zitat      
Hallo,

logische Bedingungen müssen mit & oder && statt , verknüpft werden.
Das dürfte das Problem sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2010, 11:44     Titel:
  Antworten mit Zitat      
Bekommst du eigentlich Fehlermeldungen, wenn du das so ausführst? Normalerweise sollte er spätestens bei "c=" aussteigen und dann ist klar, dass du c nicht siehst.

Ansonsten wundern mich die Kommas in deinen if-Ausdrücken. In Matlab kannst du mehrere Befehle in eine Zeile schreiben und sie duch Kommas trennen, z.B.
Code:

A=1, B=2
 

ist das gleiche wie
Code:

A=1
B=2
 


Somit macht "if a>=0, b>=0" die Prüfung ob a>=0 ist und versucht dann das Kommando b>=0 auszuführen.
Ich vermute, dass du die Bedingungen "ver-und-en" willst. Somit sollte das Ganze "if (a>=0) & (b>=)" heißen.

Dein Code würde also so aussehen:
Code:

a=[1 2; 3 4];
b=[5 6; 7 8];

if (a>=0) & (b>=0)
     c=abs(b-a)
elseif a>=0 & b<0    
         c=a
elseif a<0 & b>=0
         c=a
elseif a<0 & b<0
         c=-abs(b-a)
end
 


So funktioniert das Berechnen von c prima. Allerdings noch ein Hinweis zu den Bedingungen (nur für den Fall, dass es nicht so gewollt ist):
Ein "a>=0" prüft, ob alle Elemente in a größer oder gleich 0 sind. Ist dies der Fall wird das Ergebnis als wahr angesehen. Für a=[-1 2] ist keine deiner Bedingungen wahr, da nie alle Elemente in a gleichzeitig größer, kleiner oder gleich 0 sind. Somit gibt es Fälle, in denen du NIE ein c erhalten wirst!


Edit: Hups! Zu langsam! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2010, 12:14     Titel:
  Antworten mit Zitat      
ok, vielleicht ist mein Problem noch nicht ganz klar geworden, ich versuche es mal genauer zu beschreiben:

ich möchte aus den zwei Matrizen a und b ( je 511 Zeilen und 600 spalten) eine Matrix c erstellen.

Für die Matrix c soll gelten:

wenn der Wert einer bestimmten Zelle (z.B. A1) in a >=0 ist und in der gleichen Zelle von b >=0 ist, soll für diese zelle in der neue Matrix (c) die Formel c=abs(b-a) angewendet werden.

u.s.w. für alle übrigen 4 Bedigungen
 
cpo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2010, 12:16     Titel:
  Antworten mit Zitat      
Da war ich wohl beim vorherigen Eintrag als Gast eingelogt...sry
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.03.2010, 12:47     Titel:
  Antworten mit Zitat      
Wenn Vergleichen und Verändern Elementweise passieren soll, dann ist IF falsch an dieser Stelle.

Da musst du direkt am Matrix operieren.

Code:

a   = round(rand(5,10)*10)
b   = round(rand(5,10)*10)


c= zeros(size(a));

% erste Bedingung
bed      = and(a >= 0, b >= 0)
c(bed)  = abs(b(bed)-a(bed))

% zweite Bedingung
bed      = and(a >= 0, b < 0)
c(bed) = a(bed)

% dritte Bedingung
bed      = and(a < 0, b >= 0)
c(bed) = a(bed)

% vierte Bedingung
bed      = and(a < 0, b < 0)
 c(bed) = -abs(b(bed)-a(bed))

 
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: 05.03.2010, 13:41     Titel:
  Antworten mit Zitat      
Hallo,

grundsätzlich stimme ich denny zu. Als Ergänzung: statt
Code:
bed      = and(a >= 0, b >= 0)

könnte man auch
Code:
bed      = (a >= 0 & b >= 0)

verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.03.2010, 13:49     Titel:
  Antworten mit Zitat      
Hallo Harald

sterben etwa and/or-Funktionen aus?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan*
Forum-Century

Forum-Century


Beiträge: 178
Anmeldedatum: 06.11.09
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 05.03.2010, 14:03     Titel:
  Antworten mit Zitat      
Hallo,

da im Endeffekt vermuktlich die selbe 'and' Funktion aufgerufen wird, wohl eher nicht Wink

Ich finde Haralds Variante von der Lesbarkeit allerdings auch etwas besser.

Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
cpo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2010, 14:19     Titel:
  Antworten mit Zitat      
Die Lösung von denny funktioniert!

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.03.2010, 14:21     Titel:
  Antworten mit Zitat      
Nein Jan,
es liegt nicht wirklich an Lesbarkeit, weil in manchen Situationen kann eine Variante viel lesbarer sein, sondern wegen wie in Alltag Verknüpfungen gebraucht werden.
Man sagt ja 10 ist größer 8 und 10 ist größer 7.

Also wenn du wegen Verständnis meinst, ist es besser die Harald's Variante zu benutzen, da bin ich mit dir komplett einverstanden.

PS: Persönlich benutze ich schon Harald's Variante, nur wenn Mlint
mir es markiert, setzte ich halt diese Variante um.
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: 05.03.2010, 15:41     Titel:
  Antworten mit Zitat      
Hallo denny,

natürlich sterben sie nicht aus. Es ging mir wirklich nur um bessere Lesbarkeit.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.03.2010, 18:14     Titel:
  Antworten mit Zitat      
Alles Klar!

Bin mit euch Einverstanden!
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.