Matlab中的一些小技巧
轉自:http://blog.chinaunix.net/uid-20551209-id-3202608.html
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)
7. 為矩陣變量預制內存而不是動態分配
在動態分配的過程中,由于開始Matlab所用的Block隨著矩陣的增大而連續的為此矩陣分配內存,但是由于Block的不連續性,很有可能最開始分配的Block不能滿足存儲的需要,Matlab只好移動此Block以找到更大的Block來存儲,這樣在移動的過程中不但占用了大量的時間,而且很有可能它找不到更大的塊,導致Out of Memory。而當你為矩陣變量預制內存時,Matlab會在計算開始前一次性找到最合適的Block,此時就不用為變量連續的分配內存。比較下面兩個程序:
for k = 2:1000
??? x(k) = x(k-1) + 5;
end
x = zeros(1, 1000);
for k = 2:1000
??? x(k) = x(k-1) + 5;
end
顯然,第二個更好!!!最好的方法是,在程序一開始就位所有大的矩陣變量預制存存儲單元!!!
8. 盡量早的為大的矩陣變量預制內存
Matlab使用heap method管理內存。當在Matlab heap中沒有足夠的內存使用時,它會向系統請求內存。但是只要內存碎片可以存下當前的變量,Matlab會重新使用內存。比如:
a = rand(1e6,1);
b = rand(1e6,1);
使用大約15.4 MB RAM
c = rand(2.1e6,1);
使用近似16.4 MB RAM
a = rand(1e6,1);
b = rand(1e6,1);
clear
c = rand(2.1e6,1);
使用32.4 MB RAM
Matlab不能使用a、b被clear的空間,因為它們均小于2.1 MB,而同時它們也很可能是不連續的。最好的方法:
c = rand(2.1e6,1);
clear
a = rand(1e6,1);
b = rand(1e6,1);
使用16.4 MB RAM
9. 如果可行的話,將一個大的矩陣劃分為幾個小的矩陣,這樣每一次使用的內存減少。
?
?Matlab中的保存數據語句比較
在Matlab中,我們經常遇到需要將一些中間數據或者最終結果保存為文本形式(*.txt);其中提供了多種保存數據的語句,應該如何選擇喃?
在此,小弟在使用了fprintf、save、dlmwrite的基礎上,對這三種方法進行了一個比較:
fprintf(fid, format, A, ...),將數據A以format表示的格式寫入fid(文件)中,fid由fopen函數返回得到。
實例:? x = 0:.1:1;
A = [x; exp(x)];
fid = fopen('exp.txt', 'wt');
fprintf(fid, '%6.2f %12.8f\n', A);
fclose(fid)
save filename.txt A? -format,將數據A以format表示的格式寫入filename文本文件中。
實例:? x = 0:.1:1;
A = [x; exp(x)];
save? data.txt A -ASCII
dlmwrite('filename.txt', A, 'D', R, C),從矩陣A的第R行、第C列開始,使用分隔符D分割數據(“\t”表示tab分割,“,”為默認分割符),存儲到filename文本文件中。
實例:? x = 0:.1:1;
A = [x; exp(x)];
dlmwrite(‘data.txt', A, 'delimiter', '\t', 'precision', 6);
使用時,save保存的數據是以科學計數法的方式存儲的;fprintf和dlmwrite則是可以選擇存儲數據的方式,fprintf的格式設置跟C語言中的用法一致,dlmwrite可以設置有效位位數,比如上面實例中6表示有效位位數是6位,dlmwrite中對數據中的小數就采用浮點數存儲,整數就采用整型存儲形式。
在使用時,可根據自己實際情況的需要選擇適合的一種。個人覺得matlab本身的這種以科學計數法來表示數據,有時不方便于查看。還有一點就是fprintf是按照矩陣列存儲。
?
MATLAB Out of memory問題總結(轉載)
首先,我要聲明,matlab自帶的Help才是最權威的Matlab學習資料,如果有時間好好學習一下或是可以高效的使用的話,一定受益匪淺!比如說像 Out of Memory這個問題,最開始我都是用Help memory,幾乎得不到任何信息;然后就是去網上搜索此類問題的解決方法,一般有這幾種:
除了升級內存和升級64位系統外,下面幾個方法也是解決之道。
# 增加虛擬內存
# 采用PACK (在命令行輸入 pack 整理內存空間)
# 采用3GB 開關啟動系統(修改 c盤根目錄 boot.ini 啟動選項加上 /3G 例如:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G
# 優化程序,減少變量(使用稀疏矩陣 sparse ) save 保存變量 load 變量,需要時再讀出來
# 如果必有必要,不要啟動java虛擬機,采用matlab -nojvm啟動(在快捷方式屬性里面的 "..../matlab.exe")改為("...../matlab.exe" - nojvm)
#關閉Matlab Server?
# 使用單精度 single 短整數替代雙精度。
現在看來這些解決方法對于我的問題來說根本就是“治標不治本”,不能解決實際問題,后來在一個師兄的提醒下Help out of memory,終于找到了解決此類問題的方法。在此感謝這位師兄啊!
重申――Matlab的Help才是Matlab的最權威的指導材料!!!
其實我的所謂原創就是對Help out of memory的一些歸納總結而已,有興趣的話大家可以自己去看!!!
問題一:Matlab是如何存儲矩陣的
Matlab中矩陣是以Block,也就是塊的形式存儲的。也就是說,當Matlab在為即將存儲的矩陣劃分塊時,如果沒有相應大小的連續內存,即使實際內存沒有被完全使用,他還是會報告“Out of Memory”。
問題二:如何高效使用Memory
由于在使用的過程中,由于存儲單元的不斷的被分配和清除,內存會被分割成不連續的區域,這是很容易造成“Out of Memory”。
1.
為矩陣變量預制內存而不是動態分配
在動態分配的過程中,由于開始Matlab所用的Block隨著矩陣的增大而連續的為此矩陣分配內存,但是由于Block的不連續性,很有可能最開始分配的Block不能滿足存儲的需要,Matlab只好移動此Block以找到更大的Block 來存儲,這樣在移動的過程中不但占用了大量的時間,而且很有可能它找不到更大的塊,導致Out of Memory。而當你為矩陣變量預制內存時,Matlab會在計算開始前一次性找到最合適的Block,此時就不用為變量連續的分配內存。
比較下面兩個程序:
for k = 2:1000
x(k) = x(k-1) + 5;
end
x = zeros(1, 1000);
for k = 2:1000
x(k) = x(k-1) + 5;
end
顯然,第二個更好!!!最好的方法是,在程序一開始就位所有大的矩陣變量預制存存儲單元!!!
1.
盡量早的分配大的
Matlab使用heap method管理內存。當在Matlab heap中沒有足夠的內存使用時,它會向請求內存。但是只要內存碎片可以存下當前的變量,Matlab會重新使用內存。
比如:
a = rand(1e6,1);
b = rand(1e6,1);
使用大約15.4 MB RAM
c = rand(2.1e6,1);使用近似16.4 MB RAM:
a = rand(1e6,1);
b = rand(1e6,1);
clear
c = rand(2.1e6,1);
使用32.4 MB RAM。因為Matlab不能使用a、b被clear的空間,因為它們均小于2.1 MB,而同時它們也很可能是不連續的。
最好的方法:
c = rand(2.1e6,1);
clear
a = rand(1e6,1);
b = rand(1e6,1);
使用16.4 MB RAM
2.
盡量避免產生大的瞬時變量,當它們不用的時候應該及時clear。
3.
盡量的重復使用變量(跟不用的clear掉一個意思)
4.
將矩陣轉化成稀疏形式
如果矩陣中有大量的0,最好存儲成稀疏形式。稀疏形式的矩陣使用內存更少,執行時間更短。
例如:
1000×1000的矩陣X,它2/3的為0,使用兩種存儲方法的比較:
Name
Size
Bytes
Class
X
1000x1000
8000000
double array
Y
1000x1000
4004000
double array (sparse)
5.
使用pack
當內存被分為很多碎片以后,其實本身可能有很大的空間,只是沒有作構的連續空間即大的Block而已。如果此時Out of Memory,此時使用pack命令可以很好的解決此問題。
6.
如果可行的話,將一個大的矩陣劃分為幾個小的矩陣,這樣每一次使用的內存減少。
7.
增大內存
問題三: Increase the size of the swap file.
wap space的與使用的操作系統有關,具體的如下:
1.
UNIX
Information about swap space can be procured by typing pstat -s at the UNIX command prompt. For detailed information on changing swap space, ask your system administrator.
2.
Linux
Swap space can be changed by using the mkswap and swapon commands. For more information on the above commands, type man followed by the command name at the Linux prompt.
3.
Windows NT
Follow the steps shown here: Right-click the My Computer icon, and select Properties. Select the Performance tab and click the Change button to change the amount of virtual memory.
4.
Windows 2000
右鍵“我的電腦”->屬性->高級->性能->設置,從而改變其虛擬內存。
5.
Windows XP
右鍵“我的電腦”->屬性->高級->性能->設置,從而改變其虛擬內存。
問題四:盡量少時用系統資源(對于Windows)
Windows中字體、窗口等都是要占用系統資源的,所以在Matlab時盡量不要打開不用的窗口。
問題五:Reloading Variables on UNIX Systems
由于我不使用UNIX系統,這里不介紹,直接從Help中粘過來
On UNIX systems, MATLAB does not return memory to the operating system even after variables have been cleared. This is due to the manner in which UNIX manages memory. UNIX does not accept memory back from a program until the program has terminated. So, the amount of memory used in a MATLAB session is not returned to the operating system until you exit MATLAB.
To free up the memory used in your MATLAB session, save your workspace variables, exit MATLAB, and then load your variables back in.
總結
以上是生活随笔為你收集整理的Matlab中的一些小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP管理员登陆、验证与添加(前端验证)
- 下一篇: 第二次结对编程之软件测试