如何仅复制数组的一部分以输出到 mex 文件中?

How to copy only part of the array to output in a mex file?

我有以下 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)。因此,我在代码片段的末尾执行了一个复制循环。 是否可以避免我示例中的最后一个循环?

我觉得c没办法

另一种解决方法是将您的数组和 nStep 变量发送到 matlab 并在那里处理数组切片。

好吧,你可以 #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);