我想加快我写在Matlab中的动态分配内存到矩阵的脚本(基本上是从文件读取一行数据并将其写入矩阵,然后读取另一行并为更大的矩阵分配更多内存以存储下一行)。我之所以这么做,是因为我不知道矩阵需要保存所有数据的确切大小,而不是使用零()或者其他的预分配内存。我也不知道矩阵的最大尺寸,所以我不能预先分配最大尺寸,然后摆脱我没有使用的内存。这对于少量数据来说很好,但现在我需要扩展脚本以读取数百万个数据点,而这种动态分配的实现速度太慢了。最大尺寸未知时MatLab内存分配
所以这里是我加速脚本的尝试:我尝试使用zeroes函数在大块中分配内存,然后一旦块被填充,我分配另一个大块。下面是一些示例代码:
data = [];
count = 0;
for ii = 1:num_filelines
if mod(count, 1000) == 0
data = [data; zeroes(1000)]; %after 1000 lines are read, allocate another 1000 line
end
data(ii, :) = line_read(file); %line_read reads a line of data from 'file'
end
不幸的是,这并不工作,当我运行它,我得到一个错误说“被串联使用vertcat矩阵 尺寸误差并不一致。”
所以,这里是我的问题:这种在大块中分配内存的方法实际上比增量动态分配的速度快,以及为什么上面的代码没有运行?谢谢您的帮助。
当你做零(1000)时,你正在分配一个1000x1000的零矩阵。这可能是你的代码没有运行的原因。至于分配速度,在matlab中预先分配总是好的,但是在读取行时不是使用数组,而是使用单元格来存储数据。这样你就没有太多问题。要么,要么使用稀疏矩阵。 – MZimmerman6
这将取决于您使用的Matlab版本。最近的版本在动态内存分配方面表现得非常快。 [阅读更多](http://undocumentedmatlab.com/blog/array-resizing-performance/)。 – horchler