首页
/
每日頭條
/
圖文
/
matlab程序基礎知識
matlab程序基礎知識
更新时间:2025-12-01 17:32:09

MATLAB的内存管理是自動完成的,但内存使用不當會造成程序運行效率低下。許多初學者抱怨MATLAB程序慢(效率低),主要原因可能是不了解MATLAB的内存自動管理機制造成的。

MATLAB是以數組(Array)為基本數據單元的一門語言,程序中的一切數據都是數組。MATLAB用連續的内存來存儲數值型數組,當數組大小發生變化時會重新分配一塊合适的内存,把數據複制過去并回收原來的内存。如果數組是在程序運行過程中逐漸“長大”的,MATLAB會反複分配和回收内存,嚴重影響程序的運行效率。為了避免這種情況,可以用zeros函數預先為數組分配合适的内存,然後再對其進行賦值。

另外,MATLAB數組在内存中是按“列優先”的順序存放數組中的元素的。對于多維數組,是按從低到高的維度順序依次存儲數組中的元素的,如下圖所示

matlab程序基礎知識(提高MATLAB程序的效率)1

圖中紅色的序号即為數組在内存中的存儲順序。在程序中對數組進行索引或賦值時,如果能夠按照這種順序來存儲,一方面可以利用計算機的緩存機制,另一方面可以避免程序在内存中的不斷跳轉,從而可以顯著地提高程序的運行效率。如果通過多重循環來存取數據,遵照此原則,最内層循環應該遍曆最低維(列),從内向外,依次向高維過渡。

下面的程序可以比較預分配内存和索引順序對程序運行時間的影響:

% 數組索引效率比較 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效率的有效途徑。


幾點說明:

  1. 不同類型的數組在内存中的存儲方式也不盡相同,單一數據類型的數組,如數值型數組和字符型數組,在内存中是連續存儲的。而容器型數據的底層單元則可以分開存儲,例如,結構數組一般每個域用連續的内存存儲,不同的域則可以存在不同的位置。這是容器型數據的優勢,局部改動不會影響其他部分。
  2. 稀疏矩陣僅保存非零元素及其下标。
  3. 不同類型的數組預分配内存的方式也不一樣。例如數值型數組一般用zeros函數;字符串型數組用strings函數;元胞數組用cell函數;表則用table函數。詳情可在命令行doc preallocation。
,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
兩個隐藏在你朋友圈裡的騙局(利用你的善良新出騙局)
兩個隐藏在你朋友圈裡的騙局(利用你的善良新出騙局)
  原創: 煙台網警巡查執法   你是不是也遇到過這種情況,朋友圈内熟人經常發布信息,讓你幫忙轉發,不轉吧,不好意思,可是卻明明知道是虛假的信息,如果轉發了,就會造成更多的不知情、或者老年人就容易上當進而受騙。今天煙台網警就帶大家了解一下常見的“朋友圈”騙局。      常見案例:   一、某某人重病,急需手術費等等的内容,本來一方有難四方幫助是挺好的,但現...
2025-12-01
七龍珠最後大決戰悟空vs弗利薩(龍珠新劇場版5細節)
七龍珠最後大決戰悟空vs弗利薩(龍珠新劇場版5細節)
  大家好,不知道大家有沒有看過龍珠最新的劇場版布羅利,小編發現其中的一些細節還是挺有趣的,所以今天就來跟大家分享一下吧,原來悟空的大智若愚,是從培養皿就已經開始了啊,而弗利薩在這部劇場版裡,也是各種賣萌,好不搞笑哈!      這部龍珠劇場版并沒有以悟空的視角開篇,而是先介紹了布羅利被放逐到偏遠的星球,過程可以省略一萬字,但是有一個細節,小編是比較在意的,...
2025-12-01
abb中的io控制指令有哪些(ABB停止指令StopExitBreak的區别)
abb中的io控制指令有哪些(ABB停止指令StopExitBreak的區别)
  ABB工業機器人STOP指令用于停止程序執行。在Stop指令就緒之前,将完成當前執行的所有移動。該指令的使用格式為:   Stop [ \NoRegain ] | [ \AllMoveTasks ];   如果STOP指令使用變量\NoRegain,若機械臂和外軸已遠離停止位置,則不會再返回;如果不使用變量\NoRegain,若機械臂和外軸已逐漸遠離停止...
2025-12-01
乒乓球孔令輝技術特點分析(淺談孔令輝的乒乓球技術)
乒乓球孔令輝技術特點分析(淺談孔令輝的乒乓球技術)
     和其他運動員不同,我們講孔令輝的技術時要先說缺點再說優點,而不是反過來。因為别人都是技術全面特長突出無明顯漏洞,到小輝這則是無漏洞突出技術全面無明顯特長。但總而言之,孔令輝的技術是有問題的,問題在哪?在球的質量。   小輝的球是個神馬質量呢?   我們來做個比較,下面的比較對象絕對都是和他一批的橫拍選手,所以不會弄出跟馬龍張繼科比的情況,放心。  ...
2025-12-01
棗強八景生态公園介紹(河北棗強打造一河兩湖)
棗強八景生态公園介紹(河北棗強打造一河兩湖)
     棗強縣南湖公園。(無人機照片) 李金剛 攝   棗強縣南湖公園。(無人機照片) 李金剛 攝      生态修複後的棗強縣索泸河生态景觀帶局部。(無人機照片) 李金剛 攝      生态修複後的棗強縣索泸河生态景觀帶局部。(無人機照片) 李金剛 攝      棗強縣八景生态公園一角。 李金剛 攝      棗強縣八景生态公園一角。 李金剛 攝    ...
2025-12-01
Copyright 2023-2025 - www.tftnews.com All Rights Reserved