# 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`