matlab在数组中插入,一次快速插入一个Matlab数组元素
我正試圖加速我的代碼中的主要瓶頸 . 它是將數組元素插入數組的中間 . 這些元素必須一次插入一個,因為我事先并不知道 . 我無法收集它們并立即將它們全部插入,因為稍后出現的元素(以及它們的插入位置)以復雜的方式依賴于更新的數組 .
我推測速度限制是由于兩個因素造成的:(1)矢量一次生長一個元素,以及(2)復制插入元素時需要向右碰撞的所有元素 . 因子#2有點簡化,因為我懷疑在插入新元素時整個更新的矢量是完整的 . 我認為我沒有解決因素#2的解決方案,但我確實嘗試了因子#1的一些可能性 - 即預分配 .
以下測試表明,我嘗試的替代方法無法改進我當前的方法(無預分配) . 測試使用內部循環迭代地將新元素插入到數組的位置2中 . out循環只是重復執行此測試100次以獲得更好的定時統計數據 .
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
結果是:
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.
情況真的像這樣令人沮喪,還是我可以對瓶頸做些什么呢?
Context of the problem:
每個雙數組代表機器的時間線,雙精度數是使用期間的開始時間 . 結束時間存儲在另一個雙數組中 . 對于每個使用期限,除了開始時間和結束時間之外還有其他字段 . 所以我有一些數組,每個字段一個 .
當我獲得一段時間的新需求時,它是一個值集合的形式,每個字段一個,我必須看看它是否適合時間軸(我有其他邏輯來確定,我'我也在試圖加速) . 如果它不合適,我會轉到另一個時間軸再試一次 . 如果沒有現有的時間表可以容納新需求的開始到結束時間,我會創建另一臺具有空白時間軸的計算機 .
假設一段使用時間由N個字段組成,其中開始和結束時間是這些字段中的兩個 . 每個時間軸表示為N個數組,而不是N個字段的結構數組 . 這是因為經驗測試和網上沖浪表明N個標量數組的操作速度比N個字段的單個結構數組更快 . 但是,如果我必須更新N個標量數組只是為了插入一個使用期限,這可能不再適用,我還沒有測試過 . (我修改了使用數組字段從struct數組遷移到struct的代碼,并且需要一些時間才能返回) .
上面的代碼僅用于測試插入數組中間的開銷 . 它并不意味著模擬此Context部分中描述的整個問題 .
請注意,我在下面的評論中同意這是一個優先級隊列問題 . 這假設每個新的使用期已經由我的其他邏輯確定以適應時間線,然后將開始時間視為優先級 . 然而,經過反思,它并不是真正的完整優先級隊列問題,因為直到最后我才真正從隊列中取出任何東西 . 因此,它是簡化使用優先級隊列來構建時間軸 .
雖然我還沒有為優先級隊列選擇和合并公開可用的Matlab代碼,但我仍然有50%的信心確認會有凈加速 . 這是因為在Matlab中調用函數的速度很慢,并且每個時間線在完全構建時平均包含不到六個使用期(至少對于當前的問題集) . 因此,與調用函數來更新優先級隊列相比,簡單插入很可能是構建時間軸的最快方式 . 當我有機會嘗試時,我會更新這個問題 .
總結
以上是生活随笔為你收集整理的matlab在数组中插入,一次快速插入一个Matlab数组元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO 数据恢复:如何从 OPPO 手
- 下一篇: Android - 通知Notifica