整理了一些 Matlab 使用技巧,與大家分享。
1、. Ctrl+C中斷正在執行的操作
如果程序不小心進入死循環,或者計算時間太長,可以在命令窗口中使用Ctrl+c來中斷。MATLAB這時可能正疲於應付,響應會有些滯後。
2. figure命令新建一個繪圖窗口
figure 可以打開一個空的繪圖窗口,接下的繪圖命令可以將圖畫在它裡面,而不會覆蓋以前的繪圖窗口。當有多個figure窗口時,在命令窗口中執行如Plot等命令將覆蓋當前figure窗口中的對象。所謂的當前figure窗口,也就是最後一次查看的窗口(可以用命令gcf得到)。
figure(N),將編號為N的窗口置為當前figure,出現在所有窗口的最前面,如果該窗口不存在,則新建一個編號為N的空白figure。
3. 注釋掉一段程序:%{、%}。
經典方法是用 if 0,但缺點是不夠直觀,注釋掉的內容仍然保持代碼的顏色。現在可以用 %和{的組合。輸入%{後,後面的代碼都會變綠,在注釋結束的地方再加上 %}。
也可以選中要注釋內容,在右鍵菜單中選擇Comment (Uncomment去掉注釋標記),或使用快捷鍵Ctrl+R。
將光標放在需要注釋的行中,按Ctrl+R,將該行變為注釋。取消注釋也是一樣的,快捷鍵為Ctrl+T。
4. doc 命令名,打開命令的幫助文檔
與help命令不同,幫助文檔MATLAB Help中對命令的描述更詳細,往往還有一些例子,更便於理解。
5. clc 清屏
清除命令窗口中的所有輸入和輸出信息,不影響命令的歷史記錄。
6. clear 和clear all
clear 變量名:可以清除workspace中的無用的變量,尤其是一些特別大的矩陣,不用時及時清理,可以減少內存占用。
clear all 清除所有的變量,使workspace一無所有,當重新開始一次算法驗證時,最好執行一次,讓workspace中的變量一目了然。
7. close all
如果開了多個繪圖窗口,用這個命令將它們一起關掉。
8. 上下光標鍵↑↓
在命令窗口中,上下光標鍵可以將歷史記錄中的命令復制到輸入位置,便於快速重新執行。如果輸入命令的前幾個字母如 [row, col] =,再使用光標鍵,則只會選擇以這些字母開始的命令。
9. Tab補全
對名稱記得不太清楚的命令,可以輸入開頭的幾個字母,然後按Tab鍵,當只有一個以這些字母開頭的命令時,將自動補全命令名,否則顯示一個命令名列表,方便從中選擇。當然,只在命令窗口中有效。
10. cell模式
在一個長長的腳本m文件中,可能需要對其中的一段反復修改,查看執行效果,這時,cell模式就非常有用了。cell模式相當於將其中的代碼拷貝到命令窗口中運行。兩個%後接一個空格(%% )開始一個cell。將輸入光標放到一個cell中時,背景將變為淺黃色,Ctrl+Enter執行cell中的代碼。
執行cell中代碼時不需要保存m文件,該m文件可以不在路徑列表中。
cell模式中,斷點不起作用,當然,調用的子程序中的斷點還是正常的。
11. 獲取文件列表,批處理
MATLAB內置了一些文件操作命令,例如cd(切換工作目錄),dir(同ls,顯示目錄內文件列表)等。dir命令可以返回目錄中的文件和文件夾列表,存在一個結構體數組中。如果需要對一些數據文件進行批處理,而文件名又沒有一定的規律,你可能需要借助於這個命令。
Matlab注釋技巧
1. m文件如果是函數,保存的文件名最好與函數名一致,這點都很清楚。不過容易疏忽的是,m文件名的命名盡量不要是簡單的英文單詞,最好是由大小寫英文/數字 /下劃線等組成。原因是簡單的單詞命名容易與matlab內部函數名同名,結果會出現一些莫名其妙的錯誤。例如,寫個m文件,命名為spy,運行時就彈出一個怪怪的figure,呵呵,我當初還以為是什麼bug。
2. 調試程序時,經常要屏蔽掉一整段程序進行,也就是將其標示注釋符%。有兩個辦法:一種是選定後 ctrl+r和ctrl+t一種是在段首加 if 0 ,段尾加 end,中間都不執行,也就相當於注釋掉了
3. 寫m文件時,選中某段程序內容,ctrl+i讓matlab幫你自動對齊程序。這樣程序看起來很有層次,容易發現程序中的錯誤。
4. ctrl+F2作標簽,ctrl+g跳至某一行,這些快捷鍵都很實用。
5 matlab7中有塊注釋符號%{和 %}
6 多行加標注時,也可以選中需要添加標注程序,然後在Edit中/或者右鍵選擇Comment。或者Uncomment除掉標注
MATLAB內存管理
用 Matlab 進行大規模科學計算或仿真時,內存是一個需要時常注意的問題。在matlab裡運行
>>system_dependent memstats
就可以看到內存的使用狀況。當你寫的 Matlab 程序跳出“Out of Memory”時,以下幾點措施是需要優先考慮的解決方法:
1. 升級內存
2. 升級64位系統
3. 增加虛擬內存
4. 采用3GB開關啟動系統
由於32位 Windows操作系統的限制,每個進程只能使用最多 2GB 的虛擬內存地址空間,因此 Matlab的可分配內存也受到相應的限制。Matlab 7.0.1 引進了新的內存管理機制,可以利用 Windows的 3GB 開關,使用 3GB開關啟動的 Windows 每個進程可以在多分配 1 GB的虛擬地址空間。具體做法是:修改C盤根目錄 boot.ini啟動選項加上 /3G,例如:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G
5. 如果必有必要,不要啟動java虛擬機,采用matlab -nojvm啟動(在快捷方式屬性裡面的 "..../matlab.exe")改為("...../matlab.exe" - nojvm)
6. 關閉Matlab Server
7. Windows中字體、窗口等都是要占用系統資源的,所以在Matlab運行時盡量不要打開不用的窗口。
除此以外,更關鍵的是需要弄清楚以下幾個問題:
問題一:Matlab是如何存儲矩陣的?
Matlab中矩陣是以Block,也就是塊的形式存儲的。也就是說,當Matlab在為即將存儲的矩陣劃分塊時,如果沒有相應大小的連續內存,即使實際內存沒有被完全使用,它還是會報告“Out of Memory”。
問題二:如何高效使用Memory?
Matlab 中數組必須占用連續分配的內存段,當無法為新建的數組分配連續的內存段的時候,”Out of Memory”就會出現。在使用的過程中,由於存儲單元的不斷的被分配和清除,反復分配和釋放數組會使內存被分割成不連續的區域,可用的連續內存段減少,很容易造成“Out of Memory”。因此當Matlab 剛剛啟動時其連續內存最多,此時往往可以新建非常大的數組,這一點可以用命令 feature(’memstats’)(在 7.0版本以上)看出。如果現實的最大連續內存段很小,但實際可用內存(非連續的)仍舊很多,則表明內存中碎片太多了。此時可以考慮用 pack命令,pack 命令的作用就是將所有內存中的數組寫入硬盤,然後重新建立這些數組,以減少內存碎片。此外,在命令行或者程序中都可以使用 clear命令,隨時減少不必要的內存。
因此,治本的方法如下:
1. 在命令行輸入 pack整理內存空間
當內存被分為很多碎片以後,其實本身可能有很大的空間,只是沒有作構的連續空間即大的Block而已。如果此時Out of Memory,此時使用pack命令可以很好的解決此問題。
2. 使用稀疏矩陣或將矩陣轉化成稀疏形式 sparse
如果矩陣中有大量的0,最好存儲成稀疏形式。稀疏形式的矩陣使用內存更少,執行時間更短。例如:
000×1000的矩陣X,它2/3的元素為0,使用兩種存儲方法的比較:
Name
Size
Bytes
Class
X
1000x1000
8000000
double array
Y
1000x1000
4004000
double array (sparse)
3. 盡量避免產生大的瞬時變量,把沒必要的變量clear掉或當它們不用的時候應該及時clear。
4. 減少變量,盡量的重復使用變量(跟不用的clear掉一個意思)。
5. 把有用的變量先save,後clear掉,需要時再讀出來。
下面介紹一下關於clear、save、load的特殊用法,這對在for或while等多重循環裡出現out of memory非常有效。
for k = 1:N % N為循環次數
% ---------------------
var0 = k; % 獲得變量var0
%----------------------
string = [sprintf('var_%d', k) ' = var0;' ];
eval(string); %等價於 var_k = var0;
save(sprintf('var_%d.mat', k), sprintf('var_%d')); %等價於 save var_k.mat var_k
clear(sprintf('var_%d')); %等價於 clear var_k
end
如果要讀取剛才存取的變量var_k, (k = 1,2, ..., N). 那麼,可以使用如下用法:
for k = 1:N
load(sprintf('var_%d.mat', k)); %等價於 load var_k.mat k = 1,2, ..., N
end
另外,還有一些非常有用的用法。如果用清除剛才讀取的變量 var_k, k = 1, 2, ..., N
clear '-regexp' '^var_' % 清除所有以“ var_”開頭的變量
還有很多關於save、clear、load等用法,具體help一下。
6. 使用單精度 single短整數替代雙精度 double
Matlab 默認的數字類型是雙精度浮點數 (double),每個雙浮點數占用 8個字節。對於一些整數操作來說,使用雙浮點數顯得很浪費。在 Matlab 中可以在預先分配數組時指定使用的數字類型如以下命令:zero(10, 10, ‘uint8′)。對於浮點數,在很多精度要求不高的情況下,可以使用4個字節的單浮點數 (single),可以減少一半的內存。關於單、雙浮點數的精度對照如下,以便根據需要選擇使用:
single: 精度 (1.1921e-007)最大數 (3.4028e+038)
double: 精度 (2.2204e-016)最大數 (1.7977e+308)
Matlab與C/C++聯合編程之從Matlab調用C/C++代碼 http://www.linuxidc.com/Linux/2012-08/68148.htm
二分類SVM方法Matlab實現 http://www.linuxidc.com/Linux/2013-05/84050.htm
Matlab中的取整函數fix, floor, ceil與round http://www.linuxidc.com/Linux/2013-10/91161.htm
Matlab編譯cuda的.cu文件 http://www.linuxidc.com/Linux/2014-04/100675.htm
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-08/106027p2.htm