matlab在数组中插入,一次快速插入一个Matlab数组元素
我正試圖加速我的代碼中的主要瓶頸 . 它是將數(shù)組元素插入數(shù)組的中間 . 這些元素必須一次插入一個(gè),因?yàn)槲沂孪炔⒉恢?. 我無法收集它們并立即將它們?nèi)坎迦?#xff0c;因?yàn)樯院蟪霈F(xiàn)的元素(以及它們的插入位置)以復(fù)雜的方式依賴于更新的數(shù)組 .
我推測(cè)速度限制是由于兩個(gè)因素造成的:(1)矢量一次生長(zhǎng)一個(gè)元素,以及(2)復(fù)制插入元素時(shí)需要向右碰撞的所有元素 . 因子#2有點(diǎn)簡(jiǎn)化,因?yàn)槲覒岩稍诓迦胄略貢r(shí)整個(gè)更新的矢量是完整的 . 我認(rèn)為我沒有解決因素#2的解決方案,但我確實(shí)嘗試了因子#1的一些可能性 - 即預(yù)分配 .
以下測(cè)試表明,我嘗試的替代方法無法改進(jìn)我當(dāng)前的方法(無預(yù)分配) . 測(cè)試使用內(nèi)部循環(huán)迭代地將新元素插入到數(shù)組的位置2中 . out循環(huán)只是重復(fù)執(zhí)行此測(cè)試100次以獲得更好的定時(shí)統(tǒng)計(jì)數(shù)據(jù) .
clc; Ntests=1e4;
disp('1) Pre-allocate, update vector in-place without creating new array.')
tic
for j = 1 : Ntests
clear a
a(100) = 0;
a(1)=1;
for i = 2:100
a(3:end) = a(2:99);
a(2) = i;
end % i
end % j
toc
disp('2) Pre-allocate, copy & create new array by concatenation.')
tic
for j = 1 : Ntests
clear a
a(100) = 0;
a(1)=1;
for i = 2:100
a = [ a(1) i a(2:end-1) ];
end % i
end % j
toc
disp('3) No pre-allocation (current method).')
tic
for j = 1 : Ntests
clear a
a(1)=1;
for i = 2:100
a = [ a(1) i a(2:end) ];
end % i
end % j
toc
結(jié)果是:
1) Pre-allocate, update vector in-place without creating new array.
Elapsed time is 2.359021 seconds.
2) Pre-allocate, copy & create new array by concatenation.
Elapsed time is 4.221047 seconds.
3) No pre-allocation (current method).
Elapsed time is 2.248106 seconds.
情況真的像這樣令人沮喪,還是我可以對(duì)瓶頸做些什么呢?
Context of the problem:
每個(gè)雙數(shù)組代表機(jī)器的時(shí)間線,雙精度數(shù)是使用期間的開始時(shí)間 . 結(jié)束時(shí)間存儲(chǔ)在另一個(gè)雙數(shù)組中 . 對(duì)于每個(gè)使用期限,除了開始時(shí)間和結(jié)束時(shí)間之外還有其他字段 . 所以我有一些數(shù)組,每個(gè)字段一個(gè) .
當(dāng)我獲得一段時(shí)間的新需求時(shí),它是一個(gè)值集合的形式,每個(gè)字段一個(gè),我必須看看它是否適合時(shí)間軸(我有其他邏輯來確定,我'我也在試圖加速) . 如果它不合適,我會(huì)轉(zhuǎn)到另一個(gè)時(shí)間軸再試一次 . 如果沒有現(xiàn)有的時(shí)間表可以容納新需求的開始到結(jié)束時(shí)間,我會(huì)創(chuàng)建另一臺(tái)具有空白時(shí)間軸的計(jì)算機(jī) .
假設(shè)一段使用時(shí)間由N個(gè)字段組成,其中開始和結(jié)束時(shí)間是這些字段中的兩個(gè) . 每個(gè)時(shí)間軸表示為N個(gè)數(shù)組,而不是N個(gè)字段的結(jié)構(gòu)數(shù)組 . 這是因?yàn)榻?jīng)驗(yàn)測(cè)試和網(wǎng)上沖浪表明N個(gè)標(biāo)量數(shù)組的操作速度比N個(gè)字段的單個(gè)結(jié)構(gòu)數(shù)組更快 . 但是,如果我必須更新N個(gè)標(biāo)量數(shù)組只是為了插入一個(gè)使用期限,這可能不再適用,我還沒有測(cè)試過 . (我修改了使用數(shù)組字段從struct數(shù)組遷移到struct的代碼,并且需要一些時(shí)間才能返回) .
上面的代碼僅用于測(cè)試插入數(shù)組中間的開銷 . 它并不意味著模擬此Context部分中描述的整個(gè)問題 .
請(qǐng)注意,我在下面的評(píng)論中同意這是一個(gè)優(yōu)先級(jí)隊(duì)列問題 . 這假設(shè)每個(gè)新的使用期已經(jīng)由我的其他邏輯確定以適應(yīng)時(shí)間線,然后將開始時(shí)間視為優(yōu)先級(jí) . 然而,經(jīng)過反思,它并不是真正的完整優(yōu)先級(jí)隊(duì)列問題,因?yàn)橹钡阶詈笪也耪嬲龔年?duì)列中取出任何東西 . 因此,它是簡(jiǎn)化使用優(yōu)先級(jí)隊(duì)列來構(gòu)建時(shí)間軸 .
雖然我還沒有為優(yōu)先級(jí)隊(duì)列選擇和合并公開可用的Matlab代碼,但我仍然有50%的信心確認(rèn)會(huì)有凈加速 . 這是因?yàn)樵贛atlab中調(diào)用函數(shù)的速度很慢,并且每個(gè)時(shí)間線在完全構(gòu)建時(shí)平均包含不到六個(gè)使用期(至少對(duì)于當(dāng)前的問題集) . 因此,與調(diào)用函數(shù)來更新優(yōu)先級(jí)隊(duì)列相比,簡(jiǎn)單插入很可能是構(gòu)建時(shí)間軸的最快方式 . 當(dāng)我有機(jī)會(huì)嘗試時(shí),我會(huì)更新這個(gè)問題 .
總結(jié)
以上是生活随笔為你收集整理的matlab在数组中插入,一次快速插入一个Matlab数组元素的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO 数据恢复:如何从 OPPO 手
- 下一篇: matlab数组做运算,6.2 MATL