一、问题分析

首先查看报错信息:

报错信息

报错信息翻译

指示的变量或数组的大小似乎随着每次循环迭代而改变。 通常,出现此消息是因为阵列通过分配或连接而增长。 通过分配或连接来增长阵列可能很昂贵。 对于大型数组,MATLAB必须分配一个新的内存块,并在进行每次赋值时将较旧的数组内容复制到新数组中。 以这种方式更改变量大小的程序可以将大部分运行时间花在这种低效的活动上。

出于同样的原因,在缩小数组或在每次迭代中改变变量的大小时会产生很大的开销。
大概意思是说,再循环体中不断扩大数组的大小操作,因为每次扩充数组大小都要进行一次内存大小判断(内存不够时还要进行内存扩充),这两个过程是非常耗时的,所以软件不建议在循环体中更改数组大小。这是问题所在。

二、问题分析

1.官方文档分析

这个问题在MATLAB官方文件中也提到了
【MATLAB 如何分配内存】
https://ww2.mathworks.cn/help/matlab/matlab_prog/memory-allocation.html

MATLAB官方给出的解决方案是:在使用这个数组之前先自己判断数组最大是多少,定义数组时先定义个足够大的零数组,然后再使用该数组。官方称之为:预分配。
【预分配】
https://ww2.mathworks.cn/help/matlab/matlab_prog/preallocating-arrays.html
在【预分配】文档中的两个例子中,使用之前没有定义足够大小变量的例子,MATLAB会报错,虽然报错,但也可以运行(由此看来是风险性报错),只是执行速度较慢
Elapsed time is 0.301528 seconds.
例一
使用之前已经定义足够大小变量的例子不会报错,执行速度比上个例子快
Elapsed time is 0.011938 seconds.
例二
总结1:由此可以看出,当提示这种错误时,若自知该程序占用内存以及时间在可接受范围内,且不知应定义多大的数组空间时,可以忽略该错误。不过建议在使用之前先定义足够大的变量

三、扩展实验

因为官方文档给出的是只要变量自身迭代才会报错,所以可以多使用一个函数避免自身迭代来避免该问题,如下:
在这里插入图片描述

实验1

将源代码提取小的实验代码如下:
在这里插入图片描述
报错,可以正常运行,运行结果正确,运行时间如下:
在这里插入图片描述

实验2

将代码改成如下:
在这里插入图片描述
不报错,运行时间约等于实验1,如下:
在这里插入图片描述
总结2:可以通过多定义一个变量避免数组迭代来消除MATLAB的报错,其实实验1与实验 2在执行过程中,内存变化情况都完全相同,当将一个数组赋值给另一个变量时,不会为新变量分配内存,新变量只是到原来数组的引用,直到新变量中元素值改变时,才会为其分配内存。两个实验数组变化次数相同,其内存变化次数必定相同,使用时间必定相同。

【实验结论引用】
http://blog.sina.com.cn/s/blog_62195b800101iqlg.html

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