MATLAB的内存管理是自動完成的,但内存使用不當會造成程序運行效率低下。許多初學者抱怨MATLAB程序慢(效率低),主要原因可能是不了解MATLAB的内存自動管理機制造成的。
MATLAB是以數組(Array)為基本數據單元的一門語言,程序中的一切數據都是數組。MATLAB用連續的内存來存儲數值型數組,當數組大小發生變化時會重新分配一塊合适的内存,把數據複制過去并回收原來的内存。如果數組是在程序運行過程中逐漸“長大”的,MATLAB會反複分配和回收内存,嚴重影響程序的運行效率。為了避免這種情況,可以用zeros函數預先為數組分配合适的内存,然後再對其進行賦值。
另外,MATLAB數組在内存中是按“列優先”的順序存放數組中的元素的。對于多維數組,是按從低到高的維度順序依次存儲數組中的元素的,如下圖所示
圖中紅色的序号即為數組在内存中的存儲順序。在程序中對數組進行索引或賦值時,如果能夠按照這種順序來存儲,一方面可以利用計算機的緩存機制,另一方面可以避免程序在内存中的不斷跳轉,從而可以顯著地提高程序的運行效率。如果通過多重循環來存取數據,遵照此原則,最内層循環應該遍曆最低維(列),從内向外,依次向高維過渡。
下面的程序可以比較預分配内存和索引順序對程序運行時間的影響:
% 數組索引效率比較
clear
preAllocate = 'on'; %設為off關閉預分配内存
r = 10000;c = 10000;
tic
if isequal(preAllocate,'on')
A = zeros(r,c); %預分配内存
else
preAllocate = 'off';
end
for m=1:r %行優先
for n=1:c
A(m,n) = m n;
end
end
fprintf('行優先,預分配内存 %s, 耗時 \t%f\n',upper(preAllocate),toc)
tic
if isequal(preAllocate,'on')
B = zeros(r,c); %預分配内存
end
for n=1:c %列優先
for m=1:r
B(m,n) = m n;
end
end
fprintf('列優先,預分配内存 %s, 耗時 \t%f\n',upper(preAllocate),toc)
看一下不同情況下的耗時對比
行優先,預分配内存 OFF, 耗時 407.735436
列優先,預分配内存 OFF, 耗時 1.346732
行優先,預分配内存 ON, 耗時 1.149516
列優先,預分配内存 ON, 耗時 0.412534
可以看出,内存使用不當可以造成近千倍的效率差别。是因為MATLAB慢嗎?
一言以蔽之,為數組預分配内存并遵循“列優先”的原則使用數組中的數據,是提高MATLAB效率的有效途徑。
幾點說明:
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!