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

时间:2017-06-27 10:18:38

标签: c++ matlab mex

我是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一切正常,但我想使用它(在我更复杂的代码中)。

是否存在内存分配问题或其他问题?

2 个答案:

答案 0 :(得分:2)

您还可以使用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);
}

答案 1 :(得分:1)

内存分配存在问题:没有。

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