我有以下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)。因此,我在代码片段的末尾执行了一个复制循环。
是否可以避免示例中的最后一个循环?
答案 0 :(得分:3)
好吧,您可以#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);
答案 1 :(得分:1)
我认为c中没有办法。
另一种解决方法是将数组和nStep变量发送到matlab并在那里处理数组切片。