2017-06-21 231 views
5

当我在Matlab中遇到警告时,我正在为Andrew Ng编写Coursera机器学习课程的函数。我没有写出答案应该是什么,但是出于解释目的,起始代码全部在这里,除了一行外。问题不在于解决问题的答案,而在于解释Matlab的警告。为什么Matlab警告我“不推荐使用预分配”

警告(不是错误)我得到说:

Line 6: The variable 'g' appears to be preallocated but preallocation is not recommended here 

下面的代码

function g = sigmoid(z) 
%SIGMOID Compute sigmoid function 
% g = SIGMOID(z) computes the sigmoid of z. 

% You need to return the following variables correctly 
g = zeros(size(z)); 

% ====================== YOUR CODE HERE ====================== 
% Instructions: Compute the sigmoid of each value of z (z can be a matrix, 
%    vector or scalar). 

g = 1./z; 

% ============================================================= 

end 
+2

当您分配数组的各个元素时,预分配可能很有用。不是当您一次替换整个阵列时。 – aschepler

回答

7

此覆盖在MathWorks公司的a blog post by Loren Shure,具体节下“的共同误读”。一小段摘录:

用户被经常被告知预先分配,我们有时会看到代码中的变量被预先分配,即使它是不必要的。这不仅使代码复杂化,而且实际上可能导致预分配旨在缓解的问题,即运行时性能和峰值内存使用量。你的情况和例子罗兰给人之间

绘制的相似之处,你预分配gzeros功能,但随后的1./z结果重新分配它。当1./z被评估时,由zeros调用分配的内存将被简单丢弃。这样做的效果是需要两倍的内存,一块用于预分配的零和一块用于1./z的结果。

总之,在这种情况下,相信Code Analyzer

+0

那么'g(:) = 1./z;'?这应该工作。假设'g'和'z'是巨大的变量,在这种情况下是否可以预先分配? – thewaywewalk

+1

@thewaywewalk:在示例代码中使用'g(:) = 1./z;'将*移除警告并通过代码分析器高亮显示,并且*可以*避免冗余的内存分配,但我怀疑预分配在这种情况下,你会得到任何东西。充其量,我认为这将是一次洗牌:没有缺点,但也没有真正的优势。 – gnovice

+0

g(:)与g本身有什么不同? – heretoinfinity

2

线

g = zeros(size(z));

是多余的,因为后马上你将g重新定义为

g = 1./z;

相关问题