亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

變量似乎在每次循環迭代時改變大小 - 什么?

變量似乎在每次循環迭代時改變大小 - 什么?

變量似乎在每次循環迭代時改變大小 - 什么?在編寫以下Matlab代碼時:for ii=1:n     x(ii) = foo( ii ); % foo is some function of ii that cannot be vectorized.end我得到以下m-lint警告:變量x似乎在每次循環迭代時改變大小我的問題:這個警告意味著什么?為什么每次迭代都會改變變量大小是件壞事?怎樣才能解決這個問題?這個問題是不能重復的這一個,因為它與預分配的更一般的問題,而是它的一個特定實例涉及。
查看完整描述

3 回答

?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

我的回答有點遲了,但我在MATLAB中提到了有關數組增長和預分配的一些內容。

首先要注意的是,MATLAB在最近的版本中已經大大提高了自動陣列增長性能,因此如果你做得正確,警告所暗示的性能可能不會太差(見下文)。不過,最佳做法是預先分配您的數組(例如zeros)。

警告說明

自R2014a起,警告的詳細說明如下:

指示的變量或數組的大小似乎隨著每次循環迭代而改變。通常,出現此消息是因為數組通過賦值或連接而增長。通過分配或連接來增長陣列可能很昂貴。對于大型數組,MATLAB必須分配一個新的內存塊,并在進行每次賦值時將較舊的數組內容復制到新數組中。

以這種方式改變變量大小的程序可以將大部分運行時間花在這種低效的活動上。...

從這個摘錄中可以清楚地看出,如果你完全關注性能,預分配是一個聰明的想法。

旁注:關于在陣列增長期間用于重新分配的算法的信息有限,但是一些信息是由Steve Eddins在同一篇博客文章中提供的,我在前面的答案對此進行了總結。

自動陣列增長優化

如果要通過沿維度增長(不預分配)來使用動態數組大小調整,則可以采用正確的方法。請參閱Steve Eddins撰寫的MathWorks博客文章。最重要的是要注意你應該沿著最后一個維度增長以獲得最佳性能。在您的情況下這不是問題,因為數組是1D。因此,如果您決定讓它騎行,請%#ok<SAGROW>在罪魁禍首代碼之后與警告放在同一行,以使警告靜音。

Yair 在他博客的另一篇文章中討論了動態數組調整大小。此外,有一些方法可以在不使用一些毛茸茸的MEX API雜技進行初始化的情況下分配數組,但就是這樣。

預分配

建議進行預分配。養成習慣,學會愛zeros。如果你決心從MATLAB中擠出一點性能,Yair Altman就內存預分配這個主題提出了幾篇很好的文章:


查看完整回答
反對 回復 2019-07-30
  • 3 回答
  • 0 關注
  • 1606 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號