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]);
我附上了编译代码的一个版本(无论如何在我的系统上)。