Массив int на выходе mex-файла - PullRequest
4 голосов
/ 15 марта 2012

Я пытаюсь создать мекс-функцию, чья запись является целым числом, а вывод - массивом целых чисел. Таким образом, функция выглядит так: int * myFunction (unsigned int N). В mexFunction я объявляю переменную * variab типа int, а затем

N = mxGetScalar(prhs[0]);

  /* assign a pointer to the output */
  siz= 2*ceil(log(1.0*N)/log(2.0)-0.5)+1;
  plhs[0] = mxCreateDoubleMatrix(1,siz, mxREAL);
  vari = (int*) mxGetPr(plhs[0]); */
  /* Call the subroutine. */
  vari = myFunction(N);
  mexPrintf("The first value is %d\n", vari[0]);

Дело в том, что первое значение является правильным (и другие были проверены и также были правильными), но когда я вызываю подпрограмму mxFunction (16), я получаю только 0 в качестве вывода. Я предполагаю, что это потому, что мой вывод представляет собой массив int, но я не знаю, как решить проблему. Любой намек? Приветствия.

1 Ответ

3 голосов
/ 15 марта 2012

Matlab по умолчанию имеет дело с двойниками. Вы можете легко привести их в свою функцию mex, как показано в следующем примере на основе вашего фрагмента кода. Я сделал myFunction, которая выполняет демо-алгоритм. Вместо того, чтобы возвращать тип данных, я делаю его функцией void и передаю указатель на вывод, чтобы он мог заполнить его. , .

/*************************************************************************/
/* Header(s)                                                             */
/*************************************************************************/
#include "mex.h"
#include "math.h"


/*************************************************************************/
/*the fabled myFunction                                                  */
/*************************************************************************/
void myFunction(unsigned int N, unsigned int siz, double* output)
{
    int sign = 1;
    for(int ii=0; ii<siz; ++ii)
    {
        output[ii] = (double)(ii * sign + N);
        sign *= -1;
    }

}


/*************************************************************************/
/* Gateway function and error checking                                   */
/*************************************************************************/
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
  /* variable declarations */
  unsigned int siz;
  double N;

  /*  check the number of input and output parameters  */  
    if(nrhs!=1)
        mexErrMsgTxt("One input arg expected");
    if(nlhs > 1)
        mexErrMsgTxt("Too many outputs");

  N = mxGetScalar(prhs[0]);

  /* assign a pointer to the output */  
  siz= 2*ceil(log(1.0*N)/log(2.0)-0.5)+1;
  plhs[0] = mxCreateDoubleMatrix(1,siz, mxREAL);
  myFunction(N, siz, mxGetPr( plhs[0]) );
}
...