接觸Matlab5年一個總結(Matlab要掌握的一些要點 )


 閱讀目錄

  1. 前言
  2. Matlab的開發環境與簡單介紹
  3. Matlab的常見命令
  4. Matlab的靈魂-矩陣操作
  5. Matlab的.m或.fig的編程與技巧

   從大二開始接觸到matlab,講真,這是一個我覺得很良心的一個平台,之所以這樣認為是因為matlab有個help功能,這里可以查詢到所有的函數以及關鍵字的使用方法,但是可惜是英文版的,就比較難找到自己想要的函數功能,長時間里自己都是在百度里將自己所需要的函數功能說出,然后百度,一般都能找到,我覺得很有用的一個matlab論壇平台是MATLAB中文論壇,這里有很多大牛,也歡迎大家去膜拜學習。這是我的第一篇博客,也是我人生中的一個新起點,剛過去一個灰色的大四,人生沒有回頭路,我只願未來越來越美好。

  我很感激博客園,在這里我學到了很多知識。

  這篇博客是參考了另一位博客園作者大牛:數據之巔,http://www.cnblogs.com/asxinyu/p/Basic_Matlab_Experience.html。

1.前言

  本文不是給完全沒有過一定編程經驗的人准備的。至少了解或看過過一些C編程什么的。

 本文的范圍很大,信息很多。由於本人在接下來研究生生活中將在Matlab下生存一年半多,本文將隨時隨地的更新,在這里,我會補填上很多,可能簡單可能復雜吧,個人覺得就Matlab而言,其實沒多復雜的東西,很多都可以自行百度的。

  我的開發環境為windows10,Matlab2013b,我覺得系統和Matlab版本對學習影響不大,畢竟大家用的基本上都是2012以上的,所以版本影響不大。尤其是版本不是越高越好,適合自己的就好,說到底穩定能跑的動就行。

  <注:未完待續...>

2.Matlab開發環境和簡單介紹

  如何安裝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。 

 

3.Matlab的常見命令

   經常使用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矩陣操作的語法,太靈活了 ,掌握幾個基本的就可以完成很多工作了。

  <注:未完待續...>

4.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}
View Code

  

4.4.二進制寫入數據

 如果有大量的數據(數字)要保存的話,一般常用save函數保存為.mat文件,但是若要保存為.txt文件怎么辦?

這里可以利用fopen、fsprintf兩個函數來進行保存操作:

1.fopen:

FID= fopen(filename,permission)%用指定的方式(permission)打開文件(filename)
注1.:FID=+N(N是正整數):表示文件打開成功,文件代號是N.FID=-1: 表示文件打開不成功。
注2.:filename為文件路徑,建議使用相對路徑,不易出錯。
注3.:perimission打開方式參數由以下字符串確定:
    'r' 讀出
    'w' 寫入(文件若不存在,自動創建)
    'a' 后續寫入(文件若不存在,自動創建)
    'r+' 讀出和寫入(文件應已存在)
    'w+' 重新刷新寫入,(文件若不存在,自動創建)
...
例如:
fid=fopen('PRBS_gen.txt','w');%matlab計算結果 

2.fsprintf: 

 輸出到文本或者顯示屏,但是下面的函數將輸出到文本.

for i=1:length(data)
    fprintf(fid,'%d',data(i));%保存數字
    fprintf(fid,'%c',10);%保存字符 
end

 

 

5. .m或.fig文件編程與技巧

   在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是支持forifwhileswitch以及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
View Code

一個師兄寫的,我這里精簡了一些數據,這段代碼當時驚呆了我,可以細細品味。

   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)');
View Code

    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的字符串

 <注:未完待續...>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM