我有下面的mex文件示例:
#include "mex.h"
#include <random>
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
int nIterations = 10;
double *Out,K[nIterations];
mxArray *mxOut;
std::random_device rnd_device;
std::mt19937_64 rg(rnd_device());
std::normal_distribution<double> Xi(0,1);
int nStep = 0;
for (int i=0; i<nIterations;i++){
K[i] = Xi(rg);
nStep++;
if (K[i]>0.2){break;}
}
plhs[0] = mxCreateNumericMatrix(nStep,1, mxDOUBLE_CLASS, mxREAL);
Out = (double*) mxGetData(plhs[0]);
// I want to avoid this cycle
for (int i=0; i<nStep;i++){
Out[i] = K[i];
}
}
主要思想是,我知道输出的最大大小(在这种情况下为10(,但每次运行的K
的大小可能不同(从1到10(。因此,我在代码段的末尾执行一个复制循环。在我的例子中,是否可以避免最后一个循环
好吧,您可以#include <string.h>
并用普通和基本的内存副本替换循环:memcpy(Out,K,nStep * sizeof(*K));
另一个可能更丑陋的解决方案是分配足够的内存将所有迭代存储到Out
中,然后用mxRealloc
重新分配内存,以便Matlab能够正确跟踪内存分配。
plhs[0] = mxCreateNumericMatrix(nIterations,1, mxDOUBLE_CLASS, mxREAL);
Out = (double*) mxGetData(plhs[0]);
// draw up to nIterations numbers
for (int i=0; i<nIterations;i++){
Out[i] = Xi(rg);
nStep++;
if (Out[i]>0.2){break;}
}
// reallocate memory and set nb of rows
mxSetData(plhs[0],mxRealloc(Out,nStep * sizeof(*Out)));
mxSetM(plhs[0],nStep);
我认为在c.中没有办法
另一种解决方法是将数组和nStep变量发送到matlab,并在那里处理数组切片。