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