1 问题描述
在matlab中,如果在每次循环中增加一个数组元素,直接对数组进行赋值时,如果没有预先分配好内存,那么matlab在每次运行到此处时,都会重新向系统申请一次内存,从而导致程序运行速度变得很慢。
2 解决方法
预先分配数组内存,可以适当地划分大一点的内存以保证满足数组的长度要求。
3 案例说明
首先需要明确,matlab可以实用tic和toc计算程序之间所耗费的时间。
(1) 没有预先分配内存时
tic
for i = 1:10000000
a(i) = i;
end
toc
得到的结果如下:
(2) 分配内存时
tic
a = zeros(1, 10000000);
for i = 1:10000000
a(i) = i;
end
toc
得到的结果如下:
计算二者之间的差距:
可以看到,速度相差了19倍,这对于大型的代码工程而言无疑是致命的。因此,在编写程序时,应该多学习如何预先分配内存。
4 拓展说明
如果连续两次输入没有预先分配内存的程序,可以明显发现第二次所耗费的时间非常少。举例如下:
tic
for i = 1:10000000
a(i) = i;
end
toc
tic
for i = 1:10000000
a(i) = i;
end
toc
得到的结果分别为:
这是因为Matlab已经在执行第一次命令时生成了a这个变量,并将其存放在内存,这样第二次执行命令时,a变量已经存在,并且其长度足够,因此matlab不再需要申请内存,节省了时间。
但是这样做会存在弊端,假如第一次的变量a长度为10,而第二次的长度为9,那么第10个数据对于第二次来说就是无用的脏数据,会对后面的数据产生不利的影响。因此,建议对于重复的变量名,先进行
clear a
清除变量后,再预分配内存,这样就能避免上述问题。
相关文章
发表评论