2011-11-18 76 views
2

我試圖擠壓腳本的執行時間,避免無用的大矩陣重新分配。 一種像矩陣重新分配

B = A; 

操作引起的小的開銷,因爲B將以A相同的結構點,並且直到更新發生Matlab的將不分配一個新的。

但是,這樣的操作呢?

longVector = longVector(1:n); 

將它簡單地更新longVector結構指向數據更已經存在的子集或(更昂貴的時間)將導致其分配一個新的載體和垃圾舊的?

回答

1

是的,它會縮小分配的塊,但隨着時間的推移它會導致碎片(在Windows系統上)。

+0

好吧,我運行了一些粗略的分析...'清除所有; CLC; tic A = ones(1,100000); toc tic A = A(1:50000); toc tic B = ones(1,50000); toc tic B = A; toc'。 「A」大小調整需要與「B」分配大致相同的時間(因此它看起來不僅僅是重新引用舊的分段),而最後的分配時間的量級要小得多。 – Batsu

0

我不確定這是否會更好(我沒有測試過這個區別),但是您可以改爲嘗試longVector(n+1:end)=[]。我非常肯定,不會分配一個新的變量。

+0

看起來像這樣,比'longVector'初始化本身佔用更多的時間 – Batsu

+0

確保使用你在一個函數內進行計時的代碼完成所有的計時,否則很多優化都不會被應用。嘗試在MATLAB Central File Exchange中使用Steve Eddins的'timeit'函數,該函數爲您處理了許多微妙的問題,比如通過運行幾次來升溫代碼。話雖如此 - 我並不是暗示你會得到不同的結果。 –

0

相信在MATLAB

A = B; 

,除非隨後

clear B; 

使用了最少的內存的兩倍。 至少在Mac和最多幾個版本(2009年左右),它是如此。

順便說一句,你不明白你想在這裏實現什麼? 爲什麼這會提高你的表現?