MATLAB 中的转换问题 C/MEX

Casting Issue in MATLAB C/MEX

我正在将复数双精度数组从 matlab 传递到 cmex 文件中,以便对它们执行顺序操作。当我将从 mxArray 检索到的数字转换为双精度数时,它似乎误解了代码。

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

我注意到如果我将 %d 替换为 %f 以便 printf 将其读取为浮点数,输出与传入的我的 matlab 变量匹配

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

产量

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

在我看来,数据似乎是以浮点表示形式编码的,但编译器将其视为双精度数,导致在分配给 float 类型时将其强制转换为 float。除此之外,我不知道如何解决这个问题,我们将不胜感激。

%d 说明符与 int 参数(或提升为 int 的内容)以外的任何内容一起使用是未定义的行为。

对于您的第三个示例,强制转换指针不会转换基础数据。您正在将指向 double 的指针分配给指向 float 的指针,并且取消引用是未定义的行为。

来自 Matlab 的数据是一个 double 数组,必须这样处理。如果需要,您可以一次将一个元素转换为另一种类型。