【发布时间】:2015-12-05 17:48:03
【问题描述】:
我正在尝试在 mex 中开发一个功能。该功能的目的应该是将窗口滑动到 3D 图像上并在窗口内应用一些功能。目前我被卡住了,因为当算法到达padarray 函数的调用时,MATLAB 崩溃了。
到目前为止,我写了这几行代码
#include <iostream>
#include "mex.h"
#include "matrix.h"
using namespace std;
void mexFunction(int nlhs,mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
#define O_IMAGE plhs[0]
#define I_IMAGE prhs[0]
#define I_PADSIZE prhs[1]
#define I_FUN prhs[2]
#define I_OPTION prhs[3]
// Argument Checking:
if(nrhs < 1 || nrhs > 4) /* Check the number of arguments */
mexErrMsgTxt("Wrong number of input arguments.");
else if(nlhs > 1)
mexErrMsgTxt("Too many output arguments.");
// Variable declarations
static const char padding[] = "symmetric";
const char *windowShape;
const mwSize *dim;
mwSize *dimPad;
mwSize ndim;
double *pad, *windowSize, *thetaStep, *phiStep;
mxArray *inputFun[4], *inputPadFun[3], *input_image, *imagePad, *output_image;
/*Get dimensions of input image*/
ndim = mxGetNumberOfDimensions(I_IMAGE);
dim = mxGetDimensions(I_IMAGE);
/* Create dimensions of padded image*/
dimPad = (mwSize *) mxCalloc(ndim, sizeof(mwSize));
dimPad = (mwSize *) memcpy((void *) dimPad,(void *) dim, ndim*sizeof(mwSize));
pad = mxGetPr(I_PADSIZE);
for (int i=0;i<ndim;++i)
{
dimPad[i] += 2*pad[i];
}
/*Get pointer to the input image*/
input_image = (mxArray *) mxGetData(I_IMAGE);
/* Create output image*/
O_IMAGE = mxCreateNumericArray(ndim, dim, mxDOUBLE_CLASS, mxREAL);
output_image = (mxArray *) mxGetData(O_IMAGE);
/* Create padded image*/
imagePad = mxCreateNumericArray(ndim, dimPad, mxDOUBLE_CLASS, mxREAL);
// Padding input matrix
inputPadFun[0] = input_image;
inputPadFun[1] = (mxArray *)(pad);
inputPadFun[2] = (mxArray *)(padding);
mexCallMATLAB(1, &imagePad, 3, inputPadFun, "padarray");
// Clean UP
mxFree(dimPad);
mxDestroyArray(imagePad);
}
我检查了mexCallMATLAB 的输入和输出图像的尺寸,它们似乎是正确的。我真的不明白我做错了什么。任何帮助是极大的赞赏!
【问题讨论】:
-
当我做错记忆时,我通常会遇到带有 mex 文件的 Matlab chrash。检查您是否正确创建了
imagePad。 -
感谢您的建议。如何检查内存是否分配正确?我检查了尺寸是否正确,
dim和dimPad都具有预期值。我在调用函数之前不使用imagePad,因此我不明白我怎么能对内存做错事。 -
如果
imagePad不够大,无法存储填充后的数组,则内存访问错误! -
我检查了
ndim = 3并且没问题dimPad = [42 42 42]这也没关系,因为原始图像是32x32x32而填充数组是5x5x5。 -
我认为您的
padding字符串有些问题。对于inputPadFun的第三个参数,尝试使用mxCreateString而不是将padding转换为指向mxArray的指针。您也不需要投射pad。这已经是一个mxArray指针,所以只需执行prhs[1]或I_PADSIZE。
标签: c matlab mex sliding-window