初學Matlab編程

計算機程序就是計算機指令的集合,不同的編程語言指令與功能是不一樣的.MATLAB語言是一種面向對象的高級語言,它具有編程效率高、易學易用的優點.


    MATLAB與其它大部分高級語言一樣,有它自己的控制流語句.控制流極其重要,因爲它使過去的計算影響將來的運算。MATLAB提供如下幾種控制流結構:For循環,While循環,If-Else-End結構和switch-case-end結構。由於這些結構經常包含大量的MATLAB命令,故經常出現在M文件中.MATLAB支持的控制流語句和C語言支持的控制流語句在調用格式上非常相似.


1.For 循環


    For循環允許一條語句或一組語句被重複執行預先指定的次數。For循環的一般形式是:


    for  x = array


        語句


    end


在for和end語句之間的語句按數組中的每一列執行一次。在每一次迭代中,x被指定爲數組的下一列,即在第n次循環中,x=array(:, n)。例如,


       for n=1:10


           x(n)=sin(n*pi/10);


       end


       x


       x =


    0.3090    0.5878    0.8090    0.9511    1.0000    0.9511    0.8090    0.5878    0.3090    0.0000


    換句話,第一語句是說:對n等於1到10,執行所有語句,直至下一個end語句。第一次通過For循環n=1,第二次,n=2,如此繼續,直至n=10。在n=10以後,For循環結束,然後執行end語句後面的任何命令.注意,該循環結束後,n=10.


    For循環的其它重要方面是:


    (1)For循環不能用For循環內重新賦值循環變量n來終止。


       for n=1:10


           x(n)=sin(n*pi/10);


           n=9;


       end


       x


       x =


    0.3090    0.5878    0.8090    0.9511    1.0000    0.9511    0.8090    0.5878    0.3090    0.0000


        n


        n=


           9


執行過程是這樣的:


n=1,


x(1)=sin(pi/10),


n=9,


n=2,


x(2)=sin(2*pi/10),


n=9,


n=3,


...,


n=10,


x(10)=sin(10*pi/10),


n=9.


循環結束後,n=9.


    (2)在For循環內接受任何有效的MATLAB數組。


    data=[3  9  45  6;  7  16  -1  5]


    data =


          3     9    45     6


          7    16    -1     5


    for n=data


        x=n(1)-n(2)


    end


       x =


          -4


       x =


          -7


       x =


          46


       x =


          1


    (3)For循環可按需要嵌套。


      for n=1:5


          for m=1:5


              A(n,m)=n^2+m^2;


          end


          disp(n)


      end


      1


      2


      3


      4


      5


      A


      A =


          2     5    10    17    26


          5     8    13    20    29


          10    13    18    25    34


          17    20    25    32    41


          26    29    34    41    50


    (4)當有一個等效的數組方法來解給定的問題時,應避免用For循環。例如,上面的第一個例子可被重寫爲


       n=1:10;


       x=sin(n*pi/10)


       x =


    0.3090    0.5878    0.8090    0.9511    1.0000    0.9511    0.8090    0.5878    0.3090    0.0000


兩種方法得出同樣的結果,而後者執行更快,更直觀,要求較少的輸入。


    (5)爲了得到最大的速度,在For循環(While循環)被執行之前,應預先分配數組。例如,前面所考慮的第一種情況,在For循環內每執行一次命令,變量x的大小增加1。迫使MATLAB每通過一次循環要花費時間對x分配更多的內存。爲了消去這個步驟,For循環的例子應重寫爲


    x=zeros(1,10); 


    for n=1:10


        x(n)=sin(n*pi/10);


    end


現在,只有x(n)的值需要改變。


    例1 相傳古代印度國王要褒獎他的聰明能幹的宰相達依爾(國際象棋發明者),問他要什麼?達依爾回答:“陛下只要在國際象棋棋盤的第一個格子上放一粒麥子,第二個格子上放二粒麥子,以後每個格子的麥子數都按前一格的兩倍計算。如果陛下按此法給我64格的麥子,就感激不盡,其他什麼也不要了。”國王想:“這還不容易!”讓人扛了一袋麥子,但很快用光了,再扛出一袋還不夠,請你爲國王算一下共要給達依爾多少小麥?(1小麥約顆)


    解 麥粒總數爲


       


    程序如下:


a=1;


s=0


for i=1:64


    s=s+a;


    a=2*a;


end


s=s/1.4/10^8


運行後得:


