如何访问 mex 文件中 Matlab 结构数组中的数据
How Do I access data in a Matlab Array of Structures in a mex file
我正在编写 C++ mex 函数以提高较大 matlab 代码的性能。作为 mex 函数的一部分,我试图从在 MATLAB 中创建的结构数组中读取数据。数组中的每一项都包含一个由复数数组组成的结构。我正在编写的代码理想情况下会单独访问数组中的每个结构。
我尝试编写的函数将传递整个数据结构和一个数组索引。使用该信息,我想获得指向该数组索引处的 matlab 结构中复数数组的实部和虚部的指针。
我完全承认我不了解 c/c++ mex 文件中如何读取 MATLAB 结构。
这是我试过的
void read_struct(int i, const mxArray* AoS, double *real, double *imag)
{
/*
read_struct: reads real and imaginary parts of complex number array from
within a Matlab Structure within an array of Structures.
INPUTS: i = index of the structure to be accessed
AoS = Array of Structures
OUTPUTS: real - pointer to real part of complex number array
imag - pointer to imaginary part of complex number array
*/
// Declare pointers to mxArray
const mxArray *p_ph_F1, *p_ph_XF1, *p_ph_F2, *p_ph_YF2, *p_ph_F3, *p_ph_ZF3,
*p_ph_F4, *p_ph_XF4, *p_ph_F5, *p_ph_YF5, *p_ph_F6, *p_ph_ZF6;
// Declare pointers to real and imaginary parts of Matlab Complex values
// Real Parts
double *p_ph_F1_r, *p_ph_XF1_r, *p_ph_F2_r, *p_ph_YF2_r, *p_ph_F3_r, *p_ph_ZF3_r,
*p_ph_F4_r, *p_ph_XF4_r, *p_ph_F5_r, *p_ph_YF5_r, *p_ph_F6_r, *p_ph_ZF6_r;
// Find pointer to correct array cell
const mxArray* ph = mxGetCell(AoS, i);
//Pointers to complex number arrays
p_ph_F1 = mxGetField(ph,0,'ph_F1');
p_ph_XF1 = mxGetField(ph,1,'ph_XF1');
p_ph_F2 = mxGetField(ph,2,'ph_F2');
p_ph_YF2 = mxGetField(ph,3,'ph_YF2');
p_ph_F3 = mxGetField(ph,4,'ph_F3');
p_ph_ZF3 = mxGetField(ph,5,'ph_ZF4');
p_ph_F4 = mxGetField(ph,6,'ph_F4');
p_ph_XF4 = mxGetField(ph,7,'ph_XF4');
p_ph_F5 = mxGetField(ph,8,'ph_F5');
p_ph_YF5 = mxGetField(ph,9,'ph_YF5');
p_ph_F6 = mxGetField(ph,10,'ph_F6');
p_ph_ZF6 = mxGetField(ph,11,'ph_ZF6');
}
目前我在尝试编译代码时遇到以下错误:
错误:参数类型
"int" 与 "const char *"
类型的参数不兼容
我已经阅读了 MATLAB 帮助和示例文件,但正在努力 find/understand 解决方案。
如有任何帮助,我们将不胜感激。
谢谢!
有两件事正在发生:
在C语言中,字符串使用双引号。写 mxGetField(ph,0,"ph_F1")
,而不是 mxGetField(ph,0,'ph_F1')
.
您正在获取元素 ph(1).ph_F1
、ph(2).ph_XF1
等,这可能不是您想要的。我想你打算从同一个结构索引中读取给定的字段:
mxArray const* p_ph_F1 = mxGetField(ph,0,"ph_F1");
mxArray const* p_ph_XF1 = mxGetField(ph,0,"ph_XF1");
mxArray const* p_ph_F2 = mxGetField(ph,0,"ph_F2");
mxArray const* p_ph_YF2 = mxGetField(ph,0,"ph_YF2");
// etc.
请务必测试返回的指针,如果该字段不存在,您将返回 NULL 指针。
我正在编写 C++ mex 函数以提高较大 matlab 代码的性能。作为 mex 函数的一部分,我试图从在 MATLAB 中创建的结构数组中读取数据。数组中的每一项都包含一个由复数数组组成的结构。我正在编写的代码理想情况下会单独访问数组中的每个结构。
我尝试编写的函数将传递整个数据结构和一个数组索引。使用该信息,我想获得指向该数组索引处的 matlab 结构中复数数组的实部和虚部的指针。
我完全承认我不了解 c/c++ mex 文件中如何读取 MATLAB 结构。
这是我试过的
void read_struct(int i, const mxArray* AoS, double *real, double *imag)
{
/*
read_struct: reads real and imaginary parts of complex number array from
within a Matlab Structure within an array of Structures.
INPUTS: i = index of the structure to be accessed
AoS = Array of Structures
OUTPUTS: real - pointer to real part of complex number array
imag - pointer to imaginary part of complex number array
*/
// Declare pointers to mxArray
const mxArray *p_ph_F1, *p_ph_XF1, *p_ph_F2, *p_ph_YF2, *p_ph_F3, *p_ph_ZF3,
*p_ph_F4, *p_ph_XF4, *p_ph_F5, *p_ph_YF5, *p_ph_F6, *p_ph_ZF6;
// Declare pointers to real and imaginary parts of Matlab Complex values
// Real Parts
double *p_ph_F1_r, *p_ph_XF1_r, *p_ph_F2_r, *p_ph_YF2_r, *p_ph_F3_r, *p_ph_ZF3_r,
*p_ph_F4_r, *p_ph_XF4_r, *p_ph_F5_r, *p_ph_YF5_r, *p_ph_F6_r, *p_ph_ZF6_r;
// Find pointer to correct array cell
const mxArray* ph = mxGetCell(AoS, i);
//Pointers to complex number arrays
p_ph_F1 = mxGetField(ph,0,'ph_F1');
p_ph_XF1 = mxGetField(ph,1,'ph_XF1');
p_ph_F2 = mxGetField(ph,2,'ph_F2');
p_ph_YF2 = mxGetField(ph,3,'ph_YF2');
p_ph_F3 = mxGetField(ph,4,'ph_F3');
p_ph_ZF3 = mxGetField(ph,5,'ph_ZF4');
p_ph_F4 = mxGetField(ph,6,'ph_F4');
p_ph_XF4 = mxGetField(ph,7,'ph_XF4');
p_ph_F5 = mxGetField(ph,8,'ph_F5');
p_ph_YF5 = mxGetField(ph,9,'ph_YF5');
p_ph_F6 = mxGetField(ph,10,'ph_F6');
p_ph_ZF6 = mxGetField(ph,11,'ph_ZF6');
}
目前我在尝试编译代码时遇到以下错误:
错误:参数类型 "int" 与 "const char *"
类型的参数不兼容我已经阅读了 MATLAB 帮助和示例文件,但正在努力 find/understand 解决方案。
如有任何帮助,我们将不胜感激。
谢谢!
有两件事正在发生:
在C语言中,字符串使用双引号。写
mxGetField(ph,0,"ph_F1")
,而不是mxGetField(ph,0,'ph_F1')
.您正在获取元素
ph(1).ph_F1
、ph(2).ph_XF1
等,这可能不是您想要的。我想你打算从同一个结构索引中读取给定的字段:mxArray const* p_ph_F1 = mxGetField(ph,0,"ph_F1"); mxArray const* p_ph_XF1 = mxGetField(ph,0,"ph_XF1"); mxArray const* p_ph_F2 = mxGetField(ph,0,"ph_F2"); mxArray const* p_ph_YF2 = mxGetField(ph,0,"ph_YF2"); // etc.
请务必测试返回的指针,如果该字段不存在,您将返回 NULL 指针。