顯示具有 meshgrid 標籤的文章。 顯示所有文章
顯示具有 meshgrid 標籤的文章。 顯示所有文章

2015年7月11日 星期六

第六週課程----gradient()、quiver()、bar()、barh()、pie()、hist()、comet()、contour()、contourc()、contourf()、polar()、stairs()

11.梯度向量場的gradient()及quiver()


gradient()函數命令格式如下
                                     [Ax,Ay,Az, ...] = gradient(A,hx,hy,hz, ...)
         其中 A 為 N-dimension 陣列,而hx、hy、hz, ...分別為沿第一維度第二維度維度、...,方向變數的間格


quiver()繪製箭頭函數命令格式如下
                                     quiver(X,Y)
         依據XY陣列中的X(i,j)Y(i,j)數值,以類似複數 z = X(i,j)+jY(i,j)在座標(i,j)上一具有方向與長度箭頭gradient()函數必須配合quiver()函數方可繪出梯度向量場圖形
例如

          >> [x, y] = meshgrid(-2:.2:2, -2:.2:2);                        %建立繪製x,y網格陣列
          >> A = x.^2.*y + x;
          >> [Ax, Ay] = gradient(A,.2,.2);
          >> contour(A), hold on, quiver(Ax,Ay), hold off      % contour為繪製等高線圖函數

12.長條圖bar()
bar()函數命令格式如下
格式一
                                     bar(Y,width)
         其中Y為一向量其內容為每個長條圖形的高,而width為每個長條圖形的寬,預設值為0.8width的數值建議小於等於1以避免條狀圖形互相重疊
例如
          >> y=[1 3 5 2];
          >> bar(y,1);      %長條圖形的寬為1
       


例如
          >> y=[1 3 5 2];
          >> bar(y), colormap(hot)      %設定暖色系顏色


格式二 
                                     bar(Y,width)
其中Y為一陣列,以Y的列為一群組分別繪製以Y的行數的條狀圖形
例如
          >> y=magic(4)
          y =
              16     2     3    13
               5    11    10     8
               9     7     6    12
               4    14    15     1
          >> bar(y)


格式三 
                                     bar(X,Y,width)
其中X為一向量,Y可為向量或,以X的內容指定水平軸的座標位置,若無X參數,則以1:size(Y,1)為水平軸的座標位置
例如
          >> y=magic(4)
          >> x = [2 6 8 11];
          >> bar(x,y)

格式 
                                     bar(X,Y,width,'type')
其中type可以為 'grouped' ,也可以是'stacked'grouped可將Y的每列內容以同一群組條狀圖形來繪製stacked則可將同一群組條狀圖形以堆疊方式繪製,內定值為grouped
例如
          >> y=magic(4)
          >> x = [2 6 8 11];
          >> bar(x,y,'stacked')
 

13.橫向長條圖barh()
barh()為bar()相似的函數,差別在於圖形以水平軸方式呈現
          例如
          >> y=magic(4)
          >> x = [2 6 8 11];
          >> barh(x,y,'stacked')

14.派形圖pie()
pie()函數命令格式如下
                                     pie(X,explode,labels)
         其中X可為向量或陣列explode亦向量或陣列,其維數或元素個數必須與X相同,當explode內容若不為0則表示相對於X位置的圖示部分會與其他部分分開呈現。而labels是一個cell陣列,其大小須與X相同,且只能包含字串,主要是提供描述扇形的意義。若無labels則會顯示各扇形所佔面積的百分比
例如
          >> x = [20 60 10; 30 15 50; 10 35 30; 40 20 10];
          >> explode = [0 0 0 1 0 0 0 0 0 0 0 0];
          >> labels = {'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'};
          >> pie(x,explode,labels)



15.直方圖(histogram)hist()
hist()函數與bar()函數相似hist()函數可自行定義區間數hist()函數命令格式如下
                                     N = hist(X,n)
         其中X可為向量或陣列而 區間數內定值為10hist()函數會依X內容大小分成  n 個區間,若設有回傳參數 N則 N 為 n 個區間內資料的個數若無回傳參數,則會繪出各區間統計數的直方圖
