2016-07-28 29 views
0

Ich übergebe ein Array von komplexen Doubles von Matlab in eine Cmex-Datei, um eine sequenzielle Operation auf ihnen durchzuführen. Wenn ich die aus dem mxArray abgerufene Zahl in ein Double umwandele, scheint es den Code falsch zu interpretieren.Casting-Problem in MATLAB C/MEX

double *Xr, *Xi; 
Xr = mxGetPr(IN_0); 
Xi = mxGetPi(IN_0); 
for(i = 1; i < 20; i++){ 
    printf("%d: %d+i%d\n",i,*Xr,*Xi); 
    Xr++;Xi++; 
} 

Daraus ergibt sich eine sehr hohe Werte wie die, die

15: -803610318+i-1940584014 
16: 1832649449+i300289408 
17: -1676226884+i1653608050 
18: -88066604+i-2135293182 

ich, wenn ich die %d mit einem %f so ersetzen bemerkt folgt, dass printf es als Fließkommazahl liest, entspricht die Ausgabe meiner Variable, die in Matlab

printf("%d: %f+i%f\n",i,*Xr,*Xi); 

geben wird erbringt

15: -0.000538+i0.000221 
16: -0.000602+i0.000596 
17: 0.000550+i-0.000179 
18: -0.000371+i-0.001420 

Dies ist korrekt.

Wenn ich jedoch versuche, den Typ meines Zeigers zu ändern, bekomme ich die falsche Antwort erneut.

float *Xr, *Xi; 
Xr = mxGetPr(IN_0); 
Xi = mxGetPi(IN_0); 
for(i = 1; i < 20; i++){ 
    printf("%d: %f+i%f\n",i,*Xr,*Xi); 
    Xr++;Xi++; 
} 

Yields

15: 4596027085627908600000000000000.000000+i-0.000000 
16: -0.392485+i0.362957 
17: -82893360.000000+i0.000000 
18: 0.412054+i-0.383178 

Für mich sieht es aus, als ob die Daten, die durch in einer Gleitkommadarstellung codiert kommen, sondern wird vom Compiler als doppelt gesehen, dass es zu schweben gegossen werden wenn es einem Float-Typ zugewiesen ist. Ansonsten weiß ich nicht, wie ich dieses Problem lösen soll und Hilfe wäre willkommen.

Antwort

0

Mit einem %d-Spezifizierer mit etwas anderem als einem int-Argument (oder etwas, das zu int fördert) ist undefiniertes Verhalten.

Für Ihr drittes Beispiel konvertiert Casting Pointers die zugrunde liegenden Daten nicht. Sie weisen einen Zeiger auf double einem Zeiger auf float zu, und Dereferenzierung das ist undefiniertes Verhalten.

Die Daten, die von Matlab kommen, sind ein Array von double s und müssen auf diese Weise behandelt werden. Wenn Sie möchten, können Sie die Elemente einzeln in einen anderen Typ konvertieren.

+0

Mein Verständnis von C ist definitiv viel wackeliger als ich dachte, danke. – Bwood94