我是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
一切正常,但我想使用它(在我更复杂的代码中)。
是否存在内存分配问题或其他问题?
答案 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 = ∑ // Make out be the same address as sum.