閱讀目錄
從大二開始接觸到matlab,講真,這是一個我覺得很良心的一個平台,之所以這樣認為是因為matlab有個help功能,這里可以查詢到所有的函數以及關鍵字的使用方法,但是可惜是英文版的,就比較難找到自己想要的函數功能,長時間里自己都是在百度里將自己所需要的函數功能說出,然后百度,一般都能找到,我覺得很有用的一個matlab論壇平台是MATLAB中文論壇
,這里有很多大牛,也歡迎大家去膜拜學習。這是我的第一篇博客,也是我人生中的一個新起點,剛過去一個灰色的大四,人生沒有回頭路,我只願未來越來越美好。
我很感激博客園,在這里我學到了很多知識。
這篇博客是參考了另一位博客園作者大牛:數據之巔,http://www.cnblogs.com/asxinyu/p/Basic_Matlab_Experience.html。
1.前言
本文不是給完全沒有過一定編程經驗的人准備的。至少了解或看過過一些C編程什么的。
本文的范圍很大,信息很多。由於本人在接下來研究生生活中將在Matlab下生存一年半多,本文將隨時隨地的更新,在這里,我會補填上很多,可能簡單可能復雜吧,個人覺得就Matlab而言,其實沒多復雜的東西,很多都可以自行百度的。
我的開發環境為windows10,Matlab2013b,我覺得系統和Matlab版本對學習影響不大,畢竟大家用的基本上都是2012以上的,所以版本影響不大。尤其是版本不是越高越好,適合自己的就好,說到底穩定能跑的動就行。
<注:未完待續...>
如何安裝matlab,請自行百度,太多了。下圖為Matlab2013b的界面
1.help欄:在這里,輸入要查詢的函數名,便可以得到想要的介紹及example等。
2.菜單欄:在這里,就是每部分的功能設置等,詳細百度好了。
3.Current Folder欄:當前路徑。是當前matlab工作文件夾的路徑,這個一般啟動改好后,不會變動,作用不大,但有時候找文件用得上;這里會加載你經常使用的Matlab目錄,可以通過下拉箭頭快速切換不同的Matlab工作路徑;
4.Current Folder:也是當前的工作文件夾的文件顯示,這里顯示文件夾的所有資源,比較好懂,需要打開文件的時候,雙擊對應m文件就可以了;
5.Command Window 主窗口:也就是輸入命令的地方,最最重要的地方吧,做一些簡單的測試,學習命令的時候都可以在這里面進行,不過習慣后更喜歡用m文件,習慣就知道了;像先前提到的help欄,其實可以直接敲打>>help 函數名; 當然了其他的命令輸入,如果需要換行,記得按:shift+Enter;另外主窗口還有一個好處是可以回顯命令行的值(這條命令后不加“;”);
6.WorkSpace:工作變量空間,主要是顯示當前matlab中存在的變量的值,包括變量名稱,值,如果是數組,會顯示最大,最小值,這個地方主要是調試程序用的,相當於VS中加斷點后的局部變量的值,只不過這里顯示更加直觀,非常有用。
7.Command History:如其名,是歷史窗口,這樣你可以看到自己先前敲打的命令,這里有一個小技巧,就是你在命令窗口輸入的命令,這里都會顯示,而且你還可以用小鍵盤的,上下鍵來直接跳到前面的命令,測試的時候也更加方便;
8.狀態欄:當程序在跑的時候,顯示為busy,這時候電腦可能會卡的不要不要的,同時matlab窗口不動,不要着急,可以去泡杯水喝,等着吧,我就是這樣干的。如果Ready,那么就是沒有運行程序。
<注:未完待續...>
Matlab如此受歡迎的原因可以總結為:通過簡單的編程,能達到高效的數值運算能力與繪圖能力,完善的help。
經常使用Matlab的命令或者進行一些簡單的測試,掌握和知道一些常見的命令是很有必要的,下面這些命令如果記不住,可以根據功能百度,找到對應的函數,再用,其實很快。熟練之后,也就30秒鍾的事情,多了,也就記住了。
1.clc:清空命令主窗口(4)的內容.
2.clear:清空內存變量等.常用clear 某變量名 來在工作變量(5)中去除變量名,或者是clear all 來清空(5)的所有變量。
3.help:幫助命令,正如之前提到的help 某函數可以得到該函數的使用方法介紹和example。
4.zero:創建一個多維的零值數組,如a=zero(3,4)是一個3行4列的數組,其中值均為0。
5.rand:隨機數生成,如R=rand([M,N])、R=rand(M,N)或rand(N)是一個M*N或者N*N維的數組,其值均為0~1之間的任意隨機無理數數。
6.>>plot:繪制連續函數的操作;
>>stem:繪制離散函數的操作;
具體格式可以參考幫助,常見搭配有figure(1),subplot(2,2,1),axes,axis,legend(' '),xlabel(' '),ylabel(' '),title(' '),hold on,zoom in,gca等,詳細如何使用可以help。
7.function:定義一個函數,在.m中經常用到,可以將很多段代碼封裝為一個函數,可以多次調用此函數,而不用重復寫很多段代碼,如function [a b]=test(haha),這里調用函數test之前,需要傳遞給它一個變量值,函數在運算完后,會返回[a b],調用方法如[a b]=test(5)。
8.global:聲明一個全局變量在.fig中的.m中經常用到,這樣的話此變量可以在多個函數中共享。
9.save:保存一個數據;
10.load:載入一個數據,為struct類型,通常要配合struct2cell才好調用,例如下面:
s = load(PathName);
s = struct2cell(s);
11.disp:顯示一段話,例如disp('hello HongKong!Here is Shanghai, missing u');。
12.imshow:顯示一張圖片。
13.pause:暫停,此時需要在Command Window(5)鍵盤敲擊下Enter鍵便可以繼續運行代碼:
好了,matlab中的常用的這些函數就介紹到這里了,要掌握matlab的核心語法,還得看一下基本的matlab矩陣操作的語法,太靈活了 ,掌握幾個基本的就可以完成很多工作了。
<注:未完待續...>
前面已經提到Matlab最重要的一點強大的數值計算功能,不僅體現其函數庫的強大,更重要的是其操作語法的靈活性。隨便找一本Matlab的編程入門書籍,肯定有這方面的介紹。其實矩陣操作的靈活性,強大到以至於我不敢看,日常只要掌握幾個基本的操作就可以做很多事情了。特別在這里特別介紹一下,可以給你提高不少效率。
4.1.初始化序列
在編寫各種算法的時候,經常要對矩陣初始化。例如前面提到的zeros,one,等等都是產生矩陣的方法,同樣還有其他的產生對角矩陣等方法。這里特別要提到的是產生數據或者等差數列的方法。例如:
a = 1 : 2:10 ;%產生1-10的步長為2的等差數列,如果不寫2會默認1;
4.2.初矩陣操作
在matlab中,數組或者叫做矩陣是可以任意擴充的,不需要其他,同樣對矩陣的變化易如反掌,不需要那些for循環來進行。看看幾個例子,管中窺豹,大家以此類推:
data = rand(4,4);%初始化1個4*4的隨機矩陣,其值為0~1的隨機數; a = data(:,1);%取data的所有行,第1列的數據,並賦值給a; b = data(:,[1,3]);%取所有行,第1,3列的數據,並賦值給b; c = data([2,3],[1,2]);%取第2,3行,第1,2列的數據,並賦值給c; d = data([1:3],2);%取第1到3行,第2列的數據,並賦值給d;
看下面的運行結果,比較直觀:
當然這些是以double類型存儲的,還有char類型等,cell,strcut等以后也會補充。<注:未完待續...>
4.3[]、{}、()區別:
[]是數組引用符號,一般為數字(double)或者單個字母(char),所以可以利用()調用某一行列的值
{}是元胞cell引用符號,一般存儲為多字母(cell),元寶可以想象為超矩陣,每個元素可以是不同的類型和大小。可以利用{}調用某一行列的值;

