Matlab



[1] Matlab簡介

Matlab(Matrix Laboratory 矩陣實驗室)是由美國 The MathWorks 公司所發行之商業數學軟體,就如同其名稱一般,在矩陣運算方面相當強大,還可以繪製函數圖形、呼叫由 C/C++、Java、Python 等語言編寫之程式,常用於數值運算。還有很多額外的工具箱可以裝來用。

因為是商業軟體,所以要錢。但是許多大學都有 Matlab 的校園授權,所以還是可以當免費仔(誤。

Matlab 程式碼的檔案副檔名為 .m。


[2] 環境介紹

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

  • Command Window:用來打指令的視窗。可以執行單行的程式,程式的執行結果也會顯示在這。
  • Current Folder:此視窗中要打開 .m 檔所在之資料夾才能執行程式。
  • Editor:編寫程式的視窗。
  • Workspace:會列出所有儲存的變數名字與其數值。

[3] 基本語法

Matlab 是直譯語言,語法與 C 類似,在每行程式結尾要加分號(;)。

宣告

跟一般變數命名規則差不多,區分大小寫。若是不加分號(;)會進行輸出。

>> A = 123    % Matlab 不用宣告,預設為浮點數(double)。

A = 

    123       

>> B = "Hello World!"; 

宣告陣列/矩陣:空格等同於逗號(,),換行等同於分號(;)。

>> C = [1 2 
        3 4];
>> C2 = [1,2;3,4];    % 此兩變數相等
>> C3 = [C C2]

C3 =

     1     2     1     2
     3     4     3     4

運算子

邏輯運算子
&&
||
~
算數運算子
+ 加法
- 減法
* 矩陣乘法
/ 矩陣除法(右除)A/B = A*B^-1
\ 矩陣除法(左除)A\B = A^-1*B
^ 次方
' 共軛轉置(矩陣專用)

注意:矩陣除法中的左除是矩陣限定運算。

在 Matlab 中,乘法(包含次方)與除法的被乘(除)數若是遇上矩陣(陣列),會變成矩陣的乘法與除法,要特別注意。

 >> C = [1 2;3 4];
 >> D = [5 6];
 >> C*D    %執行矩陣乘法
 
 Ans = 
 
      23   24

若想要一次對陣列/矩陣內的數值進行乘除,則須在乘、除運算子前加上點(.)。若不是陣列/矩陣的話,加不加點都可以,但若是覺得難記的話就全部都加吧。

>> C = [1 2;3 4];
>> E = C.*6

E = 

     6  12
    18  24
>> E./C    % 兩個矩陣中相對應位置的數值相除

Ans = 

     6   6
     6   6
>> F = 12;
>> F/2     % 等同於F./2

F =
    6

輸入/輸出

輸入:

input('輸入提示文字, '型別')

第一個參數不可留白,第二個參數可指定輸入的型別,預設為浮點數(double)。

get1 = input('輸入文字提示');       % 括號內不能留白
get2 = input('輸入文字提示2','s');  % 's'可以將輸入值指定為字串

輸出:

disp(n)

disp 只接收、輸出一個參數。

fprintf('format',data)

fprintf 可以設定輸出的格式。

>> disp('輸出這行');
輸出這行
>>fprintf('pi=%10.5f\n',3.1415926);    % 格式輸出
pi=   3.14159
格式代碼 說明
%c 字元
%s 字串
%d 浮點數
%e 指數格式
%f 可設定位數

條件指令 if、迴圈指令 for

if 跟 for 的用法跟你們平常用的一樣,但是要記得在最後加上 end 才是 Matlab 的語法。

if age<18
    disp('未成年');
elseif age>=18 && age<20
    disp('刑法上已成年');
else
    disp('民法上已成年');    
end                         % 記得不要漏掉 end
sum =0;
for  i = 1:9
   sum = sum+i; 
end
disp(sum);    
>>
    45

for 若是給一二維陣列,則一次會取一直行的資料。

H = [2 3 4; 5 6 7];
for i = H
    fprintf('%d ',i);
    fprintf('\n');
end
>>
2 5
3 4
6 7

[4] 陣列/矩陣

在 Matlab 中,一維與二維陣列皆被視為是矩陣,適用各種矩陣運算,例如前面提過的矩陣除法與除法。

索引(Index)

Matlab 的陣列索引並不是從 0 開始,而是從 1,這點要特別注意。且 Matlab 有兩種索引,但是第二種會隨著陣列的大小不同而改變。

異質陣列

Matlab 的陣列並不限制每一項元素都要存相同型態的資料。
若是建立異質陣列需要以大括弧代替中括弧。

H = {'Hime',[23,26]}
>
H =

  1×2 cell array

    {'Hime'}    {1×2 double}

結構陣列

Matlab 的陣列可以直接用來實現類似 C++ 中 structure 的結構。

player.name = 'Steven';
player.id = 123345;
player.record = [86,95,89];
disp(player);
>>
player =
    name:'Steven'
      id:123345
  record:[86 95 89]
% 新增資料
player = struct('name', {'Steven', 'Kevin'}, 'record', {[86,95,89], [60,76,77]});
player(2) = [];                        % 刪除資料,[]的效果相當於C++的null
player2 = rmfield(player,'record');    % 刪除區塊

[5] 繪圖

Matlab 的繪圖功能也相當齊全,邏輯可以想像成我們先找出圖形各點在座標上的位置再連線。

x = linspace(0,4*pi);    % linspace(起點,終點),在起點與終點間取100個點(預設值)。
y = sin(x);              % 對x取sin值後放入y,y與X皆為1x100之陣列。
plot(x,y);               % plot(x,y),兩者必須大小相同。
xlim([0 6]);             % 限制x軸的顯示範圍,需寫在plot後方才能顯示效果。
ylim([-2 2]);            % 限制y軸的顯示範圍,需寫在plot後方才能顯示效果。

hold on;                 % 在此圖上繼續畫其他線,預設為off。
plot([0 4*pi],[0 0],'r-.');  % plot(x,y,格式),'r'為紅色,'-.'為點虛線。


除了顏色與線種外,Matlab也可以設定點的樣式與線的寬度。

顏色 點樣式 線樣式
B (藍) o - (實線)
C (青) x - - (虛線,實際上兩線間不用空格)
G (綠) * -. (點線)
K (黑) +
M (紫紅) .
R (紅) ^
W (白) v
Y (黃) >
<

另外還可以加上標題、圖例等。

x = linspace(0,4*pi);
y = sin(x);
z = cos(x);
plot(x,y,x,z);
title('sin&cos');               % 圖片的標題
legend('sin(x)','cos(x)');      % 圖例
xlabel("x");                    % x軸名稱
ylabel('y');                    % y軸名稱


[6] 常用函式

函式 功能
clear; 清空Workspace(所有變數)
close; 關閉存在的圖片視窗
zeros(m,n,,z) 產生一個m*n**z大小,元素皆為0的矩陣。
length( 陣列 ) 回傳值為陣列的行與列中,比較大的那個值。
size( 陣列 ) 回傳值為陣列的大小。
inv( 陣列 ) 計算矩陣的反矩陣(inverse)。
det( 陣列 ) 計算矩陣的行列式(determinate)。
cos(x) 計算x的cos值,並以弧度表示之。
cosd(x) 計算x的cos值,並以度(°)表示之。
log(x) 計算自然對數ln x
mod(x,y) 回傳值為x/y之餘數。
sqrt(x) 回傳值為x的平方根
abs(x) 回傳值為x的絕對值。
num2str(n) 將n的型別轉換成字元字串。
str2num(s) 將s的型別從字元字串轉換成數字陣列,以空格分段。

[7] 附錄

What is 矩陣?
矩陣是你們高二下的課程之一,這裡就只簡單介紹一下概念。
一個 MxN 的矩陣由 M 列(row)、N 行(column)所組成。

若矩陣要互相加減,此兩矩陣的大小必須相等。

矩陣的乘法規則如下圖,第一個(被除數)矩陣的行數必須等於第二個(除數)矩陣的列數。因此若是要對矩陣進行次方的動作,該矩陣的行數與列數必須相等。

矩陣其實沒有除法的概念,但是可以藉由反矩陣來達成類似的結果。
但不是所有矩陣都有反矩陣。


更詳細的你們就在數學課上好好學吧,因為我發現牽涉到太多你們還沒教的東西了。


tags: ckefgisc23rd