2017-06-21 234 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;

相關問題