如何在" mwArray *"之间传输数据?和" mxArray *"?

时间:2017-02-13 17:58:59

标签: c++ matlab wrapper mex mcc

我有一个类的实例,我想使用mexCallMATLAB函数将它传递给函数。

该类最初是在Matlab中,但由于数据在我的C ++包装器中,我使用了这个approach并将数据打包到它。因此,最终对象的类型是mwArray(在Matlab中看到提到的链接和GlobalData类以及在C ++中的globals实例)。但mexCallMATLAB函数使用mxArray *

如何将mwArray *的数据传输到mwArray *?如果类型很简单,可以通过手动传输轻松完成。例如,创建一个mxArray的双数组并手动将数据复制到它。但在这种情况下,数据是一类多个数据字段/类型。

更一般地说,如何将类从C ++包装器传递给Matlab函数?

假设这是Matlab中的类

classdef GlobalData < handle

    properties
        val1
        val2
        val3
    end
end

这是我通过mcc编译的Matlab函数,用于包装类。

function globals = create_globals()

    globals = GlobalData();
    globals.val1 = 2;
    globals.val2 = 5.25;
    globals.val3 = 'data name';
end

这是包含数据的C ++代码。这里我们使用前面的方法创建一个GlobalData实例,并将其传递给Matlab函数myCallback

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    // ...
    mwArray globals;
        try {

            // Pack data to a single Container class of type GlobalData
            create_globals(1, globals);

        } catch (const mwException& e) {
            cerr << e.what() << endl;
            return;
        } catch (...) {
            cerr << "Unexpected error thrown" << endl;
            return;
        }

        int nlhs1 = 1, nrhs1 = 2;
        mxArray *plhs1[1], *prhs1[2];

        // First parameter of myCallback set to a arbitrary double value
        prhs1[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
        *mxGetPr(prhs1[0]) = .6;

        // Here prhs1[1] must set to globals
        // ??? prhs1[1] = globals ???

        mexCallMATLAB(nlhs1, plhs1, nrhs1, prhs1, "myCallback");
    // ...
}

1 个答案:

答案 0 :(得分:0)

您可以使用mxArray *方法提取GetData()

   mwArray *A;
   mxArray *B;

   B = A->GetData();