介紹
每次經過 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 秒。
總結
建議使用預先分配存儲空間,如果不知道初始數據大小,可以採用第二種解決方案。或者預先分配一個超大的數組,在存儲時候記錄存儲個數,最後將多餘的數據刪除即可。