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
数组,必须这样处理。如果需要,您可以一次将一个元素转换为另一种类型。
我正在将复数双精度数组从 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
数组,必须这样处理。如果需要,您可以一次将一个元素转换为另一种类型。