Linux(GLNXA64)使用mxCreateUninitNumericMatrix R2013b

时间:2013-12-11 10:11:35

标签: c linux matlab mex undocumented-behavior

在一个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

2 个答案:

答案 0 :(得分:2)

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

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

如果您使用C ++,则EXTERN_C宏会扩展为extern "C",而对于C中的extern,则会扩展为correct linkage

在C(不是C ++)中,假设任何undeclared函数都是返回整数的外部函数(至少我认为是GCC编译器的情况)。

答案 1 :(得分:0)

似乎MathWorks已经倾听并在R2015a中记录了mxCreateUninitNumericMatrixmxCreateUninitNumericArray 。它们在matrix.h中声明如下:

/*
 * 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的计算结果为externextern C(对于MEX文件),具体取决于包含源是C还是C ++。

official documentation for mxCreateUninitNumericMatrix州:

  

调用mxCreateUninitNumericMatrix创建一个2-m mxArray,其中所有数据元素都具有classid指定的数字数据类型。数据元素未初始化。

     

mxCreateUninitNumericMatrix分配动态内存来存储创建的mxArray。调用mxDestroyArray取消分配内存。

Documentation for mxCreateUninitNumericArray类似。