例如
          >> x = randn(100,1);
          >> N = hist(x,15)
          N =
            Columns 1 through 12
               2     1     4     5     6    11     6    16    20    14     8     1
            Columns 13 through 15
               4     0     2
          >> hist(x,15)

例如
          >> x = randn(100,3);     %以行為群組
          >> hist(x,20)                  %回傳20*3的陣列, 並以深藍色表示每組第一筆統計值



16.極座標統計圖rose()
rose()hist()函數相似rose()函數是以極座標方式呈現,但只針對向量內容做統計也不能有輸出參數。rose()函數命令格式如下
                                     rose(X,n)
         其中X為向量而 區間數內定值為20rose()函數也會依X內容大小分成  n 個區間,並繪出各區間統計個數的直方圖
例如
          >> x = randn(100,1);
          >> rose(x,30)
       


17.彗星圖comet()---俱動態畫的繪製圖形
comet()函數命令格式如下
                                     comet(x,y,p)
         其中xy皆為向量而 p彗星尾參數內定值為0.1彗星尾長定義為 p*length(y)
例如
          >> t = linspace(0,4*pi,10000); comet(t, sin(4*t)+cos(log(t/100)))     %綠色為彗星尾



18.等高線圖contour()、contourc()、contourf()
contour()函數命令格式如下
         格式一
                                     contour(z,n)
         其中 z 為(m*n)陣列而 等高線個數,若無 n 參數Matlab會自動調整等高線數等高線圖之水平軸座標為1~size(z,2)即1~n垂直軸座標為1~size(z,1)即1~m
例如
          >> z=[70 2 12 52 38 48; 8 28 33 17 10 15; 65 6 40 38 33 40; 4 36 29 13 18 11]
          z =
              70     2    12    52    38    48
               8    28    33    17    10    15
              65     6    40    38    33    40
               4    36    29    13    18    11
          >> contour(z,5)

格式二
                                     contour(x,y,z,n)
         其中 x 與 y 分別為水平軸座標、垂直軸座標陣列
例如
         >> [x,y,z] = peaks(50);
         >> contour(x,y,z,15)

格式三
                                     C=contour(x,y,z,[z1,z2,...,zn])
         其中 z1,z2,...,zn為指定的等高線而C為等高線回傳陣列。若只要繪出單一數值的等高線,必須指定兩個相同的等高線,e.g.  contour(x,y,z,[2, 2])就只繪出數值2的等高線
例如
         >> [x,y,z] = peaks(50);
         >> C=contour(x,y,z,[-2, 0, 2, 10]);
         >> clabel(C)                           % clabel()函數可標示出等高線數值
contourf()函數contourc()函數的用法與contour()函數相似,主要差異是contourf()函數會在等高圍線中填滿顏色contourc()函數只回傳計算等高線的陣列不會繪圖並且x與y皆要為向量,不可為陣列
例如
         >> [x,y,z] = peaks(50);
         >> C=contourf(x,y,z,[-2, 0, 2, 10]);
         >> clabel(C)


clabel()函數格式如下
格式一
                                     clabel(C,[z1,z2,...,zn])
         其中 等高線陣列,可在等高線圖上標記高度數值其中 z1,z2,...,zn為指定的等高線,此參數必須配合等高線計算函數contour()、contourf()或contourc,此參數可以省略

          格式二
                                     clabel(C,'manual')
其中 'manual' 是指可配合滑鼠控制在欲標示的等高線上標註數值。回返可按下 "Enter" 鍵

19.極座標曲線圖polar()
polar()函數可加入線條規範語法(Line specification syntax)來指定繪圖曲線的樣式polar()函數命令格式如下
                                              polar(theta,r)
         其中 theta 為角度向量而 r 半徑
例如
         >> t=0:0.01:2*pi;
         >> polar(t,3*sin(5*t)+1, '--r');

2013年2月26日 星期二

2.MATLAB基本功能介紹

變數
如同上一篇文章所述,由於MATLAB採用直譯方式,因此MATLAB變數不需事先宣告,我們可以在MATLAB敘述裡的任何位置直接指定某個變數來儲存資料或運算結果。
  1. 變數名稱是由英文字母、數字或底線所組成
  2. 開頭的第一個字元必須是英文字母
  3. 名稱長度不能超過63(含)個字元
  4. 會區分大小寫的變數

