2010年11月1日 星期一

Matlab 的用法

一. 總結了MATLAB中冒號的用法和作用。附演示

1a:b   表示[a,a+1,……,b]
>> A=1:5
A =

     1     2     3     4     5


2當然如果b-a不是整數的話,則向量的最後一位數是n+a,且n=fixb-a
>> A=1.2: 4.9
A =
    1.2000    2.2000    3.2000    4.2000



3上面的前提是a< span>,如果a>b則會出現空值
>> A=5: 1
A =
   Empty matrix: 1-by-0
此時 A是空矩陣

4a:c:b表示[a,a+c,……,a+n*c],其中n=fix((b-a)/c)
>> A=1:3: 11
A =
     1     4     7    10


5) a:c:b在以下情況為空值
c>0,
a<0,< span>且a>b
>> A=11:3:
1
A =
   Empty matrix: 1-by-0

6) A(:)表示以一列的方式顯示A中所有元素

>> A=[1 2 3;4 5 6]
A =
     1     2     3
     4     5     6
>> A(:)
ans =
     1
     4
     2
     5
     3
     6


7b=A(i,: )表示把矩陣A的第i行存入b
>> b=A(1,:)
b =
     1     2     3


8b=A( :,j)表示把矩陣A的第j列存入b
>> b=A(:,1)
b =
     1
     4


9b=A(J :K)表示把矩陣A[A(J),A(J+1),...,A(K)]這些元素存入b
>> b=A(3:5)
b =
     2     5     3


10b=A:,c:d)表示把矩陣A的第c到第d列存入b中,當然cd大於A的列數則出錯(b=Ac:d,:)表示取行)
>> A=[1 2 3;4 5 6;7 8 9]
A =
     1     2     3
     4     5     6
     7     8     9
>> b=A(:,2:3)
b =
     2     3
     5     6
     8     9


11)
>> pic = imread('undersampling.tif');       % 讀入undersampling.tif'檔案
>> [x,y,z] = size(pic);                                    % x =
 97   y=116  z =3
>> A = [1:2:x];                                             % 取1, 3, 5, 7, ..., 97


12) Matlab 有一整套從浮點數取整數的函式
     fix( )指令是將小數部份「無條件捨去」。
           例如 fix(3.2) =3   fix(3.8)= 3
            而 fix(-3.2) =-3  fix(-3.8)=-3

     round( )函式是四捨五入 (rounding)
           例如 round(3.2) = 3   round(3.8)=4
                    round(-3.2)=-3    round(-3.8)= -4。

   ceil( ) 函式是「最小上界」(ceiling 天花板)
           例如 ceil(3.2) =4,但是 ceil(-3.2) = -3 

  floor( )函式是「最大下界」(floor 地板)。
          例如 floor(3.2) = 3,但是 floor(-3.2)= -4

如果 x 本來就是個整數,那麼 fix(x), round(x), ceil(x) 和 floor(x) 都是 x 本身,不會改變。
  sin(x)  Sine of argument x in radians
 sind(x)  Sine of argument x in degrees
 help sin 查詢命令sin( )
 help sind 查詢命令sind( )
clc
clear

13) 次方
計算次方的符號就是常用的 ^ 記號 。指數部份可以是任意數,例如

2^2 或  2^(-1) 或  2^(1/2) 2^(1.25) 或 10^6  或 10^(-6) =  10e-6
如果指數很小,科學記數法就會自動出現,例如
2^(-1074)
但是如果指數太小,計算的結果會自動「遜位」 (underflow) 成為 0,例如
2^(-1075)
如果指數很大,科學記數法也會自動出現,例如
2^1023
但是如果指數太大,計算的結果會「溢位」 (overflow) 成為 Inf,這就是「無限大」(infinity) 的意思,例如
2^1024
順便說另一個有趣的符號:NaN 就是 Not a Number 的意思 (不是個數)。譬如不小心計算了
0/0
就會得到 NaN。
但是,要執行負數的次方運算,可就要小心了。如果是負數的整數次方,都還可以理解,例如
(-2)^3 (-2)^(-3)
負數的非整數次方以"複數"來表示
EX: (-2)^(3.13)  -8.0343 - 3.4768i 
(-4)^(1/2)  0.0000 + 2.0000i  (表示"-4" 被開平方)
(-8)^(1/3) =  1.0000 + 1.7321i  (表示"-8" 被開3次方) 
14) 複數。
譬如我們要 Matlab 計算
sqrt(-1)
而以為他不會,但是他回答 0 + 1.0000i
Matlab 能夠在計算中自動產生複數,使用者也可以直接輸入複數。譬如
1 + 2i
注意,上面的 2i 之間,可以不寫一個 * 號,寫了也可以。Matlab 的所有運算符號、所有函式,都懂得如何做複數計算。例如
(1+2i) - (1-2i)
或者
3* (1+2i)
而此刻 abs( ) 計算的是複數的「長度」,例如
abs(3+4i)
根據畢氏定理,我們知道答案的確是 5。
複數的平方根是由「比較係數」法求得,例如要找 1+2i 的平方根,就計算 (a + bi)2 = 1+2i 然後比較係數得到聯立方程式
a2 - b2 = 1
2ab = 2
Matlab 可以代勞,只要說
sqrt(1+2i)
就行了。
最後,我們談談
(-1)^(1/3)
這是 -1 開三次方根的意思,我們一般會認為答案是 -1,但是 Matlab 說是 0.5000 + 0.8660i。稍加檢查,發現這個數是

