在Matlab中我们可以定义一个空矩阵
mtx = [];
然后后面再给它加入一些数据,而且这个矩阵大小可以随着我们填入数据的多少而变化。像下面这个程序
tic
n = 1000;
mtrx = [];
init = 1.0;
for i = 1:n
for j=1:n
mtrx(i,j) = init + 1.0;
end
end
toc
这个程序的运行时间是多久呢?在我电脑上是0.2秒。
那这个程序有什么问题呢?就是我们没有为这个矩阵分配一个内存空间,而且在循环中,矩阵大小是变化的,这就导致每次循环时都浪费额外的时间去寻找满足需求的内存空间,将改变大小后的矩阵整体移动到这个新的内容空间中,并释放原来的内存空间,这除了会影响代码的运行效率,还容易形成内存碎片,让程序越来越难找到满足条件的内存。
因此在循环前给矩阵预分配内存是很一个良好的习惯,如果没有这个习惯,你还可以通过Matlab自带的代码检查器来查看是否存在类似问题。
所以,我们应该把程序修改如下:
tic
n = 1000;
mtrx = zeros(n,n);
init = 1.0;
for i = 1:n
for j=1:n
mtrx(i,j) = init + 1.0;
end
end
toc
这个程序只用了0.007秒的时间就运行完成了,可见它们的差距有多大。
内存预分配
在Matlab中我们可以定义一个空矩阵
mtx = [];
然后后面再给它加入一些数据,而且这个矩阵大小可以随着我们填入数据的多少而变化。像下面这个程序
tic
n = 1000;
mtrx = [];
init = 1.0;
for i = 1:n
for j=1:n
mtrx(i,j) = init + 1.0;
end
end
toc
这个程序的运行时间是多久呢?在我电脑上是0.2秒。
那这个程序有什么问题呢?就是我们没有为这个矩阵分配一个内存空间,而且在循环中,矩阵大小是变化的,这就导致每次循环时都浪费额外的时间去寻找满足需求的内存空间,将改变大小后的矩阵整体移动到这个新的内容空间中,并释放原来的内存空间,这除了会影响代码的运行效率,还容易形成内存碎片,让程序越来越难找到满足条件的内存。
因此在循环前给矩阵预分配内存是很一个良好的习惯,如果没有这个习惯,你还可以通过Matlab自带的代码检查器来查看是否存在类似问题。
所以,我们应该把程序修改如下:
tic
n = 1000;
mtrx = zeros(n,n);
init = 1.0;
for i = 1:n
for j=1:n
mtrx(i,j) = init + 1.0;
end
end
toc
这个程序只用了0.007秒的时间就运行完成了,可见它们的差距有多大。