我经常通过在mex中实现它们来优化一些matlab例程。
到目前为止,此工作正常 - 但每当创建返回mxArray
时,它都会在我使用mxCreateNumericArray
构建它时进行预初始化。
在我的大多数工作中,我不需要预先分配内存(归零)。很难过 - 我找不到匹配的命令(分配内存而不归零)。
所以我的问题可以用两种方式回答:
mxArray
?mxArray
(和Pr
)字段分配内存的情况下构建Pi
,我稍后会按mxMalloc
分配。一个想法是使用大小(0,0)构建数组 - 但这是最终解决方案吗?
答案 0 :(得分:2)
我想,构建一个大小(0,0)矩阵就像它到达一种“空”构造函数一样接近。
之后,您必须使用mxMalloc
或mxRealloc
调整数组大小。
我怀疑这会带来显着的性能提升,除非你正在处理非常大的数组。
答案 1 :(得分:2)
有了塞巴斯蒂安的那些台词我就玩了。我想,以下几行显示了我的问题的答案 用语言 - 即使将空间归零,结果也很快 在我目前的应用程序中,我测试了四种不同的场景:
plhs[0] = mxCreateNumericArray(targetDimCount, targetDims, targetClass, mxREAL);
plhs[0] = mxCreateNumericArray(0, 0, targetClass, mxREAL); mxSetData(plhs[0],mxMalloc(destLen_in_Bytes));
plhs[0] = mxCreateNumericArray(0, 0, targetClass, mxREAL); mxSetData(plhs[0],mxRealloc(mxGetData(plhs[0]),destLen_in_Bytes));
plhs[0] = mxCreateUninitNumericArray(targetDimCount, targetDims, targetClass, mxREAL);
导致那些时间(对于第一列中给出的分配的矩阵矩阵)
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中了解它的用法。我有兴趣知道它是否有任何不同之处,只需创建一个零大小的矩阵。