【问题标题】:C++ mex file bug with output带有输出的 C++ mex 文件错误
【发布时间】:2017-06-27 10:18:37
【问题描述】:

我对 mex 文件有点陌生,我正在尝试用 C++ 创建一个函数来加快计算速度。但是我遇到了一些导致 Matlab 崩溃的错误,我不明白为什么。

我尝试调试了很多次,最后发现问题出在主mexFunction之外的函数上,但是我不知道如何解决。我创建了一个示例代码来说明问题:

#include <iostream>
#include <mex.h>

double simplesum (double a, double b){
    double sum; 
    sum = a+b;
    return(sum);
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
    double *a, *b,*out;
    a = mxGetPr(prhs[0]);
    b = mxGetPr(prhs[1]);
    out = mxGetPr(plhs[0]);
    double sum;
    sum=simplesum(*a,*b);
    *out = sum;
}

如果我不调用函数simplesum 一切正常,但我想使用它(在我更复杂的代码中)。

是内存分配有问题还是别的什么问题?

【问题讨论】:

    标签: c++ matlab mex


    【解决方案1】:

    您也可以使用mxGetScalar 直接获取右侧的值。 Out 可以指向双精度值的 1x1 矩阵。

    #include <iostream>
    #include <mex.h>
    
    double simplesum (double a, double b,double *out){
        out[0] = a+b;
    }
    
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
        double a, b, *out;
        plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
        a = mxGetScalar(prhs[0]);
        b = mxGetScalar(prhs[1]);
        out = mxGetPr(plhs[0]);
        simplesum(a,b,out);
    }
    

    【讨论】:

      【解决方案2】:

      内存分配有问题:没有。

      您需要在 MATLAB (mex) 中创建变量,您不能只将变量分配给指针并希望它捕获它。

      在不同的方式中,一种是mxCreateNumericMatrix

      mxArray *mxCreateNumericMatrix(mwSize m, mwSize n, 
        mxClassID classid, mxComplexity ComplexFlag);
      

      所以你的代码需要:

      plhs[0] = mxCreateNumericMatrix(1, 1, mxDOUBLE_CLASS, mxREAL); // "malloc"
      
      out = mxGetPr(plhs[0]); // Make the output pointer to be "out"
      double sum;
      sum=simplesum(*a,*b);
      out = &sum;   // Make out be the same address as sum.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-19
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多