2016-07-28 102 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