%%double num = [1,2,3;3,2,1]; num(1,2) %%char zm = ['a','b','c';'c','b','a']; zm(1,2) %%cell dir = {'Up','Down','Left','Right' }; dir{1,1}
4.4.二進制寫入數據
如果有大量的數據(數字)要保存的話,一般常用save函數保存為.mat文件,但是若要保存為.txt文件怎么辦?
這里可以利用fopen、fsprintf兩個函數來進行保存操作:
1.fopen:
fid=fopen('PRBS_gen.txt','w');%matlab計算結果
2.fsprintf:
輸出到文本或者顯示屏,但是下面的函數將輸出到文本.
for i=1:length(data) fprintf(fid,'%d',data(i));%保存數字 fprintf(fid,'%c',10);%保存字符 end
在matlab中,.m文件包含很多有Script和Function,簡單來理解這兩種文本,Script是沒有輸入和輸出的,Function是有的,其他我倒沒覺得有什么不同,嗯,就這么多吧。執行上來說,我覺的.m文件是相當於每行每行代碼在Command Windows(5)按次序上跑一趟。
當然,代碼比較長又需要保存,考慮寫在.m文件中。但是如果其中有幾句自己不太確定或者報錯的代碼,可以復制黏貼在Command Windows(5)上一條條輸入(按Shift Enter換行)臨時調試與測試,大致也就這些了吧。
5.1. .m或.fig文件的注意事項
1.matlab的變量名與.m文件命名和大小寫很敏感一定要小心的啊,平時多用"_"下划線,盡量少用“ ”空格。
2.如果需要注釋,可以添加“%"。matlab我還沒發現可以像”/* */”注釋多行的語句,這是個體力活,不過也挺好的。
如果需要顯示效果突出分段效果(就是選中每大段代碼成塊有個底色),可以考慮添加”%%”。
3.每一行代碼結束,如果不添加";“,就會在Command Windows(5)中顯示計算過程與變量值。
4.變量無需自己定義,只需要寫a=[];即可,同樣初始化改變量也是直接這樣寫,數據類型會跟着變,簡直牛掰啊。
5.matlab中數據類型有很多種,操作起來特煩人,最常用的是['a' 'b' str],一個框把所有的框起來,還有{}之類的。。
6.在matlab中,現在也支持面向對象編程,但我不會,使用Matlab暫時也只是用用函數,面向過程的編程啊。。。面向對象編程的使用如果大家有興趣可以去找一下相關資料啊。matlab最常用的還是函數,和其他語言的方法類似。但是matlab的函數沒有靜態方法和實例方法之分,總的來說,都是靜態的吧,直接調用。
編寫函數使用的關鍵字是 function ,輸入和輸出參數可以是多個,例如 function [r1,r2,r3] = testfun(p1,p2,p3)
注意:一般來說函數是不可以直接被調用的,需要被另一個.m文件調用,並且根據這個函數的要求是有一定的輸入的。當前該函數是要在Current Folder中的話,如果不是請自行指向該目錄下。<注:未完待續...>
5.2. .m編程
1.matlab是支持for、if、while和switch以及sum等常用,但是不支持y++,--y之類的。
2.matlab可以執行矩陣運算的,這點很棒,如下:
N=1:1:10;%N是1到10的矩陣 y = power(2,N);%y=2^x,x=[1,10];
上述代碼就相當於下面的代碼:
for N =1:10 y(1,N) = power(2,N);%這一行代碼一般是在其他平台是這樣寫的,個人這樣覺得,可能有點絕對 end
3.有時候是需要利用和其他的函數一起用,例如下面提到的for、sun語句實現:

