1

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

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

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

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

只是审美问题。

顺便说一句,在 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 可能为一般案例提供了最好的选择。

4

2 回答 2

3

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

mwSize只是一个typedef类型size_t(对于 32 位和 64 位可能不同),它不是有效的 MATLAB 数据类型(不是 的一部分mxClassID)。如果实际上您想创建一个数组mwSize,请以通常的方式在 C 中分配内存mxMalloc(但我怀疑在这种情况下这是您想要的)。


正如 Praetorian 所指出的,实际的 C 类型mwSizemwIndex被 typedef'ed 由您传递给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它本身是平台相关的)。


正如上面评论中提到的,我认为您误解了文档。mwIndex并且mwSize在编写 MEX 函数(而不是使用 non-portable plain )时分别用于索引到矩阵和处理矩阵大小时使用int。它们没有对应的mxClassID(因此您不能创建mxArray这些类型的 's 并将它们传递回 MATLAB)。

现在,如果您想创建一个索引数组并将其返回给 MATLAB 以用作常规变量,您可以创建一个mxArray与无符号整数等效的类型(匹配您的架构的位数:32 位 vs 64-少量)。使用来确定您正在为哪个编译,并相应地使用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
于 2013-07-31T17:16:53.807 回答
0

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

于 2013-07-31T14:30:22.200 回答