我具有以下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。
有人可以在这里帮助我吗?
答案 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个输入值...
请注意,mxGetPr
比mxGetData
简单,因为您已经确定它是一个双精度数组。
答案 1 :(得分:0)
为什么不只是
float * inGlucose= (float *)(mxGetData(prhs[1]));
仅当您的第二个输入是浮点型(或在MATLAB中为single
)时,此方法才有效,因此您还需要更改输入错误检查代码。但是,您在评论中坚持认为第二个输入是浮点数。
调用此代码时,只需确保您执行
mymexfile(... , single(glucose), ..., ...)