Matlab 创建mxArray*而不进行*内存分配/初始化
我经常通过在mex中实现来优化一些matlab例程。 到目前为止,这一切都很正常-但是每当创建返回Matlab 创建mxArray*而不进行*内存分配/初始化,matlab,memory-management,initialization,mex,Matlab,Memory Management,Initialization,Mex,我经常通过在mex中实现来优化一些matlab例程。 到目前为止,这一切都很正常-但是每当创建返回mxArray,它都会在我使用mxCreateNumericArray构建它时被预先初始化 在我的大部分工作中,我不需要预先分配内存(归零)。很悲哀-我找不到一个匹配的命令用于此目的(分配内存而不归零) 所以我的问题可以用两种方式来回答: 要创建mxArray而不将内容归零,我必须调用哪个命令 如何在不为Pr(和Pi)字段分配内存的情况下构建mxArray,稍后我将通过mxMalloc分配该字段 一
mxArray
,它都会在我使用mxCreateNumericArray
构建它时被预先初始化在我的大部分工作中,我不需要预先分配内存(归零)。很悲哀-我找不到一个匹配的命令用于此目的(分配内存而不归零) 所以我的问题可以用两种方式来回答:
mxArray
而不将内容归零,我必须调用哪个命令Pr
(和Pi
)字段分配内存的情况下构建mxArray
,稍后我将通过mxMalloc
分配该字段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)代码>
从这些数字来看,我的观点是,重新分配是一个坏主意(但并没有那么坏,正如时间所显示的那样),而将这些值归零也不是一个很大的努力。好吧,我们可以进一步怀疑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