我希望有人可以帮助我解决我已经写过的一些mex代码的问题。 在多次调用相同的mex函数之后,matlab将没有响应。我在这里发布代码:
void mexFunction(int nlhs, mxArray *plhs[], /* Output variables */
int nrhs, const mxArray *prhs[]) /* Input variables */
{
const char *fieldnames[3]; //This will hold field names.
fieldnames[0] = (char*)mxMalloc(20);
fieldnames[0] = "mean";
plhs[0] = mxCreateCellMatrix(11, 1);
mxArray *cells = plhs[0];
mxArray *treeNodeMean;
double *mean;
for(int i = 0; i < 10; ++i) {
mxArray* treeNode = mxCreateStructMatrix(1,1,1,fieldnames);
mxSetCell(cells, i , treeNode);//set treeNode to tree
//initialize
treeNodeMean = mxCreateDoubleMatrix(2,58, mxREAL);
//set values
mean = mxGetPr(treeNodeMean);
for(int j = 0; j<=(58*2);j++) {
mean[j] = (double)j;
}
//set treeNode
mxSetFieldByNumber(treeNode,0,0, treeNodeMean);//(pointer,index,fieldNumber,value)
}
return;
}
表示i = 1:100
A = createTrees;
端
Matlab在长时间运行后没有响应。
for(int j = 0; j<=(58*2);j++) {
mean[j] = (double)j;
}
从mex函数来看,“Matlab在长时间运行后没有响应”的情况将会消失。 那么,我怎样才能解决&#34;无响应&#34;问题。 非常感谢。
答案 0 :(得分:0)
有问题的for循环是访问数组越界。 C样式索引从0
变为N-1
而不是1
到N
(如在MATLAB中),因此您的循环终止条件应为j<(58*2)
而不是<=
i
。
您可能还想仔细检查外部循环的循环终止条件(超过bar = dive bar
bar = club
bar = wine bar
bar = beer on tap
dive bar = club
dive bar = wine bar
dive bar = beer on tap
club = wine bar
club = beer on tap
wine bar = beer on tap
),因为尽管您为11分配了内存,但这只会循环10个元素。