它也就是複數平面單位圓上角度為 60 度的點。而 -1 的三次方根其實是 x3 = -1 的根,我們知道三次多項式在複數中必有三個根 (其中一個實根,兩個共軛複根), -1 只是其中一個根,而 Matlab 計算出來的另是一個複根。

假設某向量R=3+4j,則:
>>R=3+4j
   R =   3.0000 + 4.0000i
由此可以利用計算其絕對值abs(R)、夾角angle(R):
>>abs(R)
  ans =     5
>>angle(R)*180/pi
  ans =   53.1301
後者之角度已轉換為度數。利用同一複數量R亦可求其實數、虛數及共軛複數:
>>real(R) %實數部份 
  ans =     3
>>imag(R) %虛數部份
  ans =     4
>>conj(R) %共軛複數
  ans = 3.0000 - 4.0000i
根據尤拉公式,虛數之自然對數可以與正、餘弦作轉換,其基本型式為:
eix=cos(x)+ i sin(x)
此時,x之值為弧度值。因此利用這種轉換亦可將自然對數之型式轉換為三函數之關係:例如,設theta=[ 20 60 80]度,則

>>theta=[20 60 80]/180*pi %先轉換為弧度
  theta = 0.3491    1.0472    1.3963
>>eix=exp(i*theta)
  eix = 0.9397 + 0.3420i   0.5000 + 0.8660i   0.1736 + 0.9848i
>>cos(theta)+i*sin(theta)
  ans = 0.9397 + 0.3420i   0.5000 + 0.8660i   0.1736 + 0.9848i
由此可以證明三個不同角度下,其演算結果相同。
就超函數之定義而言,其值與指數間具確定的關係,依照前述之cosh(x)與sinh(x)之定義,兩者相加可以得到如下之如果:
ex=cosh(x)+sinh(x)
>>cosh(1:5)+sinh(1:5)
ans = 2.7183    7.3891   20.0855   54.5982  148.4132
>>exp(1:5)
ans = 2.7183    7.3891   20.0855   54.5982  148.4132

兩者對應之結果一致。

15)  MATLAB中怎麼把小數轉換為分數(小數轉分數,最簡分數)
MATLAB中,有些計算的結果是小數。怎麼把小數轉換為分數?
如計算a=1/3。計算出的結果是a=0.333333,怎麼將此結果轉為1/3
 Answer : 使用 1) rats(a)    2) format rata
EX: 
a=1/3;
format rat;
a=1/3
EX:
rats(199.981/9)
ans = 3533/159  

16)  MATLAB中怎麼把小數轉換為分數,並且取出分子,分母
 Answer: 使用 numden 函數
EX:
a=199.996
b=9
c=a/b
str_a= num2str(rats(c));        %轉換為分數,並將分數轉為字串
[n,m]=numden(sym(rats(c)))       %將分子取出為n 分母取出為m
r=double(n);                       %Convert symbolic matrix to MATLAB numeric form%
s=double(m);                     %Convert symbolic matrix to MATLAB numeric form%
disp (['n(分子)=' num2str(r)]);
disp (['m(分母)=' num2str(s)]);

二、矩陣運算的範例 (download) 

補充 :  陣列矩陣差異
    陣列的運算是“對應位置”的元素做運算,與矩陣運算差異甚大,請小心分辨使用時機。
    二維陣列又稱為矩陣,行列數相等的矩陣稱變方陣
ex:  陣列乘法
>> a=(0:9)
a =  陣列
     0     1     2     3     4     5     6     7     8     9
>> b=(9:-1:0)
b = 陣列
     9     8     7     6     5     4     3     2     1     0
>> a.*b                   %   陣列乘法,  a陣列中的元素分別與b陣列中的元素相乘
ans =
     0     8    14    18    20    20    18    14     8     0
>> a*b  (矩陣乘法)
??? Error using ==> mtimes
Inner matrix dimensions must agree.
note:矩陣乘法中a的列數必需等於b的行數
 
ex: 矩陣乘法
>> a
 =
     1     2     3
     4     5     6

>> b

b =

     5     6
     7     8
     9    10

>> a*b
ans =

    46    52
   109   124

>> a
a =
     1     2     3
     4     5     6
     7     8     9

>> b
b =
     4     5     6
     7     8     9
     1     2     3
>> a*b
ans =
    21    27    33
    57    72    87
    93   117   141

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。