2-4 x}wtm

在 MATLAB 運算過程,可以隨時改變每一個矩陣的維度,以容納新的資料。但是每一次增大矩陣的容量時,MATLAB就必須要向電腦的作業系統索取記憶體,因此會造成程式執行效率的降低,而且造成記憶體使用的分散現象(Memory Segmentation),此種由於記憶體的動態配置而造成的分散使用現象,可能導致「實際雖仍有充足的記憶體,但卻未有連續空間以處理較大矩陣」的現象。

基於以上種種原因,若預先知道使用矩陣的維度大小,則最好實施矩陣的預先配置(Pre-allocation),可用的指令有 zeros、ones、cell(用於異值陣列的預先配置)及 struct(用於結構陣列的預先配置)等。例如,欲計算矩陣 x 的每一個元素的平方值並將之儲存於矩陣 y,有兩種作法,如下:

Example 1: 02-程式碼與記憶體之最佳化/preAllocate01.mn = 1000000; clear y1; % 清除變數 y1 tic for i = 1:n y1(i) = i^2; end time1=toc; y2 = zeros(1, n); % 預先配置所須矩陣 y2 tic for i = 1:n y2(i) = i^2; end time2=toc; fprintf('time1 = %g, time2 = %g, time1/time2 = %g\n', time1, time2, time1/time2);time1 = 0.248923, time2 = 0.00902574, time1/time2 = 27.5793

在上述範例中,由於我們使用 y = zeros(1, n) 來預先配置所須矩陣 y,因此程式碼的執行效率快了 20 多倍。


MATLAB程式設計:進階篇