s=


   1.3176e+011


    例2 公元前五世紀我國古代數學家張丘建在《算經》一書中提出了“百雞問題”:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、母、雛各幾何?


     解 設 x:雞翁數,則x的範圍:0~19


           y:雞母數,則y的範圍:0~33


           z:雞雛數,則z的範圍:0~100


則:


     x+y+z=100


     5x+3y+z/3=100


這是一個不定方程。


for x=0:19


    for y=0:33


        for z=0:100


            if (x+y+z==100)&(5*x+3*y+z/3==100)


                d=[x,y,z]


            end


        end


    end


end


運行後得結果:


d =


     0    25    75


d =


     4    18    78


d =


     8    11    81


d =


    12     4    84


2.While  循環


    與For循環以固定次數求一組命令的值相反,While 循環以不定的次數重複執行一組語句。While循環的一般形式是:


    while 表達式1


          語句1


    end


只要表達式1裏的所有元素爲真,就執行while和end之間的語句1,否則,就結束循環。通常,表達式的值給出一個標量值,但數組值也同樣有效。在數組情況下,當數組的所有元素爲真(值不等零)時,就執行語句1,數組中有一個元素爲假(值爲零),就結束循環。


   例3 按下面的公式計算:


       


使誤差小於給定的.


   解 把作爲誤差,程序如下:


error=input('請輸入誤差:');


x=1;


y=0;


n=1;


while x>error


    y=y+1;


    x=x/n;


    n=n+1;


end


e=y


運行如下:


請輸入誤差:0.001


e =


    2.7181


3.IF-ELSE-END 結構


    很多情況下,命令的序列必須根據關係的檢驗有條件地執行。在編程語言裏,這種邏輯由某種If-Else-End結構來提供。最簡單的If-Else-End結構是:


   if  表達式1


       語句1


   end


    如果在表達式1中的所有元素爲真(非零),那麼就執行if和end語言之間的語句1。


    假如有兩個選擇,If-Else-End結構是:


    if  表達式1


        語句1


     else


        語句2


     end


在這裏,如果表達式1爲真,則執行語句1;如果表達式是假,則執行語句2。


    當有三個或更多的選擇時,If-Else-End結構採用形式


     if 表達式1


        語句1


     elseif 表達式2


        語句2


     elseif 表達式3


        語句3


     elseif 表達式4


        語句4


     elseif ……


            .


            .


            .


     else


         語句


     end


    如果表達式1爲真,則執行語句1,結束循環;如果表達式1爲假,則檢驗表達式2,如果表達式2爲真,則執行語句2,結束循環;如果表達式2爲假,則檢驗表達式3,如此下去,如果所有表達式都爲假時,則執行最後的語句。即只執行第一個真值表達式相關的語句;接下來的表達式不檢驗,跳過其餘的If-Else-End結構。而且,最後的else命令可有可無。


4.switch-case-end結構


    如果在一個程序中,必須針對某個變量不同取值情況進行相應操作,switch語句比if else語句更方便。switch語句的一般形式爲:


    switch 分支條件(數值或字符串)


    case  數值(或字符串)條件1


          語句1


    case  數值(或字符串)條件2


          語句2


    case  數值(或字符串)條件3


          語句3


    case  ...


          ...


    otherwise


          語句


    end


其中分支條件可以是一個函數、變量或者表達式.如果條件1與分支條件匹配就執行語句1,退出循環;否則,檢驗條件2,如果條件2與分支條件匹配執行語句2,退出循環;否則,檢驗條件3,...,當所有條件都不與分支條件匹配時就執行最後的語句。注意otherwise是可以省略的。


    例4 在圖形界面上放置一個彈出式菜,點擊彈出式菜單可以設置曲線顏色。


    解:程序如下:


x=linspace(-6,6,50);


y=sin(x);


h=plot(x,y,'linewidth',4);


h0=uicontrol('position',[600,500,100,30],...


    'style','popupmenu',...


    'string','紅色|藍色|黃色|黑色|青色',...


    'callback',...


    ['v=get(h0,''value'');',...


        'switch v;',...


        'case 1;',...


        'set(h,''color'',''r'');',...


        'case 2;',...


        'set(h,''color'',''b'');',...


        'case 3;',...


        'set(h,''color'',''y'');',...


        'case 4;',...


        'set(h,''color'',''k'');',...


        'case 5;',...


        'set(h,''color'',''c'');',...


        'end;']);
發佈了17 篇原創文章 · 獲贊 31 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章