添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

报错信息翻译:

指示的变量或数组的大小似乎随着每次循环迭代而改变。 通常,出现此消息是因为阵列通过分配或连接而增长。 通过分配或连接来增长阵列可能很昂贵。 对于大型数组,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:可以通过多定义一个变量避免数组迭代来消除MATLAB的报错,其实实验1与实验 2在执行过程中,内存变化情况都完全相同,当将一个数组赋值给另一个变量时,不会为新变量分配内存,新变量只是到原来数组的引用,直到新变量中元素值改变时,才会为其分配内存。两个实验数组变化次数相同,其内存变化次数必定相同,使用时间必定相同。

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

目录 一、问题分析报错信息翻译: 二、问题分析1.官方文档分析 三、扩展实验实验1实验2 一、问题分析 首先查看报错信息: 报错信息翻译: 指示的变量或数组的大小似乎随着每次循环迭代而改变。 通常,出现此消息是因为阵列通过分配或连接而增长。 通过分配或连接来增长阵列可能很昂贵。 对于大型数组,MATLAB必须分配一个新的内存块,并在进行每次赋值时将较旧的数组内容复制到新数组中。 以这种方式更改变量大小的程序可以将大部分运行时间花在这种低效的活动上。 出于同样的原因,在缩小..
目录一、问题分析报错信息翻译:二、问题分析1.官方文档分析功能快捷键合理的创建标题,有助于目录的生成如何 改变 文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 一、问题分析...
这个警告意味着你在 MATLAB 脚本中使用了一个循环,循环 迭代 中修改了 变量 的大小,但是未对该 变量 进行预分配。这可能 影响脚本的效率和性能。 解决方案是:在循环开始前,通过预先 分配内存 来提 脚本的性能。例如,如果要循环一百次并将结果保存在数组中,可以在循环前执行以下操作: result = zeros(1, 100); for i = 1:100 result(i) = ...
在使用 MATLAB 进行大规模计算时,预 分配内存 可以显著提 运算 速度 。这是因为 MATLAB 在运行时需要不断申请和释放内存空间,如果事先预分配好内存空间,就可以减少这个过程的时间消耗。 以下是一个简单的例子,演示如何在 MATLAB 中预 分配内存 : % 设置计算所需的 变量 的大小 n = 1000; m = 1000; % 预 分配内存 A = zeros(n, m); % 使用循环计算 for i = 1:n for j = 1:m A(i,j) = i*j; 在这个例子中,我们首先设置了 变量 `n` 和 `m` 的大小,然后使用 `zeros` 函数创建一个 `n` 行 `m` 列的全零矩阵 `A`。最后,我们使用双重循环计算矩阵 `A` 的每个元素,并将结果存储在 `A` 中。 通过预 分配内存 ,我们避免了在循环中不断申请和释放空间的过程,从而提 了程序的运行 速度
Anaconda换了清华镜像源后还是CondaHTTPError: HTTP None None for url https://mirrors.tuna.tsinghua... Tauseer: 就这个最管用,其他的一直是为网络连接错误 Windows+Python 2.7 成功安装 Tensorflow 1.4.0 不知道取啥名好: 你好 请问你解决这个问题了吗 Windows+Python 2.7 成功安装 Tensorflow 1.4.0 alfinest: 博主您好我按您的方法在python2.7环境下安装tensorflow1.7,但在pip install tensorflow-1.7.0-cp27-cp27m-win_amd64.whl时,无论在windows还是在linux下都出现了这个报错ERROR: tensorflow-1.7.0-cp27-cp27m-win_amd64.whl is not a supported wheel on this platform.请问您知道原因吗 【算法】棋盘覆盖详解,基础教程~ 你可以看一下电子版书籍,里面应该有复杂度分析