在没有*内存分配/初始化的情况下创建mxArray *

时间:2013-12-10 07:48:20

标签: matlab memory-management initialization mex

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

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

  1. 在不将内容归零的情况下,我必须使用哪个命令来创建mxArray
  2. 如何在不为mxArray(和Pr)字段分配内存的情况下构建Pi,我稍后会按mxMalloc分配。
  3. 一个想法是使用大小(0,0)构建数组 - 但这是最​​终解决方案吗?

3 个答案:

答案 0 :(得分:2)

我想,构建一个大小(0,0)矩阵就像它到达一种“空”构造函数一样接近。 之后,您必须使用mxMallocmxRealloc调整数组大小。

我怀疑这会带来显着的性能提升,除非你正在处理非常大的数组。

答案 1 :(得分:2)

有了塞巴斯蒂安的那些台词我就玩了。我想,以下几行显示了我的问题的答案 用语言 - 即使将空间归零,结果也很快 在我目前的应用程序中,我测试了四种不同的场景:

  1. plhs[0] = mxCreateNumericArray(targetDimCount, targetDims, targetClass, mxREAL);
  2. plhs[0] = mxCreateNumericArray(0, 0, targetClass, mxREAL); mxSetData(plhs[0],mxMalloc(destLen_in_Bytes));
  3. plhs[0] = mxCreateNumericArray(0, 0, targetClass, mxREAL); mxSetData(plhs[0],mxRealloc(mxGetData(plhs[0]),destLen_in_Bytes));
  4. plhs[0] = mxCreateUninitNumericArray(targetDimCount, targetDims, targetClass, mxREAL);
  5. 导致那些时间(对于第一列中给出的分配的矩阵矩阵)

     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
    

    考虑到这些数字,我的意见是,重新分配是一个坏主意(但不如时间显示那么糟糕)并且将值归零并不是一个非常大的efford。好吧 - 人们可以进一步想知道10000到30000之间的行为 - 但这会更加科学。使用malloc(仅用于测试目的)不起作用,因为分配的存储需要用于plhs - 除非存储器由mx ***分配,否则它会崩溃

答案 2 :(得分:1)

另一种可能的选择可能是我们未记录的函数mxFastZeros。这是众多undocumented mex functions中的一个。您可以在this Matlab Central answer中了解它的用法。我有兴趣知道它是否有任何不同之处,只需创建一个零大小的矩阵。

相关问题