genotype_code=[6 10 11 7;7 10 10 7;6 6 11 11;6 11 11 7;7 10 10 6;7 11 11 7]; phenotype=[0;1;0;0;1;0]; f_num_0 = zeros(16,1); %統計類別0各屬性取值 f_num_1 = zeros(16,1); %統計類別1各屬性取值 for i = 1:6 for j = 1:16 f_num_0(j) = sum(genotype_code(:,i) == j & phenotype == 0);%****** f_num_1(j) = sum(genotype_code(:,i) == j & phenotype == 1);%****** end end
一個師兄寫的,我這里精簡了一些數據,這段代碼當時驚呆了我,可以細細品味。
4.有時候運行數據可能是NaN類型的,代表不是一個數據。我這也遇到過,可以考慮isnan來判斷下,嗯,代碼見下:
Gini_i = Gini_i(~(isnan(Gini_i))
這里Gini_i數組里面可能存放着一些有用的數,也有NaN的數(比如進行log2()運算會有這種),上述代碼是表示如果是NaN那么會將該值改為0,其他正常的數不變。詳細可以參考isnan這個函數的用法。
5.有時候我們要找一個數組里的最大值max、最小值min或者是大於某閾值th的下標(就是第幾行或第幾列),詳細可以參考find這個函數的用法,可以考慮:
Gini_max = max(Gini) ; %最大值 Gini_min = max(Gini) ; %最小值 Gini_index = find(Gini == min(Gini)) %找到最小值的下標 Gini_th = find(Gini >0.7) %Gini中大於0.7的所有值的下標
6.文件命名希望能夠自己命名,但是又不希望寫死,可以看看以下代碼:
wavFileName = sprintf('%s.wav', 'Right'); wavPathName = sprintf('.\\%s\\%s\\%s', 'src','wav', wavFileName);
可以看到我們可以把將wavFileName改變內容就可以重新命名的目的,”\\“為轉義符。
<注:未完待續...>
5.3. .fig編程
matlab是可以做界面的,而且超極簡單,很適合那些剛剛入門的盆友們。。。
1.在Command Windows(5)下輸入>>guide 會彈出一個對話框,選擇Create New GUI >> Blank GUI(Default),就會出現以下GUI。
在點擊保存后會自動生成兩個文件.fig和.m,.m是保存執行的代碼,.fig是圖像界面。
2.上述界面的一些介紹:1號區域是菜單欄,黃色的對齊功能特別適合對齊控件,綠色的三角形(藍色圈住的)是運行按鈕,點擊后就會運行此gui界面。2號區域是控件欄,可以直接拖入3號區域(面板),雙擊打開Inspector(屬性),可以設置,這個百度了解下每個屬性功能就好,不細講了,值得注意的是Tag的值,這是該控件的唯一標簽(相當於人的身份證,可以通過這個找到這個控件的句柄)。3號區域是面板,理解為要運行后程序顯示的那部分,右下角有個黑點,可以拖動來改變大小,也可以雙擊打開其屬性,修改參數。
3.修改gui的圖徽,默認是matlab的圖徽,在.m文件中的function XXX_OpeningFcn(hobject,, eventdata, handles, varargin))下添加如下代碼:
newIcon = javax.swing.ImageIcon('hui.jpg'); figFrame = get(hObject,'JavaFrame');%hobject是指該fig的句柄 figFrame.setFigureIcon(newIcon);
4.在gui中顯示圖片,有一種做法是先在.fig中拉出axes控件,然后將圖片顯示在其上,網上代碼很多。這里給出另外一種方法,在.m文件中添加以下代碼:
axes('Parent',gcf,... % 設置新的axe, 將'parent' 屬性設置為當前窗口gcf 'Units','pixels',... %設置單位為pixels 'Position',[0 0 64 64]); % 指定axe的位置,格式為[left bottom width height], left和bottom設定了axe的左下 %角坐標,width和height設定了窗口的寬度和高度 imshow(graphic_box,[0 64]);% axis equal; axis off %顯示圖像
注意一點:一般界面起始點坐標(0,0)在左上角,matlab起始點坐標(0,0)在左下角。
5.更新控件顯示的數字啥的:
st = str2num(get(obj.text3,'String'));%獲取text3上的字,並轉為數字 st = st+1;%加1 set(obj.text3,'String',st);%顯示新的字
6.調用了消息對話框,據我所知有三種方式調用消息框
a).windows dll插件(據說執行效率很高,我也不懂,那就先放在第一個好了):
asm = NET.addAssembly('System.Windows.Forms'); import System.Windows.Forms.*; MessageBox.Show('Copyright hecongcong. Contact by h18818217356@live.com.Thanks.','About',MessageBoxButtons,MessageBoxIcon.Information);
b).matlab自帶的消息框(簡單,真的很簡單,和a)差不多吧):
myicon = imread('landOcean.jpg'); h=msgbox('Operation Completed','Success','custom',myicon);
c).接下來最后一個也是我覺得最棒的一個,先把代碼貼上:

