1

在一个 MEX 文件中,我使用以下命令创建了一个输出矩阵(工作正常):

plhs[0] = mxCreateNumericMatrix((mwSize)destLen, 1, mxUINT8_CLASS, mxREAL);

为了加快速度,我想使用未初始化的动态内存,这导致我使用未记录的命令:

plhs[0] = mxCreateUninitNumericMatrix((mwSize)destLen, 1, mxUINT8_CLASS, mxREAL);

在 Win32 和 Win64 中工作也很好。

在我的 Linux 环境中使用完全相同的代码会导致编译器发出以下警告:

warning: assignment makes pointer from integer without a cast [enabled by default]

并且代码崩溃,这表明返回的整数值不是指向正确内存地址的整数。

我能做些什么来使用mxCreateUninitNumericMatrix

4

2 回答 2

2

未记录的 MEX 函数在头文件中没有相应的原型mex.h,因此您必须自己显式编写一个。在这种情况下,它将是:

EXTERN_C mxArray *mxCreateUninitNumericMatrix(mwSize m, mwSize n, 
    mxClassID classid, mxComplexity flag);

如果您使用的是 C++,则该EXTERN_C宏扩展为,否则在 C 中扩展为,这样您就可以获得正确的链接extern "C"extern

在 C(不是 C++)中,任何未声明的函数都被假定为返回整数的外部函数(至少我认为 GCC 编译器就是这种情况)。

于 2013-12-11T13:36:30.643 回答
0

似乎 MathWorks 已在 R2015amxCreateUninitNumericMatrix中听取并制作并记录了两者。它们在 matrix.h 中声明如下:mxCreateUninitNumericArray

/*
 * Create an uninitialized numeric matrix.
 * The resulting array must be freed with mxDestroyArray.
 */
LIBMMWMATRIX_PUBLISHED_API_EXTERN_C mxArray *mxCreateUninitNumericMatrix(size_t m, 
    size_t n, mxClassID classid, mxComplexity flag);

/*
 * Create an uninitialized numeric array.
 * The resulting array must be freed with mxDestroyArray.
 */
LIBMMWMATRIX_PUBLISHED_API_EXTERN_C mxArray *mxCreateUninitNumericArray (size_t ndim, 
   size_t *dims, mxClassID classid, mxComplexity flag);

宏的LIBMMWMATRIX_PUBLISHED_API_EXTERN_C计算结果为externor extern C(对于 MEX 文件),具体取决于包含的源代码是 C 还是 C++。

各州的官方文档:mxCreateUninitNumericMatrix

调用mxCreateUninitNumericMatrix以创建一个二维 mxArray,其中所有数据元素都具有由 指定的数值数据类型classid。数据元素未初始化。

mxCreateUninitNumericMatrix分配动态内存来存储创建的mxArray. 调用mxDestroyArray以释放内存。

的文档mxCreateUninitNumericArray类似。

于 2014-12-11T00:05:02.083 回答