Matlab 创建mxArray*而不进行*内存分配/初始化

Matlab 创建mxArray*而不进行*内存分配/初始化,matlab,memory-management,initialization,mex,Matlab,Memory Management,Initialization,Mex,我经常通过在mex中实现来优化一些matlab例程。 到目前为止,这一切都很正常-但是每当创建返回mxArray,它都会在我使用mxCreateNumericArray构建它时被预先初始化 在我的大部分工作中,我不需要预先分配内存(归零)。很悲哀-我找不到一个匹配的命令用于此目的(分配内存而不归零) 所以我的问题可以用两种方式来回答: 要创建mxArray而不将内容归零,我必须调用哪个命令 如何在不为Pr(和Pi)字段分配内存的情况下构建mxArray,稍后我将通过mxMalloc分配该字段 一

我经常通过在mex中实现来优化一些matlab例程。 到目前为止,这一切都很正常-但是每当创建返回
mxArray
,它都会在我使用
mxCreateNumericArray
构建它时被预先初始化
在我的大部分工作中,我不需要预先分配内存(归零)。很悲哀-我找不到一个匹配的命令用于此目的(分配内存而不归零)

所以我的问题可以用两种方式来回答:

  • 要创建
    mxArray
    而不将内容归零,我必须调用哪个命令
  • 如何在不为
    Pr
    (和
    Pi
    )字段分配内存的情况下构建
    mxArray
    ,稍后我将通过
    mxMalloc
    分配该字段
  • 一个想法是用大小(0,0)构建数组-但这是最终的解决方案吗?

    我想,构建大小(0,0)矩阵与一种“空”构造函数非常接近。 之后,您必须使用
    mxMalloc
    mxRealloc
    调整数组大小


    不过,我怀疑这是否会带来明显的性能提升,除非您处理的是非常大的阵列。

    对于塞巴斯蒂安(sebastian)的那些线路,我一直在玩。我想,下面几行是我问题的答案。
    换句话说,即使将空间归零,结果也很快。
    在我当前的应用程序中,我测试了四种不同的场景:

  • plhs[0]=mxCreateNumericArray(targetDimCount、targetDims、targetClass、mxREAL)
  • plhs[0]=mxCreateNumericArray(0,0,targetClass,mxREAL);mxSetData(plhs[0],mxMalloc(destLen_in_字节))
  • plhs[0]=mxCreateNumericArray(0,0,targetClass,mxREAL);mxSetData(plhs[0]、mxRealloc(mxGetData(plhs[0])、destLen_(以字节为单位))
  • plhs[0]=mxCreateUninitNumericArray(targetDimCount、targetDims、targetClass、mxREAL)
  • 导致这些计时(对于第1列中给出的分配矩阵)


    从这些数字来看,我的观点是,重新分配是一个坏主意(但并没有那么坏,正如时间所显示的那样),而将这些值归零也不是一个很大的努力。好吧,我们可以进一步怀疑10000到30000之间的行为,但这会更科学。使用malloc(仅用于测试目的)不起作用,因为分配的存储需要用于plhs,并且它会崩溃,除非存储由mx***

    分配,另一个可能的选择可能是我们使用未记录的函数
    mxFastZeros
    。这是许多中的一个。您可以阅读有关它在中的使用。我很想知道它是否与创建零大小矩阵有什么不同。

    嗨,听起来很清楚。我尝试使用mxCreateNumericArray创建12345 x 12345数组,每次生成时间为5.7992秒,而使用0,0创建时,使用mxMalloc和mxSetDimensions创建相同的数据和大小,每次生成时间为5.8946秒。这很奇怪,不是吗?(在这段时间内也进行了一些解压缩,两次调用都是一样的。)这有点奇怪,是的。多个测试运行的时间是否具有可比性?如果是这样的话,matlab似乎做得很好……我用最后几个小时测试了不同的方法。结合你在这里的台词,我想,我可以自己回答我的问题——因此,我将很快在这里发布我的结果作为答案。谢谢这里提出的建议听起来很合理,但以我的经验来看,没有任何好处。我不知道为什么,但我猜mxMalloc也会通过缓存拖动所有分配的内存。我自己也尝试过解决同样的问题,但没有找到一个干净的解决方案。值得一看使用malloc()而不是mxMalloc()的计时(实际上不应该这样做),因为计时表明mxMalloc正在通过缓存拖动所有分配的内存(因为代码随着分配的大小的增加而变慢)。还可以尝试使用mxSetPr而不是mxSetData,看看这是否有什么不同。@user664303-我找不到使用mxSetPr的区别-从文档中,它只使用键入的指针,而不是空指针。查看文件交换上James Tursa的uninit实用程序:不确定是否有帮助,但也许你可以从这个问题中得到一些启发
     size       time 1       time 2       time 3       time 4
    
     1000     0.037401     0.037263     0.039294     0.037628
     2000     0.14906      0.14937      0.15278      0.14917
     3000     0.33497      0.33449      0.34601      0.33749
     4000     0.61207      0.60546      0.61563      0.60086
     5000     0.94057      0.93076      0.96147      0.95723
     6000     1.3497       1.3475       1.3794       1.3559
     7000     1.837        1.8265       1.8776       1.846
     8000     2.398        2.3893       2.4625       2.3885
     9000     3.0264       3.047        3.1374       3.0339
    10000     3.7658       3.7677       3.8392       3.7862
    20000    15.208       14.968       15.404       15.143
    30000    13.583       13.58        13.955       13.648
    50000    13.291       13.236       13.535       13.478