我正在写一个调用conv2
函数的mex文件。这mex
文件将得到一个大小为(M, N)
的图像,并使用conv2
多次应用卷积。将mxArray传递给mexCallMatlab失败
#include "mex.h"
void myconv(mxArray *Ain, mxArray *Kernel, mxArray *&Aout)
{
mxArray *rhs[3];
rhs[0] = mxCreateNumericMatrix(0, 0, mxDOUBLE_CLASS, mxREAL);
rhs[1] = mxCreateNumericMatrix(0, 0, mxDOUBLE_CLASS, mxREAL);
rhs[2] = mxCreateString ("same");
double *ainPtr = mxGetPr(Ain );
mxSetPr(rhs[0], ainPtr );
mxSetM (rhs[0], mxGetM(Ain) );
mxSetN (rhs[0], mxGetM(Ain) );
double *kernelPtr = mxGetPr(Kernel);
mxSetPr(rhs[1], kernelPtr );
mxSetM (rhs[1], mxGetM(Kernel) );
mxSetN (rhs[1], mxGetN(Kernel) );
mexCallMATLAB(1, &Aout, 3, rhs, "conv2");
mxSetPr(rhs[0], NULL);
mxSetPr(rhs[1], NULL);
}
void myconv_combine(mxArray *Ain, mxArray *&Aout)
{
mxArray *mask = mxCreateDoubleMatrix(1, 5, mxREAL);
double *maskPtr = mxGetPr(mask);
maskPtr[0] = 0.05;
maskPtr[1] = 0.25;
maskPtr[2] = 0.4;
maskPtr[3] = 0.25;
maskPtr[4] = 0.05;
mxArray *maskTranspose = mxCreateDoubleMatrix(0, 0, mxREAL);
mxSetPr(maskTranspose, maskPtr );
mxSetM (maskTranspose, mxGetN(mask));
mxSetN (maskTranspose, mxGetM(mask));
mxArray *AinConvolved = mxCreateDoubleMatrix((mwSize)mxGetM(Ain), (mwSize)mxGetN(Ain), mxREAL);
double *AinConvolvedPtr = mxGetPr(AinConvolved);
myconv(Ain, mask, AinConvolved);
// Some modifications.
mxArray *Temp = mxCreateDoubleMatrix((mwSize)mxGetM(Ain), (mwSize)mxGetN(Ain), mxREAL);
double *TempPtr = mxGetPr(Temp);
for(int i = 0; i < (mwSize)mxGetM(Ain)*(mwSize)mxGetN(Ain); i++)
TempPtr[ i ] = 2.0*AinConvolvedPtr[ i ];
// Some other convolution.
mxArray *TempConvolved = mxCreateDoubleMatrix((mwSize)mxGetM(Ain), (mwSize)mxGetN(Ain), mxREAL);
double *TempConvolvedPtr = mxGetPr(TempConvolved);
myconv(Temp, maskTranspose, TempConvolved);
// Some other modifications.
double *AoutPtr = mxGetPr(Aout);
for(int i = 0; i < (mwSize)mxGetM(Ain)*(mwSize)mxGetN(Ain); i++)
AoutPtr[ i ] = 2.0*TempConvolvedPtr[ i ];
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mxArray *Ain = mxCreateDoubleMatrix(100, 100, mxREAL);
mxArray *Aout = mxCreateDoubleMatrix(100, 100, mxREAL);
myconv_combine(Ain, Aout);
}
在我的实际代码,当它到达行:我不知道为什么发生这种情况,不幸的是我不能重复在我提供的示例代码相同的错误
myconv(Temp, maskTranspose, TempConvolved);
MATLAB崩溃以上。在我的实际代码,图像是由行成功卷积:
myconv(Ain, mask, AinConvolved);
但是,只要它想申请第二卷积:
myconv(Temp, maskTranspose, TempConvolved);
它崩溃,当我调试它,它发生当mexCallMATLAB
被调用时myconv
函数。 Temp
/TempConvolved
和Ain
/AinConvolved
之间的区别是什么使得前一次崩溃的时间为mexCallMATLAB
?
有人能帮我解决这个问题吗?
我改变了我的代码,并使用了'mxArray * AinConvolved = NULL;'和'mxArray * TempConvolved = NULL;'。我也尝试过'myconv(Temp,mask,TempConvolved);'以消除引起引用计数的可能性,并使用'mask'而不是'maskTranspose'。但是,它仍然不起作用,问题发生在与以前相同的地方,无法计算“TempConvolved”。 – AFP 2014-11-22 06:01:16
@ A2009在调用“mexCallMATLAB”后,如何放置'mxGetPr(AinConvolved)'和'mxGetPr(TempConvolved)'?是否有任何代码可以复制,您可以在gist.github.com上发布大量代码? – chappjc 2014-11-22 06:21:44
让我看看如何重现错误的部分以更好地阐明问题。我感谢您的帮助。 – AFP 2014-11-22 06:52:16