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

Befehl in mex-File für Realteil

 

Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 28.09.2010, 15:08     Titel: Befehl in mex-File für Realteil
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.09.2010, 12:55     Titel:
  Antworten mit Zitat      
Weiss keiner?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.09.2010, 14:28     Titel: Re: Befehl in mex-File für Realteil
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.09.2010, 15:57     Titel:
  Antworten mit Zitat      
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...
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.09.2010, 18:32     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.09.2010, 20:28     Titel:
  Antworten mit Zitat      
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!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.09.2010, 23:30     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 30.09.2010, 09:08     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 30.09.2010, 12:55     Titel:
  Antworten mit Zitat      
Ok zumindest M_2_PI=Value of 2/ pi hab ich gefunden.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.09.2010, 21:35     Titel:
  Antworten mit Zitat      
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
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.