如何在mex中

时间:2015-10-28 12:10:38

标签: matlab mex

我在mex中有一个程序需要几个输入并检查它们是否合适。

其中一个输入是内部有几个标量和矩阵的结构。我的问题是,其中一个字段可以是3x1或3xN矩阵。每当它是3xN时,我得到一个奇怪/错误的结果。

让我们看看3个例子:

第3个输入是一个矩阵。如果我这样做:

mrows = mxGetM(prhs[2]);
ncols = mxGetN(prhs[2]);
mexPrintf("%d x %d \n", (int)mrows,(int)ncols);

打印:

>>  1 x 360 

尼斯。

然后,结构。

for(int ifield=0; ifield<nfields; ifield++) {
        tmp=mxGetField(prhs[1],0,fieldnames[ifield]); //fieldnames has the names they shoudl have

        // check if that fieldname exists in the struct
        if(tmp==NULL){
            mexPrintf("%s number: %d %s \n", "FIELD",ifield+1, fieldnames[ifield]);
            mexErrMsgIdAndTxt( "CBCT:MEX:Atb:InvalidInput",
                    "Above field is missing. Check spelling. ");
        }
        switch(ifield){ //for each field checnk if it is how it shoudl be

            // some other things that work

            case 8:
                mrows = mxGetM(tmp);
                ncols = mxGetN(tmp);
                mexPrintf("%d x %d \n", (int)mrows,(int)ncols);
                //check if they are what the should be
                break;
            case 9:
                mrows = mxGetM(tmp);
                ncols = mxGetN(tmp);
                mexPrintf("%d x %d \n", (int)mrows,(int)ncols);
                //check if they are what the should be
                break;

        }

  }

因此,结构中的第8个字段为str.field8=[0;0;0];,第9个字段为str.field9=[zeros(1,360);zeros(1,360)]。但是这段代码打印出来:

>> 3 x 1 
>> -96713592 x 2 

这里发生了什么?我应该使用其他函数来获取结构中矩阵的大小吗?我在tmp变量中错误地获取了数据吗?

我很困惑,因为如果prhs[2]是一个矩阵,它会打印正确的尺寸,因此mxGetM()mxGetN()似乎可以做我想要的。

2 个答案:

答案 0 :(得分:2)

该问题与mex无关或如何从结构中获取矩阵,但将mcolsnrows变量转换为int

如果在投放时,它们会投放到long int而不是int,则会显示正确的值。

我的机器是win7 64bit

答案 1 :(得分:1)

16位int在具有“LP32”数据模型的系统上似乎只是一个问题,例如在Win-16 API上使用。参考onetwo

虽然16位是所有C ++标准保证,而long int有此保证。