良好的程式設計
  1. 給變數一個具體且容易記憶的名稱(名字)。
  2. 加上變數名稱的註解。
  3. 以小寫字母命名變數。

與C語言相較
  1. C語言屬於一種高度類型化(Strongly typed)語言
  2. MATLAB屬於一種低度類型化(Weakly typed)語言
陣列
MATLAB裡,儲存資料的基本單位是陣列(Array),陣列可視為一種行列結構的資料,可以是向量(Vector)或矩陣(Matrix)形式的二維資料結構,也可以是多維陣列(Multi-dimensional array)形式的資料結構。若MATLAB的運算結果只是一個純量(Scalar)MATLAB也會將此結果視為二維陣列來處理,只不過它是一個1×1的二維陣
每一個方格中的小括號「( )」內容代表沿列、行或頁的元素索引值編號。例如(2,1,3)即指某個三維陣列的第2列、第1行、第3頁的元素。陣列元素的索引值是由1開始編號,這與C語言的陣列元素索引值由0開始編號不同,熟悉C語言的使用者必須留意。

可以在MATLAB的命令視窗提示符號「>>」之後直接宣告變數的初始值,宣告的格式如下:
            variable = expr
其中variable為變數名稱;expr(expression)可以是純量數值、二維或多維陣列、算數運算式、函式、或是其它變數。陣列須以左、右方括號「[」、「]」來標示陣列的啟始與終止;陣列的列元素可以用逗號「,(comma)或「space(空白)來做區隔;換列時須以分號「;(semicolon)來做換列的宣告(按下Enter鍵亦可)如下範例所示。
>> a=[2.5]                                          %宣告純量變數a,其中方括號可以省略 
a =
     2.5000
此時如同宣告變數a(1,1)等於2.5

>> row=[1 2 3]                                   %宣告列向量變數row 
row =
     1     2     3
此時如同宣告列向量變數row(1,1)=1row(1,2)=2row(1,3)=3 

>> column=[7; 8; 9]                           %宣告行向量變數column
column =
     7
     8
     9
此時如同宣告行向量變數column(1,1)=7column(2,1)=8column(3,1)=9

>> A=[1 3 5; 2 4 6]                              %宣告2×3矩陣變數A
A =
     1     3     5
     2     4     6

>> E(:,:,1)=[0 3 7; -1 0 3];                    %宣告三維陣列變數E
>> E(:,:,2)=[1 3 5; 2 4 6];
>> E(:,:,3)=[8 7 9; -2 3 0]
E(:,:,1) =
     0     3     7
    -1     0     3
E(:,:,2) =
     1     3     5
     2     4     6
E(:,:,3) =
     8     7     9
    -2     3     0

>> b=[]                                                   %宣告變數b為空陣列(Empty array)
b =
     []

矩陣A三維陣列E與純量a列向量row行向量column在陣列中的位置與數值如圖2.4所示。在E(:,:,1)敘述中第一個冒號「:(colon)表示所有的列索引值、第二個冒號「:」表示所有的行索引值,而1代表第一頁,也就是指第一頁的所有元素。此外,號還有其它的用法,將在2.7說明。MATLAB也允許以一維陣列的方式來表示元素個數相同的多維陣列資料,此時一維陣列的索引值是先以多維陣列的行方向開始編號,之後再依序是多維陣列的列方向、頁方向做編號。例如:a(1)=a(1,1)=2.5、row(2)=row(1,2)=2、column(2)=column(2,1)=8、A(2)=A(2,1)=2、A(5)=A(1,3)=5、E(9)=E(1,2,2)=3、E(17)=E(1,3,3)=9一維陣列之索引值如下圖方格的左下角編號 


 注意陣列的每一列每一,以及沿頁方向的元素的個數都必須相同

常用的特殊陣列函式
MATLAB除了有上述的永久常數之外,也提供一些常用的特殊陣列產生函式,可讓使用者能方便建立這些常用的特殊陣列

註1:參數class可以為doublesingleint8int16int32int64uint8uint16uint32以及uint64

>> [0:0.5:1.6]                                           %建構在0~1.6數值間等增量0.5列向量
ans =
         0    0.5000    1.0000    1.5000
