Изменение константных аргументов в мекс-функции

Этот вопрос является частью более крупного проекта, над которым я работаю. Я использовал более простую mex-функцию, чтобы объяснить проблему, с которой я имею дело.

Требуется изменить аргументы (переменные RHS), передаваемые в mex-функцию. Это необходимое требование.
Я был в состоянии изменить переменную в случае двойного * в качестве аргументов. Вот код:

#include "mex.h"/* The computational routine */
void arrayProduct(double x, double *y, double *z, mwSize n)
{
mwSize i;
/* multiply each element y by x */
for (i=0; i<n; i++) {
z[i] = (x * y[i]);
}
}

/* The gateway function */
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
double multiplier;              /* input scalar */
double *inMatrix;               /* 1xN input matrix */
size_t ncols;                   /* size of matrix */
double *outMatrix;              /* output matrix */

/* check for proper number of arguments */
if(nrhs!=3) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs","Three inputs required.");
}
if(nlhs!=0) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs","Zero output required.");
}

/* get the value of the scalar input  */
multiplier = mxGetScalar(prhs[0]);
/* create a pointer to the real data in the input matrix  */
inMatrix = mxGetPr(prhs[1]);
/* get dimensions of the input matrix */
ncols = mxGetN(prhs[1]);

/* get a pointer to the real data in the output matrix */
outMatrix = mxGetPr(prhs[2]);
/* call the computational routine */
arrayProduct(multiplier,inMatrix,outMatrix,(mwSize)ncols);

}

Когда я пытаюсь сделать то же самое, используя приведение типов к int *, это не работает.
Вот код, который я попробовал:

/* The computational routine */
void arrayProduct(double x, double *y, int *z, mwSize n)
{
mwSize i;
/* multiply each element y by x */
for (i=0; i<n; i++) {
z[i] = (x * y[i]);
}
}

/* The gateway function */
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
double multiplier;              /* input scalar */
double *inMatrix;               /* 1xN input matrix */
size_t ncols;                   /* size of matrix */
int *outMatrix;              /* output matrix */
/* check for proper number of arguments */
if(nrhs!=3) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs","Two inputs required.");
}
if(nlhs!=0) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs","One output required.");
}

/* get the value of the scalar input  */
multiplier = mxGetScalar(prhs[0]);
int mult = (int)multiplier;
/* create a pointer to the real data in the input matrix  */
inMatrix = mxGetPr(prhs[1]);
/* int *inMat;
inMat = *inMatrix;*/
/* get dimensions of the input matrix */
ncols = mxGetN(prhs[1]);
/* create the output matrix */
/* get a pointer to the real data in the output matrix */
outMatrix = (int *)mxGetData(prhs[2]);
/* call the computational routine */
arrayProduct(multiplier,inMatrix,outMatrix,(mwSize)ncols);
}

Мне нужно преобразовать double в int * в случае моего проекта, и решение этого простого примера решит проблему.
Какие-либо предложения?

1

Решение

Приведение указателя к другому типу не преобразует данные, на которые он указывает, в этот тип. Почти все данные Matlab являются массивами double, Если ваша функция требует массив intвам нужно выделить отдельный массив для ints и конвертировать элементы по одному.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]