2016-07-28 110 views
0

我將一個複雜的雙精度數組從matlab傳遞到一個cmex文件,以便對它們執行一個順序操作。當我將從mxArray中檢索到的數字轉換爲double時,似乎是錯誤地解釋了代碼。在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++; 
} 

這會產生非常高的值,例如下面

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

我發現,如果我有一個%f,這樣的printf把它讀成一個浮點數更換%d的一個,輸出符合我的即在

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

被傳遞MATLAB可變息率

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

這是正確的。

但是,如果我嘗試將指針的類型更改爲浮點型,我會再次得到不正確的答案。

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++; 
} 

息率

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

對我來說,它看起來好像數據是通過在浮點表示編碼的到來,而是由編譯器看作是一個雙,使其被強制轉換爲浮動當分配給浮點類型時。除此之外,我不知道如何解決這個問題和幫助,將不勝感激。

回答

0

使用%d說明符與除參數int以外的任何內容(或推廣到int的東西)都是未定義的行爲。

對於第三個示例,投射指針不會轉換基礎數據。您正在爲指向float的指針分配一個指向double的指針,並且取消引用是未定義的行爲。

來自Matlab的數據是一個數組double s,必須這樣處理。如果需要,可以將元素一次轉換爲另一種類型。

+0

我對C語言的理解肯定比我想象的要好得多,謝謝。 – Bwood94