# Matlab
---
[TOC]
---
## \[1] Matlab簡介
Matlab(Matrix Laboratory 矩陣實驗室)是由美國 The MathWorks 公司所發行之商業數學軟體,就如同其名稱一般,在矩陣運算方面相當強大,還可以繪製函數圖形、呼叫由 C/C++、Java、Python 等語言編寫之程式,常用於數值運算。還有很多額外的工具箱可以裝來用。
因為是商業軟體,所以要錢。但是許多大學都有 Matlab 的校園授權,所以還是可以當免費仔(誤。
Matlab 程式碼的檔案副檔名為 .m。
---
## \[2] 環境介紹
![](https://i.imgur.com/0Xo5P5s.png)
- 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 有兩種索引,但是第二種會隨著陣列的大小不同而改變。
![](https://i.imgur.com/c6U44P8.png)
### 異質陣列
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'為紅色,'-.'為點虛線。
```
![](https://i.imgur.com/PJ7cGWg.jpg)
除了顏色與線種外,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軸名稱
```
![](https://i.imgur.com/Xedsi4Z.jpg)
---
## \[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)所組成。
![](https://i.imgur.com/vHKw5zr.png)
若矩陣要互相加減,此兩矩陣的大小必須相等。
![](https://i.imgur.com/HZFipi7.png)
矩陣的乘法規則如下圖,第一個(被除數)矩陣的行數必須等於第二個(除數)矩陣的列數。因此若是要對矩陣進行次方的動作,該矩陣的行數與列數必須相等。
![](https://i.imgur.com/EG9ruzq.png)
矩陣其實沒有除法的概念,但是可以藉由反矩陣來達成類似的結果。
但不是所有矩陣都有反矩陣。
![](https://i.imgur.com/sVKsl9N.png)
![](https://i.imgur.com/zbrLcW9.png)
更詳細的你們就在數學課上好好學吧,因為我發現牽涉到太多你們還沒教的東西了。
---
###### tags: `ckefgisc23rd`