罗兰在MATLAB的艺术

把想法变成MATLAB

理解数组预先配置

今天我想介绍嘉宾博客作者杰里米·格林沃尔德在MathWorks在开发团队工作。杰里米工作代码分析器和将讨论当preallocating MATLAB数组是有用的,当它应该被避免。

内容

为什么预先配置是有用的

有很多讨论预先配置的资源,比如我们的部分文档和文章讨论改进MATLAB分配策略。当我们将快速回顾预先配置的主题,鼓励读者不熟悉这个主题阅读所提供的链接。

想象我们编写下面的小函数获取数据从外部来源。函数返回的变量数据分配后,一次一个元素。

函数data = fillDataidx = 1:10 0的数据(idx) = fetchData ();结束结束

MATLAB将重新分配内存时无数次执行这个循环。后重新分配内存,MATLAB将旧值复制到新的内存位置。这种内存分配和复制的值可以非常昂贵的计算时间。它还增加峰值内存使用情况的影响,由于新旧副本必须存在一段时间。

在这个例子中我们知道变量的最终大小数据1 -到- 100,所以我们可以很容易地解决这个问题通过preallocating变量0函数。在这个版本的函数中,只有一个单一的内存分配和数据的值不会从一个位置复制到另一个地方。

函数data = fillDataWithPreallocation data = 0 (1100);idx = 1:10 0的数据(idx) = fetchData ();结束结束

虽然这可能不是一个重要的优化对于小数据大小(如1 -到- 100),它可以是一个显著的改善是否大的数据的大小。例如,在一个图像处理应用程序中,数据可能包含成千上万的高分辨率图像,每幅图像使用数百兆字节的内存。这样的应用程序,正确使用预先配置会导致显著改善执行时间。

分析仪和MATLAB的代码编辑器

MATLAB编辑器使用一个功能叫做代码分析器检测某些编程模式,可能不是最优的。如何重写这些代码分析器提供建议模式。然后与强调这样的代码编辑器。如果你复制粘贴上面第一个函数到MATLAB编辑变量数据出现在橙色下划线。悬停在该变量与光标将导致出现一个工具提示以下信息。

变量的数据似乎在每个循环迭代改变大小。考虑preallocating速度。

工具提示还包含一个按钮细节。点击那个按钮导致工具提示框扩大和包含消息的一个更完整的解释。最后,在富勒的解释是MATLAB文档的链接部分已经提到这篇文章。MATLAB试图提供很多指导何时以及如何preallocate。第一个函数所示

还有其他代码模式,也会导致一个变量变化的大小,预先配置会有所帮助。代码分析器可以捕获这些常见的模式。下面的函数包含几个例子。

函数data = fillLotsOfData%所有三个不同的变量内部增长循环%和所有三个是强调了在MATLAB编辑器data2 = [];data3 = [];idx = 1:10 0 data1 (idx) = fetchData ();data2结束(+ 1)= fetchSomeOtherData ();data3 = [data3 fetchYetMoreData ()];结束data = {data1、data2 data3};结束

一个常见的误解

用户经常被告知preallocate我们有时看到代码变量是预先分配,即使它是不必要的。这不仅使代码,但可以引起的问题预先配置是为了缓解,即。,运行时的性能和内存使用峰值。不必要的预先配置通常看起来是这样的。

函数data = fillDataWithUnecessaryPreallocation%注意代码分析器的消息%的值分配给变量的数据可能是未使用的。data = 0 (1100);data = fetchAllData ();结束

的变量数据首先是预先分配的0函数。然后重新分配的返回值fetchAllData。第二个任务会造成预先配置的问题是要避免的。通过调用分配的内存0不能返回的数据的重用fetchAllData。相反,它是扔掉一旦调用fetchAllData成功的回报。这需要两倍的效果根据需要记忆,为预先分配0和一大块一大块的返回值fetchAllData

请注意,如果你复制粘贴上面的代码到MATLAB编辑器,下面的代码分析器消息出现。

分配给变量的值可能是未使用的数据。

这是一个迹象表明值(因此底层内存)第一次分配数据永远不会被使用。这条消息的出现在一行的代码preallocating预先配置的变量是一个好的迹象是不必要的。由于代码分析器可以检测很多模式,将受益于预先配置,如果代码分析器不检测这样一个模式,它检测到一个未使用的变量,这些表明不需要预先配置的可能性很高。虽然代码分析器可能会偶尔想念代码模式可能受益于预先配置,它可以依靠捕捉最常见的这种模式。

结论

Preallocating不是免费的。因此你不应该preallocate默认所有大变量。相反,你应该依赖于代码分析仪检测可能受益于预先配置的代码。如果一个预先配置线导致未使用的消息出现,试着删除这条线,看到如果变量改变大小消息出现。如果此消息不出现,那么原来的线可能有相反的效果你是希望。

你看到变量未使用的消息了吗?你已经被这个消息吗?代码分析器可以采取哪些措施使它更清楚,有一个问题?让我们知道在这里




发表与MATLAB®R2012b

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。