gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:14:11 25 4
gpt4 key购买 nike

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

与某些编程语言不同,MATLAB 不要求变量在使用前明确初始化。例如,在脚本文件中途定义“myVector”是完全有效的:

myVector = vectorA .* vectorB

我的问题是:将变量(例如上面的“myVector”)初始化为零然后为其赋值更快,还是在整个程序中不断初始化事物更快?

这是我所说内容的直接比较:

全程初始化:

varA = 8;
varB = 2;

varC = varA - varB;
varD = varC * varB;

开始时初始化:

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

varC = varA - varB;
varD = varC * varB;

一方面,无缘无故多出这些代码行似乎有点浪费。不过,另一方面,一次为一个程序分配所有内存而不是在运行时分散分配会更快,这有点道理。

有没有人有点见识?

最佳答案

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

enter image description here

如果你进入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...

在我们的例子中,出现此警告的原因是代码未使用所有值。因此,这澄清了初始化/预分配对这种情况没有帮助。


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

根据我的经验,当您稍后需要对其中的一部分进行索引时,预分配会有所帮助。

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

varC = zeros(...)
varD = zeros(...)
varC(k,:) = varA - varB;
varD(k,:) = varC * varB;

同样,如果您超出 varC 的大小进行索引,MATLAB 会花费时间尝试为其分配更多的内存空间,因此这会减慢速度。因此,将输出变量预分配到您认为将用于存储结果的最大大小。但是,如果您不知道结果的大小,您就会陷入困境,必须将结果附加到输出变量中,这肯定会减慢速度。

关于performance - 初始化或预分配的最佳实践 - MATLAB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26788449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com