如何在mex中获取结构内矩阵的大小

How to get sizes of a matrix inside a struct in mex

我有一个 mex 程序,它接受多个输入并检查它们的大小是否合适。

其中一个输入是内部包含多个标量和矩阵的结构。我的问题是,其中一个字段可以是 3x1 或 3xN 矩阵。每当它是 3xN 时,我都会得到 weird/wrong 结果。

让我们看 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() 似乎符合我的要求。

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

如果在转换时,将它们转换为 long int 而不是 int,它们将显示正确的值。

我的机器是win7 64位

16 位 int 似乎只在具有 "LP32" 数据模型的系统上才是问题,例如在 Win-16 API 上使用。参考 one and two.

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