if-Schleife in Matlab < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | 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...
|
|
|
|
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
|
|
|
|
|
Status: |
(Frage) beantwortet | 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?
|
|
|
|
|
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
|
|
|
|
|
Status: |
(Frage) beantwortet | 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?
|
|
|
|
|
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.
|
|
|
|
|
Status: |
(Frage) überfällig | 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.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:20 Do 03.12.2009 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Status: |
(Antwort) fertig | 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.
|
|
|
|