mexGetData()输出零

时间:2018-08-17 22:20:16

标签: c matlab casting

我具有以下matlab mex函数:

void mexFunction( int nlhs, mxArray *plhs[],int nrhs,   const mxArray *prhs[] ){

//Declare variables for the input arguments.

size_t lengthh;      /* input scalar */
double *inNoise;       /* 1xN input matrix */
float (*inGlucose)[12];       // 1xN input matrix float (*PatchSet)[64];
double *inDates;       /* 1xN input matrix */

if(nrhs != 4) {
    mexErrMsgIdAndTxt("MyToolbox:fullLoop:nrhs", "4 inputs required.");
}
/*if(nlhs != 1) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs",
                  "One output required.");
}*/
(void) nlhs; (void) plhs;

// make sure the first input argument is an array 
if( mxIsComplex(prhs[0]) || !mxIsDouble(prhs[0]) ) {
    mexErrMsgIdAndTxt("MyToolbox:fullLoop:notDouble","1:Input matrix must be type double.");
}
if( !mxIsDouble(prhs[1]) || mxIsComplex(prhs[1]) ) {
    mexErrMsgIdAndTxt("MyToolbox:fullLoop:notDouble","2:Input matrix must be type double.");
}

if( !mxIsDouble(prhs[2]) || mxIsComplex(prhs[2])|| mxGetNumberOfElements(prhs[2]) < 1 ) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notDouble","3:Input matrix must be type long int.");
}

if( mxIsComplex(prhs[3]) || mxGetNumberOfElements(prhs[3])!=1 ) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notDouble","4:Input scalar must be type double.");
}

// check that number of rows in second input argument is 1
if(mxGetM(prhs[0])!=1) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notRowVector","5:1st argument must be a row vector.");
}
if(mxGetM(prhs[1])!=1) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notRowVector","6:2nd argument must be a row vector.");
}
if(mxGetM(prhs[2])!=1) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notRowVector","7:3rd argument must be a row vector.");
}

printf("Sizes: %d %d %d \n", mxGetNumberOfElements(prhs[0]), mxGetNumberOfElements(prhs[1]), mxGetNumberOfElements(prhs[2]));

/******************************************PROBLEM*****************************************************/
inNoise = (double *)mxGetData(prhs[0]);//mxGetData
inGlucose = (float (*)[12]) mxGetData(prhs[1]);//PatchSet = (float (*)[64]) mxGetData(prhs[0]);
lengthh = mxGetScalar(prhs[3]);
/******************************************************************************************************/


printf("length: %d\n",lengthh);
int i;
for (i=0;i<lengthh;i++){
    printf("%f -- %f\n",inGlucose[i],inNoise[i]);
}
//free(gStat);

return;
}

问题出在星号所在的部分。

我遵循这个tutorial来转换数组。 尽管程序可以正确读取double array(inNoise),但它为inGlucose返回一个0的数组。

在Matlab 2018A中似乎对此进行了修复,但由于不可避免的原因,我只能找到2016B。

有人可以在这里帮助我吗?

2 个答案:

答案 0 :(得分:0)

float (*inGlucose)[12]是一个指向32个大浮点数的指针数组。您将获取一个双精度浮点值数组,并将其解释为指针数组。奇怪的是程序没有崩溃。

相反,如果需要使用double*格式的值,请将其复制到float数组中。

double *inGlucoseD;
float inGlucose[12];
//...
inGlucoseD = mxGetPr(prhs[1]);
for (int ii=0; ii<12; ++ii) {
   inGlucose[ii] = inGlucoseD[ii];
}

还要测试以确保要复制12个输入值...

请注意,mxGetPrmxGetData简单,因为您已经确定它是一个双精度数组。

答案 1 :(得分:0)

为什么不只是

float * inGlucose= (float *)(mxGetData(prhs[1]));

仅当您的第二个输入是浮点型(或在MATLAB中为single)时,此方法才有效,因此您还需要更改输入错误检查代码。但是,您在评论中坚持认为第二个输入是浮点数。

调用此代码时,只需确保您执行

mymexfile(... , single(glucose), ..., ...)