【问题标题】:Creating and Passing of mxArray Data from other functions to Mex gateway function创建 mxArray 数据并将其从其他函数传递到 Mex 网关函数
【发布时间】:2015-05-08 15:48:36
【问题描述】:

好吧,伙计们,我感觉自己好像掉进了兔子洞……

为了构建一个作为 Matlab-Mex 的接口来接收由复杂的 C 结构组成的多个不同消息,我想在不同的函数中创建相应的 Mex-Struct。

是否有可能将包含来自用户定义函数的字段的mxArrays 传递给mexFunction()

我创建了应该在 mexFunctions() 内部调用的函数,这些函数应该将填充的 mxArray 数据类型作为指针传递给 mexFunction(),但这不起作用。

例如

mxArray* createFoo();

或者

void createFoo(mxArray* myData);

mexFunction() 内部,这些createFoo() 函数无法将创建的数据指针传递回函数。在它们内部,数据的创建确实有效,但是它们返回的指针由于例如myData = mxCreateDoubleMatrix().

编译器是Visual Studio 2010,Matlab是2011b。

可以直接写入函数内部的工作区,但这是非常糟糕的风格。

【问题讨论】:

  • 那么,您是否希望在调用 createFoo 结束时让参数指向正确的数据结构?
  • 我想在 createFoo() 中创建正确的 mx-data 结构并返回一个指向该数据结构的正确指针,以便它可以从 mexFunction() 传递到 Matlab。
  • 您需要显示更多代码,但它可能不起作用,因为如果您想修改函数内的指针,您需要将其作为** 或引用传递(@987654333 @)。
  • 您能否详细说明您如何在 createFoo 中创建数据以及如何使用它或签入 mexFunction?
  • 让我看看我是否正确:您定义了mxArray* createFoo() {return mxCreateDoubleMatrix(); },当您在mexFunction() 中调用它时,返回的指针已损坏?希望您在返回指针之前不要在指针上调用 mxDestroyArray()...

标签: c matlab mex


【解决方案1】:

好的,我不应该再问一个没有最小示例的问题。简单的问题是,我忘了return *mxArray...

通过mxArray 的两种可能性都可以正常工作:

A) 返回 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
}

现在可以调用函数并将值返回给 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
}

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 2019-04-26
    • 2012-03-07
    • 2020-12-15
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多