Как скопировать только часть массива для вывода в мекс-файл? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующий пример файла 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).Таким образом, я выполняю цикл копирования в конце фрагмента. Можно ли избежать последнего цикла в моем примере?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Ну, вы можете #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);
0 голосов
/ 23 ноября 2018

Я думаю, что нет никакого способа в c.

Другой обходной путь - отправить ваш массив и переменную nStep в matlab и обработать срез массива там.

...