>> linspace(0,1.6,4)                               %建構在0~1.6數值間4個等增量列向量
ans =
         0    0.5333    1.0667    1.6000
>> linspace(1.6,0,4)                               %建構在1.6~0數值間4個等減量列向量
ans =
    1.6000    1.0667    0.5333         0
>> freqspace(5)                                      %頻率0~1建立(5+1)/2個等增量向量
ans =
         0    0.4000    0.8000 
>> freqspace(6)                                      %頻率0~1建立6/2+1個等增量向量 
ans =
         0    0.3333    0.6667    1.0000
>> freqspace(4,'whole')                         %在頻率0~2間建立4個等增量列向量
ans =
         0    0.5000    1.0000    1.5000
>> logspace(-1,2,4)                                %在數值10^-1~10^2之間建立4個等比向量
ans =
    0.1000    1.0000   10.0000  100.0000
>> ind=[1 1; 3 2; 2 3; 2 3];                     %建立位置索引值陣列indval計算累加性的陣列A
>> val=[2; 4; 5; 7];
>> A=accumarray(ind,val)
A =
     2     0     0
     0     0    12
     0     4     0
>> eye(3)                                                 %建立3×3的單位矩陣
ans =
     1     0     0
     0     1     0
     0     0     1
>> eye(2,3)                                              %建立主對角線元素為1的2×3的單位矩陣
ans =
     1     0     0
     0     1     0
>> magic(3)                                             %建立3×3的魔術矩陣
ans =
     8     1     6
     3     5     7
     4     9     2
>> ones(2)                                               %建立全為12×2矩陣
ans =
     1     1
     1     1
>> rand(3)                                                %建立元素為均勻分佈在0~13×3矩陣 
ans =
    0.9501    0.4860    0.4565
    0.2311    0.8913    0.0185
    0.6068    0.7621    0.8214
>> randn(2,3)                                           %建立元素為常態分佈的2×3矩陣 
ans =
   -0.4326    0.1253   -1.1465
   -1.6656    0.2877    1.1909
>> zeros(2,3)                                            %建立全為02×3矩陣 
ans =
     0     0     0
     0     0     0
>> x=[1:3];                                                %xy軸向量產生(u,v)對的二維座標矩陣
>> y=0:2;
>> [u,v]=meshgrid(x,y)
u =
     1     2     3
     1     2     3
     1     2     3
v =
     0     0     0
     1     1     1
     2     2     2

此外陣列也可以由鍵盤輸入輸入的方法如下:
            my_value = input('提示語')

下列的陣列訊息函式也常在MATLAB程式中使用
length(A)
取得陣列A最長維的元素個數。若A為空陣列,則得到0
ndims(A)
Number of dimensions縮寫。取得陣列A的維數。
numel(A)
Number of elements縮寫。取得陣列A的元素總數。
size(A)
取得陣列A的列數、行數及頁數。若A為二維以上之陣列,則得到陣列結構大小的列向量值,分別為列個數、行個數、頁個數、
size(Ak)
取得陣列A的結構大小。k=1:取得陣列A的列數;k=2:取得陣列A的行數;k=3:取得陣列A的頁數,以此類推。

>> length(column)                                    %取得向量column列的元素個數
ans =
     3
>> length(A)                                              %取得陣列A最長維的元素個數, 等同於max(size(A))
ans =
     3
>> ndims(A)                                               %取得陣列A的維數
ans =
     2
>> numel(E)                                                %取得陣列E的元素總數
ans =
    18
>> size(E,1)                                                 %取得陣列E的列元素個數
ans =
     2
>> size(E,3)                                                 %取得陣列E的頁元素個數
ans =
     3
>> size(E)                                                    %取得陣列E結構大小,結果為列向量
ans =
     2     3     3


>> rand(1,2)+i*rand(1,2)                              %產生複數的亂數值
ans =   0.8936 + 0.3529i   0.0579 + 0.8132i
>> rand('state', sum(10*clock)), rand(1)     %可依時間產生不同的亂數值
ans =    0.6493
>> rand('state', sum(10*clock)), rand(1)     %可依時間產生不同的亂數值
ans =    0.2169>> randperm(10)                   %整數亂數陣列
ans =     4     6     3     5     9     1    10     2     8     7
>> randperm(10,4)
ans =     3     9     5     2