我在我的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.htmlmwSize用于其他原因,因此mxCreateDoubleMatrix函数将是可移植的。如果mxCreateNumericMatrix没有优雅的解决方案,那就很奇怪了。
编辑:
正如@Praetorian解释的那样,在我的情况下我没有理由使用适合系统的类型(32或64位),因为我特别喜欢它是64位整数数组,我也可以定义这个大小在32位系统中。
但另一方面,我也希望将两个索引返回给我返回的数组。在我的情况下,我知道数组本身很短,无论如何我使用uint16_T
,但如果我想让它适合mwIndex
,我将不得不使用一些宏(@Amro建议一些好的选项),因为显然,整数(适合系统)没有mxCreateDoubleMatrix
的函数。
总而言之,@ Praetorian在下面的评论中帮助了我的案例,而@Amro可能为一般案例提供了最佳选择。
答案 0 :(得分:3)
mxCreateNumericMatrix
和其他mxCreate*
函数的目标是创建mxArray
(MATLAB基本类型)。这些数组可以从MEX函数返回到MATLAB。
mwSize
只是typedef
到size_t
类型(对于32位与64位可能不同),这不是有效的MATLAB数据类型(不是mxClassID
)。如果你想创建一个mwSize
的数组,用通常的方式mxMalloc
在C中分配内存(但我怀疑这是你想要的)。
正如Praetorian所说,mwSize
和mwIndex
为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
)时,应使用mwSize
和int
。它们没有相应的mxClassID
(因此您无法创建这些类型的mxArray
并将它们传递回MATLAB。)
现在,如果你想创建一个索引数组并将其返回到MATLAB以用作常规变量,你可以创建一个与无符号整数相同类型的mxArray
(匹配你的位数)体系结构:32位与64位)。使用macros确定您要编译的是哪一个,并相应地使用mxUINT32_CLASS
或mxUINT64_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 list的discussed here,它似乎存在。但是,是的,如果你想坚持在线文档中列出的内容,我不知道除了使用if
语句之外的其他方法。在mex中创建双矩阵以外的东西总是比较麻烦。