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

Posted

技术标签:

【中文标题】如何在“mwArray *”和“mxArray *”之间传输数据?【英文标题】:How can transfer data between "mwArray *" and "mxArray *"? 【发布时间】:2017-02-13 17:58:59 【问题描述】:

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

该类最初在 Matlab 中,但由于数据在我的 C++ 包装器中,所以我使用了这个 approach 并将我的数据打包到其中。因此最终对象的类型是mwArray(看提到的链接和GlobalData 类,它在Matlab 中,globals 实例在C++ 中)。但是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");
    // ...

【问题讨论】:

请出示代码。我不是通灵者。 这是一个错字“如何将 mwArray * 转换为 mwArray *?” ? @RichardCritten 我的意思是当 mwArray 的类型不是像 intdouble 这样的简单数据类型时,如何将 mwArray 复制到 mxArray。 @VaibhavBajaj 代码已添加。 【参考方案1】:

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

   mwArray *A;
   mxArray *B;

   B = A->GetData();

【讨论】:

GetData 方法需要两个输入。 buffersize。因此B = A-&gt;GetData(); 必须更改为A-&gt;GetData(B, sizeof(A)); 但是这段代码得到cannot convert argument 1 from 'mxArray *' to 'mxDouble *'

以上是关于如何在“mwArray *”和“mxArray *”之间传输数据?的主要内容,如果未能解决你的问题,请参考以下文章

在vc6.0中如何使用mwArray这个结构体啊,这个结构体是matlab中的数组,我用的matlab2009

我应该如何将数据传递给 mexFunction 的 mxArray *plhs[] 以便在 Matlab 中获得其输出?

C#:MWArray 和获取类的实例

mwArray和cv::Mat转化函数 20170812

C#&MatLab:我是不是需要 MCR 才能在任何计算机上运行 MWArray.dll?

Matlab/Mex:mxarray.h 中的转换警告