【问题标题】:Return Double Complex Array in MEX file (Matlab)在 MEX 文件中返回双复数数组(Matlab)
【发布时间】:2021-04-14 09:43:12
【问题描述】:

我对 C/C++ 编码中的 MEX 文件有疑问。 我需要将一个双复数数组返回给 Matlab,但我无法做到这一点,也找不到有关它的信息。我尝试了一些代码来展示我的代码:

double complex output[nSymb];
nlhs = 1;
plhs[0] = mxCreateDoubleMatrix(nSymb,(mwSize)nlhs,mxCOMPLEX);

// 1º option
plhs[0] = output;
// 2º option
memcpy(plhs, output, nSymb * sizeof(double complex));
// 3º option
plhs = output;

提前谢谢你。

【问题讨论】:

  • 我不知道 MEX,但在 C++ 中,我希望使用 std::complex<double> 类型。此外,memcpy 具有目标参数 first 和源参数 secondoutput 这个名字表明你已经交换了它们。此外,plhs[0] 在您的代码中分配了两次。为什么?最后,plhs = output;memcpy 之后?这看起来真的很混乱。

标签: c++ c matlab mex


【解决方案1】:

您提到了 C++,所以我展示了一个将 std::vector<double> 复制到 MxArray 对象的示例,同样可以应用于 C 样式的数组:

mxArray* CreateDoubleArray(const std::vector<double>& d)
{
    mxArray* m = mxCreateDoubleMatrix(d.size(), 1, mxComplexity::mxReal); // mxComplexity::mxCOMPLEX 
    double* pm = mxGetDoubles (m); // mxGetComplexDoubles
    
    for (size_t i=0; i<d.size(); i++)
    {
        pm[i] = d[i];
    }
    
    return m;
}

// ...
// Return value for the Mex:
plhs[0] = CreateDoubleArray(stdVecObj);

您可以将向量的value_type 更改为std::complex,并应用cmets 中建议的更改来处理复杂类型而不是双精度类型。 mxGetComplexDoubles 返回一个 MxDOUBLE_CLASS* documented here(它只是一个具有 mxDouble 类型的实部和虚部的结构)。

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多