代码之家  ›  专栏  ›  技术社区  ›  NSZ

带有输出的C++mex文件错误

  •  1
  • NSZ  · 技术社区  · 9 年前

    我试过多次调试,最后我发现问题出在主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 一切都正常,但我想使用它(在我更复杂的代码中)。

    内存分配或其他方面有问题吗?

    2 回复  |  直到 9 年前
        1
  •  2
  •   Gelliant    9 年前

    您还可以使用直接获取右侧值 mxGetScalar

    #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
  •  1
  •   Ander Biguri    9 年前

    您需要在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.