对于动态分配的mxArrays, mexCallMATLAB崩溃

4个视图(过去30天)
美联社
美联社 2014年11月24日
回答: 杰夫•海斯 2014年11月24日
有人能好心地帮助我修复我在使用动态分配的mxArrays的问题吗?在下面的示例代码中,MATLAB在到达时崩溃 mexCallMATLAB
包括< mex.h >
包括< math.h >
无效减少(mxArray *B, mxArray *& created)
无效convolve (mxArray *Ain, mxArray *Kernel, mxArray *&Aout)
无效mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
double *B = mxGetPr(prhs[0]);
mxArray* *Bt1 = new mxArray*[2];
Bt1[0] = mxCreateNumericMatrix(0,0, mxDOUBLE_CLASS, mxREAL);
mxSetPr(Bt1[0], &B[0]);
mxSetM (Bt1[0], mxGetM(prhs[0]));
mxSetN (Bt1[0], mxGetN(prhs[0]));
Bt1[1] = mxCreateNumericMatrix(0,0, mxDOUBLE_CLASS, mxREAL);
mxSetM (Bt1[1], mxGetM(prhs[0]) >> 1);
mxSetN (Bt1[1], mxGetN(prhs[0]) >> 1);
减少(Bt1[0], Bt1[1]);
删除[]Bt1;
无效Reduce(mxArray *B, mxArray *& created)
long int ijTemp, ijBreduced;
mxArray *mask = mxCreateDoubleMatrix(1,5, mxREAL);
double *maskPtr = mxGetPr(掩码);
maskPtr[0] = 0.05;
maskPtr[1] = 0.25;
maskPtr[2] = 0.4;
maskPtr[3] = 0.25;
maskPtr[4] = 0.05;
mxArray * mask转置= mxCreateDoubleMatrix(5, 1, mxREAL);
mask转置= mxDuplicateArray(掩码);
mxArray * b卷积= NULL;
convolve(B, mask, BConvolved);
double *BConvolvedPtr = mxGetPr(BConvolved);
mxArray *Temp = mxCreateDoubleMatrix(
(mwSize) mxGetM (B),
(mwSize)mxGetN(B) >> 1,
mxREAL);
* temppptr = mxGetPr(Temp)
(int j = 0;j < ((mwSize)mxGetN(B) >> 1);j + +)
(int I = 0;i < (mwSize)mxGetM(B);我+ +)
ijTemp = i + (mwSize)mxGetM(B) * j;
ijB = i + (mwSize)mxGetM(B) * 2*j;
TempPtr[ijTemp] = BConvolvedPtr[ijB];
mxArray* temp卷积= NULL
convolve(Temp, mask转置,TempConvolved);
*TempConvolvedPtr = mxGetPr(TempConvolved)
*BreducedPtr = mxGetPr(已生成)
(int j = 0;j < ((mwSize)mxGetN(B) >> 1);j + +)
(int I = 0;i < ((mwSize)mxGetM(B) >> 1);我+ +)
ijTemp = 2*i + (mwSize)mxGetM(B) * j;
ijBreduced = i + ((mwSize)mxGetM(B) >> 1) * j;
BreducedPtr[ijBreduced] = TempConvolvedPtr[ijTemp];
无效convolve(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 (“相同”);
double *ainPtr = mxGetPr(Ain);
mxSetPr(rhs[0], ainPtr);
mxSetM (rhs[0], mxGetM(Ain));
mxSetN (rhs[0], mxGetM(Ain));
double *kernelPtr = mxGetPr(内核);
mxSetPr(rhs[1],内核ptr);
mxSetM (rhs[1], mxGetM(内核));
mxSetN (rhs[1], mxGetN(Kernel));
mexCallMATLAB(1, &Aout, 3, rhs,“conv2”);
mxSetPr(rhs[0], NULL);
mxSetPr(rhs[1], NULL);

答案(1)

杰夫•海斯
杰夫•海斯 2014年11月24日
AP -即使我编译的代码没有调用 减少 在你的 mexFunction ,程序仍然会崩溃(在R2014a, OS X 10.8.5上编译)。假设代码放在一个名为, myConv.cpp ,然后
>> mex mycon .cpp
建筑使用“Xcode clang++”。
墨西哥人成功完成。
> > myConv(魔法(4))
崩溃
这崩盘,曾经的 减少 电话被注释掉了,指向了一个问题 mxSetPr 它使用输入参数, prhs [0] .这是在你之前的帖子中经历过的同样的错误,所以我不清楚如何-用同样的代码-你期望代码工作而不崩溃。为什么不简化你的代码 mexFunction 致以下人士
无效mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
//创建适当大小的输出矩阵
mxArray *Bt1 = 0;
Bt1 = mxCreateNumericMatrix(
mxGetM(prhs[0]) >> 1, mxGetN(prhs[0]) >> 1, mxDOUBLE_CLASS, mxREAL);
//减少输入矩阵
减少(prhs [0], Bt1);
//删除创建数组
mxDestroyArray (Bt1);
注意在上面我们是如何通过的 prhs [0] 作为第一个输入 减少 因为我们创建了一个数字矩阵,所以我们必须销毁它。当然,以上将需要您对您的签名做一些更改 减少 .它从
无效减少(mxArray *B, mxArray *& created)
无效减少(const mxArray *B, mxArray *生成)
注意我们需要如何添加 常量 限定符的输入矩阵(它是 prhs [0] ),并且不再通过引用(?)传递第二个输入参数。这就是你的目的吗 Breduced ,如果是,为什么?
像签名一样 减少 被改变了,我们必须做同样的 卷积 ,从
无效convolve (mxArray *Ain, mxArray *Kernel, mxArray *&Aout)
无效convolve (const mxArray *Ain, mxArray *Kernel, mxArray **Aout)
注意我们需要如何添加 常量 限定符的输入矩阵(它是 prhs [0] ),则输出矩阵为 来向mxArray * * ,因为我们期望 卷积 为我们创建这个矩阵。在调用函数中,我们只创建一个空指针指向 mxArray 并希望 卷积 为我们创造它。这意味着我们也必须改变我们打电话的方式 卷积
convolve(B, mask, BConvolved);
convolve(B, mask, &BConvolved);
我们将指针的地址传递到哪里 BConvolved .的另一个调用也需要执行相同的操作 卷积
正因如此,呼唤 mexCallMATLAB 会需要稍微改变一下吗
mexCallMATLAB(1, &Aout, 3, rhs,“conv2”);
mexCallMATLAB(1, Aout, 3, rhs,“conv2”);
编译这个,并调用 myConv(魔法(4)) 工作时不会崩溃,但是您需要验证正在执行的计算是否正确。
同样,代码中有许多地方是创建矩阵(数值或字符串)而不释放内存的。应该添加以下行 减少
//删除数组
mxDestroyArray (maskTranspose);
mxDestroyArray(面具);
mxDestroyArray (BConvolved);
mxDestroyArray(临时);
mxDestroyArray (TempConvolved);
加上下面的一行 卷积
//删除数组
mxDestroyArray (rhs [2]);
我附上了编译代码的一个版本(无论如何在我的系统上)。

标签

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!