使用mxCreateUninitNumericMatrix R2013b的Linux(GLNXA64)

使用mxCreateUninitNumericMatrix R2013b的Linux(GLNXA64),c,linux,matlab,mex,undocumented-behavior,C,Linux,Matlab,Mex,Undocumented Behavior,在一个MEX文件中,我使用命令(正常工作)创建了一个输出矩阵: 为了加速,我想使用未初始化的动态内存,这会导致我使用undocumented命令: 在Win32和Win64中工作也很好 在我的Linux环境中使用完全相同的代码会导致编译器发出以下警告: warning: assignment makes pointer from integer without a cast [enabled by default] 代码崩溃,这表明返回的整数值不是指向正确内存地址的整数值 如何使用mxCrea

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

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

在Win32和Win64中工作也很好

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

warning: assignment makes pointer from integer without a cast [enabled by default]
代码崩溃,这表明返回的整数值不是指向正确内存地址的整数值


如何使用
mxCreateUninitNumericMatrix

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

EXTERN_C mxArray *mxCreateUninitNumericMatrix(mwSize m, mwSize n, 
    mxClassID classid, mxComplexity flag);
<> >代码>外部代码宏扩展到<代码>外部> C >代码>,如果您使用C++,否则在C中代码< >外部> /COD>,这样您就可以获得.< /P>
在C语言(不是C++)中,任何函数都被假定为返回整数的外部函数(至少我认为GCC编译器是这样的)。

看来MathWorks已经听过了,并且在R2015a中记录了这两个函数。它们在矩阵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);
<宏>代码> LBMMWMITRIX.PAPIISHEADIIOUTIONEXULL C 根据包含源为C或C++,< /P>,计算为<代码>外部> <代码>或<代码>外部c>代码>(对于MEX文件)。 各国:

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

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


类似。

哦,我得到了一些进一步的
坏消息
:刚刚玩过MATLAB R2014a Pre:在libmx.dll和libmex.dll中,我丢失了许多以前未记录的函数。看来我们得另寻出路了。
EXTERN_C mxArray *mxCreateUninitNumericMatrix(mwSize m, mwSize n, 
    mxClassID classid, mxComplexity flag);
/*
 * 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);