|
|
Befehl in mex-File für Realteil |
|
Achi |

Forum-Guru
|
 |
Beiträge: 250
|
 |
|
 |
Anmeldedatum: 14.04.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2007a
|
 |
|
|
 |
|
Verfasst am: 28.09.2010, 15:08
Titel: Befehl in mex-File für Realteil
|
 |
Hi Leute,
bei einer Berechnung kann ein komplexer Wert in einem mex-File
rauskommen. Ich will aber nur mit dem Realteil weiterrechnen. Wie
ist der Befehl dafür? In C++ wäre es einfach creal.
Vielen DANK
|
|
|
|
|
Achi |
Themenstarter

Forum-Guru
|
 |
Beiträge: 250
|
 |
|
 |
Anmeldedatum: 14.04.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2007a
|
 |
|
|
 |
|
Verfasst am: 29.09.2010, 12:55
Titel:
|
 |
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 29.09.2010, 14:28
Titel: Re: Befehl in mex-File für Realteil
|
 |
Hallo Achi,
bei einer Berechnung kann ein komplexer Wert in einem mex-File
rauskommen. Ich will aber nur mit dem Realteil weiterrechnen. Wie
ist der Befehl dafür? In C++ wäre es einfach creal.
Ich vermute es antwortet niemand, weil sich die Frage nicht beantorten läßt.
Bei einer Berechnung in einer C-Mex-Funktion kannst Du nur mit DOUBLEs und FLOATs rechnen. Ob die Werte real oder imaginär sind, ist in C nicht definiert und auch nicht von Belang.
Demnach hängt es also ganz davon, wie Deine "Berechnung" denn den Real- und Imaginär-Teil speichert. Die Antwort wird dann trivial: Benutze halt einfach nur den Real-Teil.
Wir können aber wirklich nicht wissen, was die von Dir genannte "Berechnung" genau macht und wie sie Ihre berechneten Werte speichert. Falls Du irgendeine BLAS-Routine aufrufst, oder per mexCallMATLAB eine Matlab-Funktion ausführst - das musst Du schon erklären...
Gruß, Jan
|
|
|
Achi |
Themenstarter

Forum-Guru
|
 |
Beiträge: 250
|
 |
|
 |
Anmeldedatum: 14.04.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2007a
|
 |
|
|
 |
|
Verfasst am: 29.09.2010, 15:57
Titel:
|
 |
