带有输出的 C++ mex 文件错误
C++ mex file bug with output
我对 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
一切正常,但我想使用它(在我更复杂的代码中)。
是内存分配问题还是其他问题?
内存分配有问题:有none.
您需要在 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.
您也可以使用 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);
}
我对 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
一切正常,但我想使用它(在我更复杂的代码中)。
是内存分配问题还是其他问题?
内存分配有问题:有none.
您需要在 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.
您也可以使用 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);
}