Matlab 動態追加數組性能比較

介紹

每次經過 for 和 while 循環時,這些循環都會遞增數據結構體的大小,這會對性能和內存的使用產生不利影響。反覆重新調整數組大小往往需要 MATLAB花費額外的時間來尋找更大的連續內存塊,然後將數組移入這些塊中。通常,您可以通過預分配數組所需的最大空間量來縮短代碼的執行時間。

解決方法

下面的代碼顯示了創建標量變量 x,然後在 for 循環中逐步增加 x 大小所需的時間量。

最低性能

tic
x = 0;
for k = 2:1000000
   x = [x x(k-1) + 5];
end
toc

時間需要數分鐘

中等性能

tic
x = 0;
for k = 2:1000000
   x(k) = x(k-1) + 5;
end
toc

Elapsed time is 0.301528 seconds.

如果您爲 x 預分配一個 1×1,000,000 的內存塊並將其初始化爲零,則代碼的運行速度更快,這是因爲無需反覆爲不斷增長的數據結構體重新分配內存。

最高性能

tic
x = zeros(1, 1000000);
for k = 2:1000000
   x(k) = x(k-1) + 5;
end
toc

Elapsed time is 0.011938 seconds.
對要初始化的數組類型使用適當的預分配函數:

對於數值數組,使用 zeros
對於字符數組,使用 cell
預分配非雙精度類型的矩陣
當您預分配一個內存塊來存儲除 double 外的某類型的矩陣時,避免使用以下方法

A = int8(zeros(100));

該語句預分配了一個 100×100 的 int8 矩陣,方法是先創建一個由 double 值組成的滿矩陣,然後將每個元素轉換爲 int8。以 int8 值的形式創建數組可節省時間和內存。例如:

A = zeros(100, 'int8');

數組 行和列數組性能比較

數組採用行存儲的性能略微高於列,但是當有運算時候,列性能高於行性能,推薦將數組以列形式存儲。

tic
t1 = zeros(100000000,1);
toc
 
tic
t2 = zeros(1,100000000);
toc

時間已過 0.000473 秒。
時間已過 0.000180 秒。

總結

建議使用預先分配存儲空間,如果不知道初始數據大小,可以採用第二種解決方案。或者預先分配一個超大的數組,在存儲時候記錄存儲個數,最後將多餘的數據刪除即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章