Brechnet wird es so
Theta wird aus dem m-File bezogen.
Theta=*(mxGetPr(prhs[4]));
Die Berechnung selbst ist wie folgt:
Theta=asin(sin(Theta)*(brechindex[n]/brechindex[n-1]));
weil der Term: (sin(Theta)*(brechindex[n]/brechindex[n-1])
größer als 1 werden kann bekomme ich komplexe Werte.
Aber damit kann ich ja nicht weiterarbeiten...
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 29.09.2010, 18:32
Titel:
|
 |
Hallo Achi,
Zitat: |
Theta wird aus dem m-File bezogen.
Theta=*(mxGetPr(prhs[4]));
|
Nun wäre es noch wichtig zu wissen, welchen Type Theta hat. Ein DOUBLE?
Zitat: |
Die Berechnung selbst ist wie folgt:
Theta = asin(sin(Theta)*(brechindex[n]/brechindex[n-1]));
weil der Term: (sin(Theta)*(brechindex[n]/brechindex[n-1])
größer als 1 werden kann bekomme ich komplexe Werte. |
In C liefert der Befehl ASIN einen skalaren DOUBLE zurück. Da kann nichts imaginär werden. Für Werte ausserhalb +-1.0 wird NaN geantwortet. Wenn Du das abfangen möchtest, musst Du vor dem Aufruf von ASIN das Argument testen.
Matlab kann dynamisch einen Imaginärteil erzeugen, C kann das nicht. Woher hast Du den Eindruck, dass die Antwort von ASIN imaginär sein könnte?
Gruß, Jan
|
|
|
Achi |
Themenstarter

Forum-Guru
|
 |
Beiträge: 250
|
 |
|
 |
Anmeldedatum: 14.04.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2007a
|
 |
|
|
 |
|
Verfasst am: 29.09.2010, 20:28
Titel:
|
 |
Hi Jan und alle anderen,
Theta ist vom Typ double.
Ich hab nur die normale Version geposted.
Ich hab mir ASIND und SIND als Funktion im mex-File geschrieben.
Genauso wie es sie als m-File gibt.
Daher ist die richtige Fkt:
Theta = asind(sind(Theta)*(brechindex[n]/brechindex[n-1]));
Ja ich weiß, du weißt mehr als ich. Daher würde ich mich freuen, wenn du mir sagst was mein Fehler ist!
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 29.09.2010, 23:30
Titel:
|
 |
|
 |
|
Hallo Achi,
Zitat: |
Theta = *(double *) mxGetPr(prhs[4]);
Theta = asind(sind(Theta)*(brechindex[n]/brechindex[n-1]));
|
Ich sehe hier keinen Fehler. Wenn die Formel stimmt, sollte das genauso funktionieren. Es werden keine imaginären Werte auftauchen.
Der einzigen Fehler, den ich sehe:
Zitat: |
bei einer Berechnung kann ein komplexer Wert in einem mex-File rauskommen. |
Nein. Solange Du keinen speziellen Bilbliotheken für Komplexe Zahlen benutzt, sondern nur SIN und ASIN aus the <math.h>-Bibliothek, werden keine imaginären Zahlen auftauchen.
Wenn Du die Werte, bei denen das Ergebnis mathematisch gesehen imaginär werden würde, explizit abfangen möchtest:
double tmp, Theta;
Theta = *(double *) mxGetPr(prhs[4]);
tmp = sind(Theta)*(brechindex[n]/brechindex[n-1]);
if (tmp > 1.0) {
Theta = M_PI_2;
} else if (tmp < -1.0) {
Theta = -M_PI_2;
} else {
Theta = asind(tmp);
}
Ansonsten wird Theta auf NaN gesetzt, wenn tmp aus dem Werte-Bereich fällt.
Ich hoffe, das hilft. Aber ich gebe zu: ihc habe nach wie vor nicht verstanden, wo das Problem oder ein Fehler liegen könnte.
Gruß, Jan
|
|
|
Achi |
Themenstarter

Forum-Guru
|
 |
Beiträge: 250
|
 |
|
 |
Anmeldedatum: 14.04.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2007a
|
 |
|
|
 |
|
Verfasst am: 30.09.2010, 09:08
Titel:
|
 |
Ok funktioniert so wie's sein soll.
Besten Dank!
Noch ne Frage dazu:
Theta = *(double *) mxGetPr(prhs[4]);
*(double *): Was bedeuted das? Theta an sich ist ja kein Pointer, was bedeuted die Notation?
M_PI_2: ist ja bei mir nicht von MIR vordefiniert?
Steht das in einer Bib?
Vielen Dank
|
|
|
Achi |
Themenstarter

Forum-Guru
|
 |
Beiträge: 250
|
 |
|
 |
Anmeldedatum: 14.04.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2007a
|
 |
|
|
 |
|
Verfasst am: 30.09.2010, 12:55
Titel:
|
 |
Ok zumindest M_2_PI=Value of 2/ pi hab ich gefunden.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 30.09.2010, 21:35
Titel:
|
 |
Hallo Achi,
Zitat: |
Theta = *(double *) mxGetPr(prhs[4]);
*(double *): Was bedeuted das? Theta an sich ist ja kein Pointer, was bedeuted die Notation?
M_PI_2: ist ja bei mir nicht von MIR vordefiniert?
|
Das sind Fragen für ein C-Forum. Aber ich habe ja mit solchen Details angefangen. Und dann waren sie auch noch überflüssig...
mxGetPr liefert einen Pointer auf das erste DOUBLE Element des Matlab-Arrays zurück. Deshalb ist:
*(double *) mxGetPr(...)
genau das gleiche wie:
* mxGetPr(...)
nämlich der Wert des ersten DOUBLEs.
Ich hatte offenbar gerade an mxGetData gedacht, dass einen Pointer auf ein void zurück gibt. Dann ist es ordentlicher, den zuerst zu einem Pointer auf einen DOUBLE zu casten, bevor man den Wert kopiert. Das ist z.B. wichtig, wenn das Matlab-Array den Type SINGLE oder UINT8 hat.
M_PI_2 steht in <math.h>.
Gruß, Jan
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|