www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Matlab" - if-Schleife in Matlab
if-Schleife in Matlab < Matlab < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

if-Schleife in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 10:59 Mo 30.11.2009
Autor: LN-

Ich habe diese Frage in keinem anderen Forum gestellt.

Ich habe folgende Funktion geschrieben, welche anschließend in Femlab integriert werden soll. Zunächst muss sie allerdings in Matlab laufen.
Das Problem liegt an der if-Schleife. Ich möchte, dass die Funktion für p=0 DPR=D setzt und dann anschließend für alle anderen Werte von p die Funktion berechnet (diese wäre für p=0 (dann ist auch das entsprechende c=0) nicht definiert da 0/0 entstehen würde) . Leider ignoriert Matlab beim testen immer die if-Bedingung und berechnet nur die else-Bedingung, auch wenn ich in der if-Bedingung noch eine neue Variable einführe, damit die andere nicht überschrieben wird, wird diese beim speichern dann nicht gefunden und auch nicht ausgegeben.
Ich weiß nicht, was ich falsch mache, eigentlich hatte ich erwartet, dass dieses Problem total simpel zu lösen sei, aber leider finde ich keine Lösung.

1: function DPR=DPRinp0(c,D,kD,cH,b)
2: %DPRin interpoliert Werte aus Sorptionsisothermen
3: load IsoDaten;
4: kD=0.062;
5: b=9.501e-4;
6: cH=236.06;
7: c=linspace(0,200,250);
8: D=3e-10;
9:
10: p=flinterp1(cref,pref,c,'spline');
11: dpc=flinterp1(cref,pref,c,'spline',1);
12:
13: if p==0 & c==0
14:    DPR=D;
15: else
16:    DPR=(D.*c.*dpc)./p
17: end
18:
19: save DPRinTabelle c DPR p dpc; 



ich bin für jede Hilfe sehr dankbar...

        
Bezug
if-Schleife in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 15:08 Mo 30.11.2009
Autor: hotblack

Hallo,
1:
2: if p==0 & c==0
3:    DPR=D;
4: else
5:    DPR=(D.*c.*dpc)./p
6: end


Kenne mich zwar in Matlab nicht aus, in allen Programmiersprachen die ich kenne, wird ein logisches UND aber als "&&" ausgedrückt, eine Byte-VerUNDung allerdings mit einem einzelnen "&"
Vllt hilft dir das?

Gruß,
hotblack

Bezug
                
Bezug
if-Schleife in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 15:18 Mo 30.11.2009
Autor: LN-

Hm, leider nein, das führt zu einer Fehlermeldung "Operands to the || and && operators must be convertible to logical scalar values"
& ist ein logisches Und
&& ist ein logisches Und (short circuit)
bitand ist Bit-weises Und
aber ich glaube es kann nicht der Fehler an dem Punkt liegen, da er ja fähig ist das zu rechnen, sobald ich if und else vertausche. Er übergeht immer nur das was in if steht. Ich habe auch schon versucht c==0 wegzulassen, da er ja später den DPR-Wert elementweise berechnet und das ja nur noch für p ungleich Null machen soll, fällt ja c=0 weg. Macht aber auch keinen Unterschied.
Trotzdem Danke für die Hilfe!

Kann ich mit if und else überhaupt erreichen, dass er beides macht? Also zuerst für p=0 die if-Bedingung und dann für alle andren p die else Bedinung und dann beides in ein array schreibt? Oder brauche ich da eine andere Form?


Bezug
                        
Bezug
if-Schleife in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 15:32 Mo 30.11.2009
Autor: hotblack

Hallo
> Kann ich mit if und else überhaupt erreichen, dass er
> beides macht? Also zuerst für p=0 die if-Bedingung und
> dann für alle andren p die else Bedinung und dann beides
> in ein array schreibt? Oder brauche ich da eine andere
> Form?

Jetzt verstehe ich, daher auch die Überschrift if-schleife...
Die if-then-else Anweisung ist keine Schleife, d.h. sie wird nur einmal ausgeführt und da wird dann aufgrund der momentanen Werte entschieden.
Ich denke, da muss noch eine for-Schleife drum herum, die von i=0 bis i<=length(p) läuft. Dann kannst du auf die Elemente zugreifen und die Werte abprüfen.(Also immer p[i] oder c[i] bzw. DPR[i], weiß aber nicht ob das in MATLAB so geht, du musst halt auf die Arrayelement zugreifen)
Musst du den Vektor DPR nicht noch irgendwo definieren? Der müsste dann die gleiche Länge haben wie p und c.

