在一个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
?
答案 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中记录了mxCreateUninitNumericMatrix
和mxCreateUninitNumericArray
。它们在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
的计算结果为extern
或extern C
(对于MEX文件),具体取决于包含源是C还是C ++。
official documentation for mxCreateUninitNumericMatrix
州:
调用
mxCreateUninitNumericMatrix
创建一个2-m mxArray,其中所有数据元素都具有classid
指定的数字数据类型。数据元素未初始化。
mxCreateUninitNumericMatrix
分配动态内存来存储创建的mxArray
。调用mxDestroyArray
取消分配内存。