h=dialog('name','Training Direction','position',[700 400 300 60]); %obj = handles.text4; figFrame = get(h,'JavaFrame'); figFrame.setFigureIcon(newIcon); uicontrol('parent',h,'style',... 'text','position',[1 35 100 20],'string','Please Choice:'); uicontrol('parent',h,'style',... 'pushbutton','position',[30 10 50 20],'string','Up','callback','MyTraining(1)'); uicontrol('parent',h,'style',... 'pushbutton','position',[100 10 50 20],'string','Down','callback','MyTraining(2)'); uicontrol('parent',h,'style',... 'pushbutton','position',[170 10 50 20],'string','Left','callback','MyTraining(3)'); uicontrol('parent',h,'style',... 'pushbutton','position',[240 10 50 20],'string','Right','callback','MyTraining(4)');
newIcon是我在5.3.3中提到的圖片,'callback'是回調函數,指向MyTraining(d).m這個函數文件,d是輸入。(小提示:可以將'pushbutton'改為其他的控件名,如'text'等,看看效果。)
7.如何獲取其他正在運行的.fig的句柄呢?先貼代碼:
obj = guihandles(ProjectDigital_Main);%獲取正在執行的ProjectDigital_Main.fig的句柄
st = str2num(get(obj.text3,'String'));%獲取projectDigital_Main.fig的控件text3的字符串
<注:未完待續...>