天天看點

初學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;']);

繼續閱讀