在mex文件中确定mwSize的mxClassID

时间:2013-07-31 13:58:17

标签: matlab 32bit-64bit mex

我在我的mex文件中使用mxCreateNumericMatrix函数:

mxArray *mxCreateNumericMatrix(mwSize m, mwSize n, mxClassID classid, mxComplexity ComplexFlag);

我想获得 mwSize 类型的数组。 为此,我需要确定使用 mxUINT32_CLASS mxUINT64_CLASS 作为 classid

我可以在运行时使用 sizeof(mwSize)上的if语句来确定它,但是有更优雅的方法来确定mwSize的类ID吗?也许某些定义取决于具有一个值或另一个值的系统?

只是美学问题。

BTW,在Fortran上有一个函数mxClassIDFromClassName: http://www.mathworks.com/help/matlab/apiref/mxclassidfromclassname.html

mwSize用于其他原因,因此mxCreateDoubleMatrix函数将是可移植的。如果mxCreateNumericMatrix没有优雅的解决方案,那就很奇怪了。

编辑:

正如@Praetorian解释的那样,在我的情况下我没有理由使用适合系统的类型(32或64位),因为我特别喜欢它是64位整数数组,我也可以定义这个大小在32位系统中。

但另一方面,我也希望将两个索引返回给我返回的数组。在我的情况下,我知道数组本身很短,无论如何我使用uint16_T,但如果我想让它适合mwIndex,我将不得不使用一些宏(@Amro建议一些好的选项),因为显然,整数(适合系统)没有mxCreateDoubleMatrix的函数。

总而言之,@ Praetorian在下面的评论中帮助了我的案例,而@Amro可能为一般案例提供了最佳选择。

2 个答案:

答案 0 :(得分:3)

mxCreateNumericMatrix和其他mxCreate*函数的目标是创建mxArray(MATLAB基本类型)。这些数组可以从MEX函数返回到MATLAB。

mwSize只是typedefsize_t类型(对于32位与64位可能不同),这不是有效的MATLAB数据类型(不是mxClassID)。如果你想创建一个mwSize的数组,用通常的方式mxMalloc在C中分配内存(但我怀疑这是你想要的)。


正如Praetorian所说,mwSizemwIndex为typedef'的实际C类型由传递给mex命令的标志决定(或者如果你的话,则为默认值)没有明确指定一个):

>> mex -largeArrayDims file.c
>> mex -compatibleArrayDims file.c

如果我们检查包含的tmwtypes.h头文件,这里是相关的代码块:

#ifdef MX_COMPAT_32
typedef int mwSize;
typedef int mwIndex;
typedef int mwSignedIndex;
#else
typedef size_t    mwSize;         /* unsigned pointer-width integer */
typedef size_t    mwIndex;        /* unsigned pointer-width integer */
typedef ptrdiff_t mwSignedIndex;  /* a signed pointer-width integer */
#endif

(回想一下size_t本身就是平台依赖的。)


正如上面的评论所述,我认为你误解了文档。索引到矩阵时以及在编写MEX函数时分别处理矩阵大小(而不是使用非便携式普通mwIndex)时,应使用mwSizeint。它们没有相应的mxClassID(因此您无法创建这些类型的mxArray并将它们传递回MATLAB。)

现在,如果你想创建一个索引数组并将其返回到MATLAB以用作常规变量,你可以创建一个与无符号整数相同类型的mxArray(匹配你的位数)体系结构:32位与64位)。使用macros确定您要编译的是哪一个,并相应地使用mxUINT32_CLASSmxUINT64_CLASS

例如,我们可以使用MATLAB使用的相同宏:

#ifdef MX_COMPAT_32
typedef mxUINT32_CLASS INDICES_CLASS;
#else
typedef mxUINT64_CLASS INDICES_CLASS;
#endif

mxArray *arr = mxCreateNumericMatrix(10, 1, INDICES_CLASS, mxReal);
// ... fill arr with indices

答案 1 :(得分:0)

你在C中试过mxClassIDFromClassName吗?根据未记录的libmx函数this listdiscussed here,它似乎存在。但是,是的,如果你想坚持在线文档中列出的内容,我不知道除了使用if语句之外的其他方法。在mex中创建双矩阵以外的东西总是比较麻烦。