3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
我的回答有點(diǎn)遲了,但我在MATLAB中提到了有關(guān)數(shù)組增長(zhǎng)和預(yù)分配的一些內(nèi)容。
首先要注意的是,MATLAB在最近的版本中已經(jīng)大大提高了自動(dòng)陣列增長(zhǎng)性能,因此如果你做得正確,警告所暗示的性能可能不會(huì)太差(見下文)。不過,最佳做法是預(yù)先分配您的數(shù)組(例如zeros
)。
警告說明
自R2014a起,警告的詳細(xì)說明如下:
指示的變量或數(shù)組的大小似乎隨著每次循環(huán)迭代而改變。通常,出現(xiàn)此消息是因?yàn)閿?shù)組通過賦值或連接而增長(zhǎng)。通過分配或連接來增長(zhǎng)陣列可能很昂貴。對(duì)于大型數(shù)組,MATLAB必須分配一個(gè)新的內(nèi)存塊,并在進(jìn)行每次賦值時(shí)將較舊的數(shù)組內(nèi)容復(fù)制到新數(shù)組中。
以這種方式改變變量大小的程序可以將大部分運(yùn)行時(shí)間花在這種低效的活動(dòng)上。...
從這個(gè)摘錄中可以清楚地看出,如果你完全關(guān)注性能,預(yù)分配是一個(gè)聰明的想法。
旁注:關(guān)于在陣列增長(zhǎng)期間用于重新分配的算法的信息有限,但是一些信息是由Steve Eddins在同一篇博客文章中提供的,我在前面的答案中對(duì)此進(jìn)行了總結(jié)。
自動(dòng)陣列增長(zhǎng)優(yōu)化
如果要通過沿維度增長(zhǎng)(不預(yù)分配)來使用動(dòng)態(tài)數(shù)組大小調(diào)整,則可以采用正確的方法。請(qǐng)參閱Steve Eddins撰寫的MathWorks博客文章。最重要的是要注意你應(yīng)該沿著最后一個(gè)維度增長(zhǎng)以獲得最佳性能。在您的情況下這不是問題,因?yàn)閿?shù)組是1D。因此,如果您決定讓它騎行,請(qǐng)%#ok<SAGROW>
在罪魁禍?zhǔn)状a之后與警告放在同一行,以使警告靜音。
Yair 在他博客的另一篇文章中討論了動(dòng)態(tài)數(shù)組調(diào)整大小。此外,有一些方法可以在不使用一些毛茸茸的MEX API雜技進(jìn)行初始化的情況下分配數(shù)組,但就是這樣。
預(yù)分配
建議進(jìn)行預(yù)分配。養(yǎng)成習(xí)慣,學(xué)會(huì)愛zeros
。如果你決心從MATLAB中擠出一點(diǎn)性能,Yair Altman就內(nèi)存預(yù)分配這個(gè)主題提出了幾篇很好的文章:

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊
關(guān)于這個(gè)問題有很多材料。以下是一些選定的鏈接以獲取更多信息:
官方文檔和技術(shù)解決方案:
MathWorks博客:
社區(qū)博客:
相關(guān)Stack Overflow問題/答案:
添加回答
舉報(bào)