初始化或预分配的最佳实践 - MATLAB

h3h*_*alf 3 performance matlab

我的问题并不明确依赖于一段代码,而是更具概念性.

与某些编程语言不同,MATLAB不需要在使用变量之前对其进行明确初始化.例如,在脚本文件的中途定义"myVector"是完全有效的:

myVector = vectorA .* vectorB
Run Code Online (Sandbox Code Playgroud)

我的问题是:将变量(例如上面的'myVector')初始化为零然后为它们赋值,或者在整个程序中保持初始化是否更快?

这是我正在谈论的直接比较:

整个初始化:

varA = 8;
varB = 2;

varC = varA - varB;
varD = varC * varB;
Run Code Online (Sandbox Code Playgroud)

在开始时初始化:

varA = 8;
varB = 2;
varC = 0;
varD = 0;

varC = varA - varB;
varD = varC * varB;
Run Code Online (Sandbox Code Playgroud)

一方面,无缘无故地拥有这些额外的代码行似乎有点浪费.但另一方面,有一点意义是,一次为程序分配所有内存而不是在运行时分散会更快.

有没有人有点洞察力?

Div*_*kar 5

将您的Initializing at start:代码复制并粘贴到MATLAB编辑器窗口中,您会收到如下警告:

在此输入图像描述

如果你进入Details,你会读到这个 ​​-

Explanation 
The code does not appear to use the assignment to the indicated variable. This situation occurs when any of the following are true:
Another assignment overwrites the value of the variable before an operation uses it.
The specified argument value contains a typographical error, causing it to appear unused.
The code does not use all values returned by a function call...
Run Code Online (Sandbox Code Playgroud)

在我们的例子中,这个警告的原因是The code does not use all values.因此,这澄清了初始化/预分配对这种情况没有帮助.


我们什么时候应该预先分配?

根据我的经验,预分配有助于您以后需要将索引编入其中的一部分.

因此,如果您需要索引varC存储结果的一部分,预分配将有所帮助.因此,这会更有意义 -

varC = zeros(...)
varD = zeros(...)
varC(k,:) = varA - varB;
varD(k,:) = varC * varB;
Run Code Online (Sandbox Code Playgroud)

同样,在索引时,如果你超出了大小varC,MATLAB会花时间尝试为它分配更多的内存空间,这样会慢一点.因此,将输出变量预分配到maximum size您认为用于存储结果的变量.但是,如果你不知道结果的大小,你就会陷入困境并且必须将结果附加到输出变量中,这肯定会减慢速度.