Gruß,
hotblack


Bezug
                                
Bezug
if-Schleife in Matlab: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 15:47 Mo 30.11.2009
Autor: LN-

Hallo,

Danke für die Antwort, das werde ich mal ausprobieren!
Durch die elementweise Berechnung .* ./ ist DPR von sich aus gleich groß wie p und c, das erspart die Definition durch Nullen davor und das zusammenfügen in einer weiteren for-Schleife. Allerdings weiß ich nicht, ob ich das elementweise Rechnen erhalten kann, wenn ich mit einer for-Schleife arbeite, die die Zeilen einzeln betrachtet...Momentan ist DPR richtig, bis auf den ersten Wert für Null, da steht leider noch ein NaN drin.

Aber gibt es wirklich keine Funktion, die es schafft das array zu überprüfen, ohne dass ich eine for-Schleife brauche (das kostet Rechenzeit und macht die Sache deutlich komplizierter) und mit der die elementweise Berechnung erhalten bleiben kann?

Bezug
                                        
Bezug
if-Schleife in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 16:37 Mo 30.11.2009
Autor: hotblack

Hey,
> betrachtet...Momentan ist DPR richtig, bis auf den ersten
> Wert für Null, da steht leider noch ein NaN drin.

Wenn das das einzige Problem ist, kannst du doch nach der elementweisen Berechnung das erste Element von DPR auf den Wert setzen den du brauchst.
Also zuerst die Berechnung und dann das erste Element setzen.

Bezug
                                                
Bezug
if-Schleife in Matlab: Frage (überfällig)
Status: (Frage) überfällig Status 
Datum: 16:48 Mo 30.11.2009
Autor: LN-

hmm naja, so einfach ist es nicht, es geht schon um den Fall, dass wenn es eben Null ist oder während der Berechnung irgendwann wieder null ist, korrekt ausgewertet wird. Es handelt sich hier um eine Funktion, die in Femlab eingebunden wird und später für alle Simulationen gelten muss. Deshalb wäre es auch schön, wenn es eine Lösung ohne Schleife gäbe, das würde die Rechenzeiten verkürzen.

Ich habe das Problem momentan so gelöst, deine Idee funktioniert jedenfalls schonmal, vielen Dank! Jetzt kann ich immerhin schonmal die Einbindung in Femlab testen:
1: [mp,np]=size(p) %Größe von p
2: w=1; %Schleifenzähler
3: for w=1:np; %Schleife von 1 bis np
4:     if p(w)~=0 & c(w)~=0 %für p und c ungleich Null gilt:
5:      DPRa=(D*c(w)*dpc(w))/p(w)
6:     else %für p=0 gilt
7:      DPRa=D
8:     end
9: DPR(1,w)=DPRa %Schreibt array für jedes w in die erste Spalte den errechnenten Wert
10: w=w+1 %erhöht Schleifenzähler
11: end 


dennoch wäre es schön, wenn ein Matlab-Profi mir vielleicht helfen könnte, ob es das gibt, was ich scuhe, oder ob ich über die Schleife gehen muss.


Bezug
                                                        
Bezug
if-Schleife in Matlab: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 17:20 Do 03.12.2009
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
        
Bezug
if-Schleife in Matlab: Antwort
Status: (Antwort) fertig Status 
Datum: 10:46 Mi 02.12.2009
Autor: Frasier

Hallo LN-,
das ist aus der Entfernung wieder schlecht zu sagen, da man z.B. die Dimensionen der Variablen nicht kennt.
So wird c==0 nur dann true, wenn ALLE Elemente von c = 0 sind. Das ist bei dir sicher nicht der Fall, denn du gibst c mit linspace ja gerade Werte zwischen 0 und 200. Schon daher kann der erste Zweig der if-Anweisung nie ausgeführt werden.
Ein ähnliche Überlegung kann man auch für p anstellen, aber ich weiß natürlich weder wie groß (Dimension) p ist, noch welcher Wert drin steht. Das müsstest du dann selber nochmal prüfen.

lg
F.

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.mathebank.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]