Matlab 編程入門(一):編程基礎


 

上學期學了一些matlab的知識,這學期再用時竟然發現已經忘得差不多了(┬_┬)

於是決定重新開始並將它們記錄下來,也方便自己以后查漏補缺!

 

M文件編程

  • 腳本文件

    matlab有自己的命令行窗口,對於簡單的命令,可以直接在命令行窗口輸入,但隨着命令行的增加或者命令本身復雜度的增加,再使用命令行就顯得有些不便了,這時就需要腳本文件了。可以說,腳本文件是matlab指令集合的封裝。

  • 函數文件  

    函數文件以function開始,end結束,這也是區別於腳本文件的地方。

     在function后面接着定義輸出參數,函數名和輸入參數,比如:          

             function [x,y,z] = math_count(a,b,c)    

    x,y,z是輸出參數,以方框括起來,math_count是函數名,a,b,c是輸入參數,以圓括號括起來。

     也可以沒有參數,比如:      

           function printresults(x,y)    

    printresults是函數名,x和y是輸入參數,沒有輸出參數。

  • 數據類型 

    matlab共有6中基本數據類型,分別是數值類型、邏輯類型、字符串、函數句柄、結構體和單元數組。這里我們簡單地介紹前四種。

  1. 數值類型           

     基本的數值類型包括整數類型和浮點數類型,額外的數值類型還有復數類型、無窮量(Inf)和非數值量(NaN),后面的兩種算是matlab的特色類型,當然要記錄一下啦!

    • 復數類型

      復數包括實部和虛部兩部分,matlab中默認使用i和j作為復數的虛部標志。創建復數時,可以直接利用復數形式進行輸入或使用函數complex。         

       z=1+2i  %利用復數形式進行輸入    

      輸出結果:  

                            

       z=complex(2,3)  %利用complex(x,y)函數進行輸入      

      輸出結果:

                                   

       z=complex(2%利用complex(x),如果x是實數,z=x+0i,如果x是復數,z=x

      輸出結果:

            

    • 無窮量(Inf)和非數值量(NaN)

      Matlab中使用Inf和-Inf分別代表正無窮量和負無窮量,NaN代表非數值量。

     正負無窮量通常由於運算溢出而產生的結果,而非數值量是由於0/0或Inf/Inf非正常運算產生的結果,並且這兩個NaN是不同的。

     Inf和NaN是Matlab中的特殊變量,除此之外,Matlab還有一些特殊的變量

    1. ans:系統默認的用作保存運算結果的變量名
    2. pi:圓周率
    3. eps:機器零閥值,Matlab中的最小數     

   2.邏輯類型

     Matlab把任何非0值當作為真,輸出為1,把零當作假,輸出為0.

     邏輯類型數據進行運算時需要用到關系操作符和邏輯運算符。

   對於Matlab的關系操作符,與c/c++基本相同,只有不等號有所不同,在c/c++中不等號為!=,而Matlab中不等號是~ =。

  3.字符和字符串

  字符和字符串分別是字符數組和字符串數組中的文本。

  1. 字符數組是一個字符序列,如c='Hello Word!'
  2. 字符串數組是文本片段的容器,字符串數組提供一組用於將文本處理為數據的函數。從R2017a開始,字符串也可以使用雙引號創建,如str="You are best!"
  3. string函數

    R2016b以后,可以使用字符串數組string代替字符數組。官方文檔表明,還可以按照標准數組運算對字符串數組

    進行索引、重構和串聯,還可以使用 + 運算符向字符串追加文本。(一切都在向c++看齊啊)

 4.函數句柄

  函數句柄是一種間接調用函數的方式,相當於對一個函數取別名。

  例如:如果你有一個函數為myfunction,現在給定語句   

           f=@myfunction   %f是一個句柄,可以通過f調用myfunction  

     可以通過函數句柄構造匿名函數或指定回調函數,也可以函數句柄將一個函數傳遞給另一個函數,或者從主函數內部調用局部函數

    下面給出通過函數句柄間接調用函數的例子:

    在命令行窗口輸入:     

           Handle=@sin;  %也可以自己建立函數,通過函數句柄間接調用           >> x=0:pi/4:pi; %通過冒號創建一維數組,0是第一個數,每次以pi/4為單位遞增,pi是最后一個數           >> y=Handle(x)

  輸出結果:

            

  有同學可能會問,直接調用不也是可以嗎,的確可以,但函數句柄有更多的優點,列舉幾個

  1.  提高運行速度。matlab對函數的調用每次都要搜索所有的路徑,使用函數句柄可以減少搜索,提高運行速度。
  2.  使用更方便。比如說,我在這個目錄運行后,創建了本目錄的一個函數句柄,當我轉到其他的目錄下的時候,創建的函數句柄還是可以直接調用的,而不需要把那個函數文件拷貝          過來。因為你創建的函數句柄中已經包含了路徑。
  • 控制流 

     Matlab的控制流也與c/c++大體相同,唯一要注意的是每個條件都有相應的end關鍵字。

    • 順序結構
    • 選擇結構
      • if—end
      • if—else—end
      • if—elseif—else—end  

     示例:

    新建腳本文件,保存為exe1_1    

            x=input('enter''x'':');%input函數返回你輸入的整數,提示信息用''括起來,如果想要輸出單引號,兩個單引號'' ''即可             if(x>0)               y=1;             elseif(x==0)              y=0;             else y=-1;             end      %不要忘記加end,Matlab不會自動補全end,最好一開始就寫下來,養成良好的編程習慣至關重要             disp(y)    %disp作為輸出函數

  在命令行窗口調用exe1_1,輸入-5

  得到結果:

           

  • switch—case結構  
  • 注意Matlab與c/c++語言的switch-case結構不一樣:只要條件滿足,立即返回,這也是為什么不用加break的原因。    

  示例:新建腳本文件,保存為ex1_2     

             month=3;
              switch month
                       case {3,4,5}
                          season='spring' 
                      case {6,7,8}
                          season='summer'
                      case {9,10,11}
                          season='autumn'
                      otherwise
                          season='winter'
                 end 

  得到結果:

       

  注意

  1.M文件的搜索路徑必須與當前路徑一致,否則運行會出錯,搜索路徑即保存M文件的位置。可以直接修改當前路徑與搜索路徑一致,也可以添加搜索路徑,這樣就一勞永逸了。  

           

  2.如果遇到不認識的函數,可以利用help/doc命令在命令行查找,格式為help/doc function,function為函數名,養成查閱文檔的習慣很重要!         

  •  循環結構   
    • while,for語句
    • break、continue、return ——行尾可以不用加分號   

      每一個關鍵字后面都要有與之對應的end關鍵字

 范例:

    使用0.618法(黃金分割法)極小化f(t)=exp(-t)+exp(t),區間為[-1,1]。(即逼近函數在已知區間的極小值,找到對應的t

    0.618法主要思想:

       0.618法在給定區間[a,b]內適當插入兩點a1,a2,並計算其函數值。

       a1,a2將區間分成三段,通過函數值大小的比較,刪去其中一段,使搜索區間得以縮小,

       然后再在保留下來的區間上作同樣的處理,如此迭代下去,從而得到極小點的數值近似解。

    0.618法主要步驟:

     1.在區間[a,b]內分別按照0.618和0.382的比例處取點a1 ,a2, 把[a,b]分為三段。 

     2.如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+0.618*(b-a)   

    3.如果f(a1)<f(a2) ,令b=a2,a2=a1,a1=a+0.382*(b-a)

    4.如果滿足迭代條件或者超出給定迭代次數,程序終止,否則繼續運行下去。    

      新建名為fai.m的函數和zero_soe.m的函數

1                   function z= fai(t) 2               %  fai函數 3               % 給定函數 4               z=1*exp(-t)+1*exp(t); 5              end               
 1              function [k] = zero_soe(a0,b0,iter,tol)  2              %UNTITLED3 精確線性搜索之0.618法  3              % a0,b0分別代表左端點,右端點  4              % iter代表給定的迭代次數  5              % tol代表誤差限  6             m=a0+0.382*(b0-a0);  %試探點lameda0  7             n=a0+0.618*(b0-a0);  %試探點u0  8             ym=fai(m);  9             yn=fai(n); 10             count=0;    %現有的迭代次數 11             while(count<iter) 12                 if(ym>yn) 13                     if(b0-m<=tol) 14                         k=n; 15                         return; 16                     else
17                         a0=m; 18                         m=n; 19                         ym=yn; 20                         n=a0+0.618*(b0-a0); 21                         yn=fai(n); 22                         count=count+1; 23              end 24                 else 
25                     if(n-a0<=tol) 26                         k=m; 27                       return; 28                     else
29                        b0=n; 30                        n=m; 31                        yn=ym; 32                        m=a0+0.382*(b0-a0); 33                        ym=fai(m); 34                        count=count+1; 35              end 36              end 37             end 38             if(count>=iter) 39                disp('迭代次數超過給定次數!') ; 40             end 41             end

 得到結果:

      

 通過求導可知函數的極小值對應的t等於0,可知極小化的結果是正確的。

 (皆大歡喜[]~( ̄▽ ̄)~*)

 

常用的函數命令

  • 輸入命令  
  1. clc:清除命令行窗口
  2. clf :即clear figure,清楚圖形窗口
  3. clear:清除工作區的變量,clear all是清除全部變量
  4. format:設置命令行窗口顯示格式
  5. iskeyword:確認輸入是否為關鍵字,如果沒有輸入,則輸出全部的關鍵字
  6. who:顯示當前變量名列表
  7. whos:顯示變量詳細列表
  8. which:查看關鍵字的路徑  
  • 幫助          
  1.  help:命令行窗口中函數的幫助
  2.  doc:幫助瀏覽器中的參考頁
  3. demo:幫助瀏覽器中查看示例
  4. lookfor:在所有幫助條目中查看關鍵字

        

常用快捷鍵  

  • Ctrl+R :注釋(對多行有效)
  • Ctrl+T :取消注釋(對多行注釋有效) 
  • Ctrl+Z :取消上一次操作  
  • Ctrl+I     :自動縮進(對多行有效)
  • Ctrl+[     :減少縮進(對多行有效)
  • Ctrl+]     :增加縮進(對多行有效)  
  • ↑光標鍵 :選擇最近的一次命令  
  • Esc:清除當前行

 

 

參考資料:

  

還沒有寫完,以后慢慢補吧~

  

 


免責聲明!

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



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