创建 mxArray 数据并将其从其他函数传递到 Mex 网关函数
Creating and Passing of mxArray Data from other functions to Mex gateway function
好吧伙计们,我感觉好像掉进了兔子洞...
要构建一个接口作为 Matlab-Mex 来接收由复杂的 C 结构组成的多个不同消息,我想在不同的函数中创建相应的 Mex-Structs。
是否可以通过某种方式将包含用户定义函数字段的 mxArrays
传递给 mexFunction()
?
我创建了应该在 mexFunctions()
内部调用的函数,这些函数应该将填充的 mxArray
数据类型作为指针传递给 mexFunction()
,但这没有用。
例如
mxArray* createFoo();
或
void createFoo(mxArray* myData);
在 mexFunction()
内部,这些 createFoo()
函数无法将创建的数据指针传递回函数。在它们内部,数据的创建确实有效,但是它们返回的指针神秘地发生了变化,例如。 myData = mxCreateDoubleMatrix()
.
编译器是Visual Studio2010,Matlab是2011b。
在函数内部直接写入工作空间是可以的,但那是非常糟糕的风格。
好吧,我再也不会问一个没有最小例子的问题了。简单的问题是,我忘记了 return
*mxArray
...
通过 mxArray
的两种可能性都可以正常工作:
A) Return mxArray*
mxArray* createFoo()
{
mxArray* myArray;
myArray = mxCreateDoubleMatrix(1,1,mxREAL);
*mxGetPr(myArray) = 3;
mexPrintf("*mxGetPr(myArray)= %f\n", *mxGetPr(myArray)); // 3
return myArray;
}
B) 引用 mxArray **
void createFooReference(mxArray** myArray)
{
*myArray = mxCreateDoubleMatrix(1,1,mxREAL);
*mxGetPr(*myArray) = 4;
mexPrintf("Pointer: *mxGetPr(*myArray)= %f\n", *mxGetPr(*myArray)); // 4
}
现在可以将函数和 return 值调用到 Matlab:
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray prhs[])
{
mxArray *mexA, *mexB;
mexA = createFoo();
plhs[0] = mexA; // 3
createFooReference(&mexB)
plhs[1] = mexB; // 4
}
好吧伙计们,我感觉好像掉进了兔子洞...
要构建一个接口作为 Matlab-Mex 来接收由复杂的 C 结构组成的多个不同消息,我想在不同的函数中创建相应的 Mex-Structs。
是否可以通过某种方式将包含用户定义函数字段的 mxArrays
传递给 mexFunction()
?
我创建了应该在 mexFunctions()
内部调用的函数,这些函数应该将填充的 mxArray
数据类型作为指针传递给 mexFunction()
,但这没有用。
例如
mxArray* createFoo();
或
void createFoo(mxArray* myData);
在 mexFunction()
内部,这些 createFoo()
函数无法将创建的数据指针传递回函数。在它们内部,数据的创建确实有效,但是它们返回的指针神秘地发生了变化,例如。 myData = mxCreateDoubleMatrix()
.
编译器是Visual Studio2010,Matlab是2011b。
在函数内部直接写入工作空间是可以的,但那是非常糟糕的风格。
好吧,我再也不会问一个没有最小例子的问题了。简单的问题是,我忘记了 return
*mxArray
...
通过 mxArray
的两种可能性都可以正常工作:
A) Return mxArray*
mxArray* createFoo()
{
mxArray* myArray;
myArray = mxCreateDoubleMatrix(1,1,mxREAL);
*mxGetPr(myArray) = 3;
mexPrintf("*mxGetPr(myArray)= %f\n", *mxGetPr(myArray)); // 3
return myArray;
}
B) 引用 mxArray **
void createFooReference(mxArray** myArray)
{
*myArray = mxCreateDoubleMatrix(1,1,mxREAL);
*mxGetPr(*myArray) = 4;
mexPrintf("Pointer: *mxGetPr(*myArray)= %f\n", *mxGetPr(*myArray)); // 4
}
现在可以将函数和 return 值调用到 Matlab:
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray prhs[])
{
mxArray *mexA, *mexB;
mexA = createFoo();
plhs[0] = mexA; // 3
createFooReference(&mexB)
plhs[1] = mexB; // 4
}