MATLAB - 快速指南



MATLAB - 概述

MATLAB(矩陣實驗室)是一種第四代高階程式語言和互動式環境,用於數值計算、視覺化和程式設計。

MATLAB 由 MathWorks 開發。

它允許進行矩陣操作;函式和資料的繪圖;演算法的實現;使用者介面的建立;與用其他語言編寫的程式介面,包括 C、C++、Java 和 FORTRAN;分析資料;開發演算法;以及建立模型和應用程式。

它具有許多內建命令和數學函式,可幫助您進行數學計算、生成繪圖和執行數值方法。

MATLAB 的計算數學能力

MATLAB 用於計算數學的各個方面。以下是它最常用於的一些常用數學計算:

  • 處理矩陣和陣列
  • 2D 和 3D 繪圖和圖形
  • 線性代數
  • 代數方程
  • 非線性函式
  • 統計
  • 資料分析
  • 微積分和微分方程
  • 數值計算
  • 積分
  • 變換
  • 曲線擬合
  • 各種其他特殊函式

MATLAB 的特性

以下是 MATLAB 的基本特性:

  • 它是一種用於數值計算、視覺化和應用程式開發的高階語言。

  • 它還提供了一個互動式環境,用於迭代探索、設計和解決問題。

  • 它提供了豐富的數學函式庫,用於線性代數、統計、傅立葉分析、濾波、最佳化、數值積分和求解常微分方程。

  • 它提供了用於視覺化資料和建立自定義繪圖的內建圖形。

  • MATLAB 的程式設計介面提供了開發工具,用於提高程式碼質量、可維護性和最大化效能。

  • 它提供了用於構建具有自定義圖形介面的應用程式的工具。

  • 它提供了用於將基於 MATLAB 的演算法與外部應用程式和語言(如 C、Java、.NET 和 Microsoft Excel)整合的函式。

MATLAB 的用途

MATLAB 廣泛用作科學和工程中的計算工具,涵蓋物理學、化學、數學和所有工程學科。它用於各種應用,包括:

  • 訊號處理和通訊
  • 影像和影片處理
  • 控制系統
  • 測試和測量
  • 計算金融
  • 計算生物學

MATLAB - 環境設定

本地環境設定

設定 MATLAB 環境只需點選幾下即可。安裝程式可以從這裡下載。

MathWorks 提供許可產品、試用版和學生版。您需要登入網站並等待一段時間以獲得他們的批准。

下載安裝程式後,可以透過點選幾下安裝軟體。

Online Installlation of MATLAB

Installing

瞭解 MATLAB 環境

MATLAB 開發 IDE 可以從桌面上建立的圖示啟動。MATLAB 中的主要工作視窗稱為桌面。啟動 MATLAB 時,桌面將以其預設佈局顯示:

MATLAB desktop

桌面包含以下面板:

  • 當前資料夾 - 此面板允許您訪問專案資料夾和檔案。

  • Current Folder
  • 命令視窗 - 這是在命令列輸入命令的主要區域。它由命令提示符(>>)指示。

  • Command Window
  • 工作區 - 工作區顯示從檔案建立和/或匯入的所有變數。

  • Workspace
  • 命令歷史記錄 - 此面板顯示或返回在命令列輸入的命令。

  • Command History

設定 GNU Octave

如果您想在您的機器(Linux、BSD、OS X 或 Windows)上使用 Octave,請從下載 GNU Octave下載最新版本。您可以檢視給定的機器安裝說明。

MATLAB - 基本語法

MATLAB 環境的行為類似於一個超級複雜的計算器。您可以在 >> 命令提示符下輸入命令。

MATLAB 是一個解釋型環境。換句話說,您發出一個命令,MATLAB 會立即執行它。

實踐操作

輸入一個有效的表示式,例如:

5 + 5

然後按 ENTER

當您單擊“執行”按鈕或鍵入 Ctrl+E 時,MATLAB 會立即執行它,並返回以下結果:

ans = 10

讓我們再舉幾個例子:

3 ^ 2	       % 3 raised to the power of 2

當您單擊“執行”按鈕或鍵入 Ctrl+E 時,MATLAB 會立即執行它,並返回以下結果:

ans = 9

另一個例子:

sin(pi /2)	  % sine of angle 90o

當您單擊“執行”按鈕或鍵入 Ctrl+E 時,MATLAB 會立即執行它,並返回以下結果:

ans = 1

另一個例子:

7/0		      % Divide by zero

當您單擊“執行”按鈕或鍵入 Ctrl+E 時,MATLAB 會立即執行它,並返回以下結果:

ans = Inf
warning: division by zero

另一個例子:

732 * 20.3	

當您單擊“執行”按鈕或鍵入 Ctrl+E 時,MATLAB 會立即執行它,並返回以下結果:

ans =  1.4860e+04

MATLAB 為某些數學符號提供了一些特殊表示式,例如 pi 代表 π,Inf 代表 ∞,i(和 j)代表 √-1 等。Nan 代表“非數字”。

在 MATLAB 中使用分號 (;)

分號 (;) 表示語句的結束。但是,如果您想抑制和隱藏表示式的 MATLAB 輸出,請在表示式後新增分號。

例如:

x = 3;
y = x + 5

當您單擊“執行”按鈕或鍵入 Ctrl+E 時,MATLAB 會立即執行它,並返回以下結果:

y =  8

添加註釋

百分號 (%) 用於指示註釋行。例如:

x = 9	     % assign the value 9 to x

您還可以使用塊註釋運算子 % { 和 % } 編寫註釋塊。

MATLAB 編輯器包含工具和上下文選單項,可幫助您新增、刪除或更改註釋的格式。

常用運算子和特殊字元

MATLAB 支援以下常用運算子和特殊字元:

運算子 用途
+ 加號;加法運算子。
- 減號;減法運算子。
* 標量和矩陣乘法運算子。
.* 陣列乘法運算子。
^ 標量和矩陣冪運算子。
.^ 陣列冪運算子。
\ 左除運算子。
/ 右除運算子。
.\ 陣列左除運算子。
./ 陣列右除運算子。
: 冒號;生成等間距的元素並表示整行或整列。
( ) 括號;括起函式引數和陣列索引;覆蓋優先順序。
[ ] 方括號;括起陣列元素。
. 小數點。
省略號;續行運算子
, 逗號;分隔語句和行中的元素
; 分號;分隔列並抑制顯示。
% 百分號;指定註釋並指定格式。
_ 引號和轉置運算子。
._ 非共軛轉置運算子。
= 賦值運算子。

特殊變數和常量

MATLAB 支援以下特殊變數和常量:

名稱 含義
ans 最近的答案。

eps 浮點數精度的精度。
i,j 虛數單位√-1。
Inf 無窮大。
NaN 未定義的數值結果(非數字)。
pi π值。

變數命名

變數名由一個字母后跟任意數量的字母、數字或下劃線組成。

MATLAB區分大小寫

變數名可以是任意長度,但是MATLAB只使用前N個字元,其中N由函式namelengthmax給出。

儲存您的工作

save命令用於將工作區中的所有變數儲存為一個檔案,該檔案具有.mat副檔名,位於當前目錄中。

例如:

save myfile

您可以稍後隨時使用load命令重新載入該檔案。

load myfile

MATLAB - 變數

在MATLAB環境中,每個變數都是一個數組或矩陣。

您可以用簡單的方式分配變數。例如,

x = 3	       % defining x and initializing it with a value

MATLAB將執行上述語句並返回以下結果:

x = 3

它建立一個名為x的1×1矩陣,並在其元素中儲存值3。讓我們再看一個例子,

x = sqrt(16) 	% defining x and initializing it with an expression

MATLAB將執行上述語句並返回以下結果:

x = 4

請注意:

  • 一旦將變數輸入系統,您以後就可以引用它。

  • 變數必須在使用前具有值。

  • 當表示式返回的結果未分配給任何變數時,系統將其分配給名為ans的變數,該變數以後可以使用。

例如:

sqrt(78)

MATLAB將執行上述語句並返回以下結果:

ans =  8.8318

您可以使用此變數ans

sqrt(78);
9876/ans

MATLAB將執行上述語句並返回以下結果:

ans =  1118.2

讓我們看另一個例子:

x = 7 * 8;
y = x * 7.89

MATLAB將執行上述語句並返回以下結果:

y =  441.84

多重賦值

您可以在同一行進行多次賦值。例如,

a = 2; b = 7; c = a * b

MATLAB將執行上述語句並返回以下結果:

c = 14

我忘記了變數!

who命令顯示您使用過的所有變數名。

who

MATLAB將執行上述語句並返回以下結果:

Your variables are:
a    ans  b    c   

whos命令顯示有關變數的更多資訊:

  • 當前記憶體中的變數
  • 每個變數的型別
  • 分配給每個變數的記憶體
  • 它們是否是複數變數
whos

MATLAB將執行上述語句並返回以下結果:

Attr Name        Size        Bytes      Class
==== ====        ====        ====       ===== 
   a             1x1           8        double
   ans           1x70         757        cell
   b             1x1           8        double
   c             1x1           8        double

Total is 73 elements using 781 bytes     

clear命令從記憶體中刪除所有(或指定的)變數。

clear x     % it will delete x, won't display anything
clear       % it will delete all variables in the workspace
            %  peacefully and unobtrusively 

長賦值

長賦值可以使用省略號(...)擴充套件到另一行。例如,

initial_velocity = 0;
acceleration = 9.8;
time = 20;
final_velocity = initial_velocity + acceleration * time

MATLAB將執行上述語句並返回以下結果:

final_velocity = 196

format命令

預設情況下,MATLAB以四位小數顯示數字。這稱為短格式

但是,如果您需要更高的精度,則需要使用format命令。

format long命令顯示小數點後16位數字。

例如:

format long
x = 7 + 10/3 + 5 ^ 1.2

MATLAB將執行上述語句並返回以下結果:

x = 17.2319816406394

另一個例子:

format short
x = 7 + 10/3 + 5 ^ 1.2

MATLAB將執行上述語句並返回以下結果:

x = 17.232

format bank命令將數字四捨五入到兩位小數。例如,

format bank
daily_wage = 177.45;
weekly_wage = daily_wage * 6

MATLAB將執行上述語句並返回以下結果:

weekly_wage = 1064.70

MATLAB使用指數表示法顯示大數字。

format short e命令允許以四位小數加指數的指數形式顯示。例如,

例如:

format short e
4.678 * 4.9

MATLAB將執行上述語句並返回以下結果:

ans = 2.2922e+01

format long e命令允許以四位小數加指數的指數形式顯示。例如,

format long e
x = pi

MATLAB將執行上述語句並返回以下結果:

x = 3.141592653589793e+00

format rat命令給出計算結果的最接近的有理表示式。例如,

format rat
4.678 * 4.9

MATLAB將執行上述語句並返回以下結果:

ans = 34177/1491 

建立向量

向量是一維數字陣列。MATLAB允許建立兩種型別的向量:

  • 行向量
  • 列向量

行向量透過將元素集括在方括號中建立,使用空格或逗號分隔元素。

例如:

r = [7 8 9 10 11]

MATLAB將執行上述語句並返回以下結果:

r =

   7    8    9   10   11 

另一個例子:

r = [7 8 9 10 11];
t = [2, 3, 4, 5, 6];
res = r + t

MATLAB將執行上述語句並返回以下結果:

res =

         9         11         13         15         17

列向量透過將元素集括在方括號中建立,使用分號(;)分隔元素。

c = [7;  8;  9;  10; 11]

MATLAB將執行上述語句並返回以下結果:

c =
       7       
       8       
       9       
      10       
      11  

建立矩陣

矩陣是二維數字陣列。

在MATLAB中,矩陣是透過將每一行輸入為一系列空格或逗號分隔的元素來建立的,行的末尾用分號分隔。例如,讓我們建立一個3×3矩陣:

m = [1 2 3; 4 5 6; 7 8 9]

MATLAB將執行上述語句並返回以下結果:

m =
       1              2              3       
       4              5              6       
       7              8              9       

MATLAB - 命令

MATLAB是一個用於數值計算和資料視覺化的互動式程式。您可以透過在MATLAB提示符“>>”上鍵入命令在命令視窗中輸入命令。

在本節中,我們將提供常用的一般MATLAB命令列表。

管理會話的命令

MATLAB提供了各種用於管理會話的命令。下表提供了所有此類命令:

命令 用途
clc 清除命令視窗。
clear 從記憶體中刪除變數。
exist 檢查檔案或變數是否存在。
global 宣告變數為全域性變數。
help 搜尋幫助主題。
lookfor 在幫助條目中搜索關鍵字。
quit 停止MATLAB。
who 列出當前變數。
whos 列出當前變數(長顯示)。

與系統一起工作的命令

MATLAB提供了各種用於與系統一起工作的有用命令,例如將當前工作儲存到工作區中作為檔案,以及稍後載入檔案。

它還提供了各種用於其他與系統相關的活動的命令,例如,顯示日期、列出目錄中的檔案、顯示當前目錄等。

下表顯示了一些常用的與系統相關的命令:

命令 用途
cd 更改當前目錄。
date 顯示當前日期。
delete 刪除檔案。
diary 開啟/關閉日記檔案記錄。
dir 列出當前目錄中的所有檔案。
load 從檔案載入工作區變數。
path 顯示搜尋路徑。
pwd 顯示當前目錄。
save 將工作區變數儲存到檔案中。
type 顯示檔案的內容。
what 列出當前目錄中的所有MATLAB檔案。
wklread 讀取.wk1電子表格檔案。

輸入和輸出命令

MATLAB提供以下輸入和輸出相關命令:

命令 用途
disp 顯示陣列或字串的內容。
fscanf 從檔案讀取格式化資料。
format 控制螢幕顯示格式。
fprintf 對螢幕或檔案執行格式化寫入。
input 顯示提示並等待輸入。
; 抑制螢幕列印。

fscanffprintf命令的行為類似於C scanf和printf函式。它們支援以下格式程式碼:

格式程式碼 用途
%s 格式化為字串。
%d 格式化為整數。
%f 格式化為浮點數。
%e 以科學計數法格式化為浮點數。
%g 以最緊湊的形式格式化:%f或%e。
\n 在輸出字串中插入新行。
\t 在輸出字串中插入製表符。

format函式具有以下用於數字顯示的形式:

格式函式 顯示最多
format short 四位小數(預設)。
format long 16位小數。
format short e 五位數字加指數。
format long e 16位數字加指數。
format bank 兩位小數。
format + 正數、負數或零。
format rat 有理逼近。
format compact 抑制一些換行符。
format loose 重置為不太緊湊的顯示模式。

向量、矩陣和陣列命令

下表顯示了用於處理陣列、矩陣和向量的各種命令:

命令 用途
cat 連線陣列。
find 查詢非零元素的索引。
length 計算元素數量。
linspace 建立等間距向量。
logspace 建立對數間距向量。
max 返回最大元素。
min 返回最小元素。
prod 每列的乘積。
reshape 更改大小。
size 計算陣列大小。
sort 對每列進行排序。
sum 對每列求和。
eye 建立單位矩陣。
ones 建立全1陣列。
zeros 建立全0陣列。
cross 計算矩陣叉積。
dot 計算矩陣點積。
det 計算陣列的行列式。
inv 計算矩陣的逆。
pinv 計算矩陣的偽逆。
rank 計算矩陣的秩。
rref 計算簡化行階梯形。
cell 建立元胞陣列。
celldisp 顯示元胞陣列。
cellplot 顯示元胞陣列的圖形表示。
num2cell 將數值陣列轉換為元胞陣列。
deal 匹配輸入和輸出列表。
iscell 識別元胞陣列。

繪圖命令

MATLAB提供了許多用於繪製圖形的命令。下表顯示了一些常用的繪圖命令:

命令 用途
axis 設定軸限。
fplot 函式的智慧繪圖。
grid 顯示網格線。
plot 生成xy圖。
print 列印繪圖或將繪圖儲存到檔案。
title 在繪圖頂部放置文字。
xlabel 向x軸新增文字標籤。
ylabel 向y軸新增文字標籤。
axes 建立座標軸物件。
close 關閉當前繪圖。
close all 關閉所有繪圖。
figure 開啟一個新的圖形視窗。
gtext 透過滑鼠啟用標籤放置。
hold 凍結當前繪圖。
legend 透過滑鼠放置圖例。
refresh 重新繪製當前圖形視窗。
set 指定物件(如座標軸)的屬性。
subplot 在子視窗中建立繪圖。
text 在圖形中放置字串。
bar 建立條形圖。
loglog 建立對數-對數圖。
polar 創建極座標圖。
semilogx 建立半對數圖。(對數橫座標)。
semilogy 建立半對數圖。(對數縱座標)。
stairs 建立階梯圖。
stem 建立莖狀圖。

MATLAB - M 檔案

到目前為止,我們一直使用 MATLAB 環境作為計算器。但是,MATLAB 也是一種強大的程式語言,以及一個互動式計算環境。

在前面的章節中,您已經學習瞭如何從 MATLAB 命令提示符輸入命令。MATLAB 還允許您將一系列命令寫入檔案,並將該檔案作為一個完整的單元執行,就像編寫函式並呼叫它一樣。

M 檔案

MATLAB 允許編寫兩種程式檔案:

  • 指令碼 − 指令碼檔案是具有.m 副檔名的程式檔案。在這些檔案中,您編寫要一起執行的一系列命令。指令碼不接受輸入也不返回任何輸出。它們對工作區中的資料進行操作。

  • 函式 − 函式檔案也是具有.m 副檔名的程式檔案。函式可以接受輸入並返回輸出。內部變數對函式是區域性的。

您可以使用 MATLAB 編輯器或任何其他文字編輯器來建立您的.m檔案。在本節中,我們將討論指令碼檔案。指令碼檔案包含多行連續的 MATLAB 命令和函式呼叫。您可以透過在命令列鍵入其名稱來執行指令碼。

建立和執行指令碼檔案

要建立指令碼檔案,您需要使用文字編輯器。您可以透過兩種方式開啟 MATLAB 編輯器:

  • 使用命令提示符
  • 使用 IDE

如果您使用的是命令提示符,請在命令提示符中鍵入edit。這將開啟編輯器。您可以直接鍵入edit,然後鍵入檔名(帶有 .m 副檔名)

edit 
Or
edit <filename>

上述命令將在預設的 MATLAB 目錄中建立檔案。如果您想將所有程式檔案儲存在特定資料夾中,則必須提供完整路徑。

讓我們建立一個名為 progs 的資料夾。在命令提示符 (>>) 處鍵入以下命令:

mkdir progs    % create directory progs under default directory
chdir progs    % changing the current directory to progs
edit  prog1.m  % creating an m file named prog1.m

如果您是第一次建立檔案,MATLAB 會提示您確認。單擊“是”。

Creating a Script File

或者,如果您使用的是 IDE,請選擇“新建” -> “指令碼”。這也會開啟編輯器並建立一個名為 Untitled 的檔案。您可以在鍵入程式碼後命名並儲存檔案。

在編輯器中鍵入以下程式碼:

NoOfStudents = 6000;
TeachingStaff = 150;
NonTeachingStaff = 20;
Total = NoOfStudents + TeachingStaff ...
   + NonTeachingStaff;
disp(Total);

建立並儲存檔案後,您可以透過兩種方式執行它:

  • 單擊編輯器視窗上的執行按鈕或

  • 只需在命令提示符中鍵入檔名(不帶副檔名):>> prog1

命令視窗提示符顯示結果:

6170

示例

建立一個指令碼檔案,並鍵入以下程式碼:

a = 5; b = 7;
c = a + b
d = c + sin(b)
e = 5 * d
f = exp(-d)

編譯並執行上述程式碼後,會產生以下結果:

c =  12
d =  12.657
e =  63.285
f =    3.1852e-06

MATLAB - 資料型別

MATLAB 不需要任何型別宣告或維度語句。每當 MATLAB 遇到一個新的變數名時,它都會建立該變數並分配適當的記憶體空間。

如果變數已存在,則 MATLAB 會用新內容替換原始內容,並在必要時分配新的儲存空間。

例如:

Total = 42

上述語句建立一個名為“Total”的 1×1 矩陣,並在其中儲存值 42。

MATLAB 中可用的資料型別

MATLAB 提供 15 種基本資料型別。每種資料型別儲存的資料都以矩陣或陣列的形式存在。此矩陣或陣列的大小至少為 0×0,並且可以增長到任何大小的矩陣或陣列。

下表顯示了 MATLAB 中最常用的資料型別:

序號 資料型別和描述
1

int8

8 位有符號整數

2

uint8

8 位無符號整數

3

int16

16 位有符號整數

4

uint16

16 位無符號整數

5

int32

32 位有符號整數

6

uint32

32 位無符號整數

7

int64

64 位有符號整數

8

uint64

64 位無符號整數

9

single

單精度數值資料

10

double

雙精度數值資料

11

logical

邏輯值 1 或 0,分別表示真和假

12

char

字元資料(字串儲存為字元向量)

13

cell array

索引單元格的陣列,每個單元格都能夠儲存不同維度和資料型別的陣列

14

structure

類似 C 的結構體,每個結構體都有命名欄位,能夠儲存不同維度和資料型別的陣列

15

function handle

指向函式的指標

16

user classes

從使用者定義的類構造的物件

17

java classes

從 Java 類構造的物件

示例

建立一個包含以下程式碼的指令碼檔案:

str = 'Hello World!'
n = 2345
d = double(n)
un = uint32(789.50)
rn = 5678.92347
c = int32(rn)

編譯並執行上述程式碼後,會產生以下結果:

str = Hello World!
n =  2345
d =  2345
un = 790
rn = 5678.9
c =  5679

資料型別轉換

MATLAB 提供各種函式用於將值從一種資料型別轉換為另一種資料型別。下表顯示了資料型別轉換函式:

函式 用途
char 轉換為字元陣列(字串)
int2str 將整數資料轉換為字串
mat2str 將矩陣轉換為字串
num2str 將數字轉換為字串
str2double 將字串轉換為雙精度值
str2num 將字串轉換為數字
native2unicode 將數字位元組轉換為 Unicode 字元
unicode2native 將 Unicode 字元轉換為數字位元組
base2dec 將 N 進位制數字字串轉換為十進位制數字
bin2dec 將二進位制數字字串轉換為十進位制數字
dec2base 將十進位制轉換為字串表示的 N 進位制數字
dec2bin 將十進位制轉換為字串表示的二進位制數字
dec2hex 將十進位制轉換為字串表示的十六進位制數字
hex2dec 將十六進位制數字字串轉換為十進位制數字
hex2num 將十六進位制數字字串轉換為雙精度數字
num2hex 將單精度和雙精度轉換為 IEEE 十六進位制字串
cell2mat 將元胞陣列轉換為數值陣列
cell2struct 將元胞陣列轉換為結構體陣列
cellstr 從字元陣列建立字串的元胞陣列
mat2cell 將陣列轉換為元胞陣列,其中元胞的大小可能不同
num2cell 將陣列轉換為元胞陣列,其中元胞的大小一致
struct2cell 將結構體轉換為元胞陣列

資料型別的確定

MATLAB 提供各種函式用於識別變數的資料型別。

下表提供了用於確定變數資料型別的函式:

函式 用途
is 檢測狀態
isa 確定輸入是否為指定類的物件
iscell 確定輸入是否為元胞陣列
iscellstr 確定輸入是否為字串的元胞陣列
ischar 確定專案是否為字元陣列
isfield 確定輸入是否為結構體陣列欄位
isfloat 確定輸入是否為浮點陣列
ishghandle 對於控制代碼圖形物件控制代碼為真
isinteger 確定輸入是否為整數陣列
isjava 確定輸入是否為 Java 物件
islogical 確定輸入是否為邏輯陣列
isnumeric 確定輸入是否為數值陣列
isobject 確定輸入是否為 MATLAB 物件
isreal 檢查輸入是否為實數陣列
isscalar 確定輸入是否為標量
isstr 確定輸入是否為字元陣列
isstruct 確定輸入是否為結構體陣列
isvector 確定輸入是否為向量
class 確定物件的類
validateattributes 檢查陣列的有效性
whos 列出工作區中的變數,包括大小和型別

示例

建立一個包含以下程式碼的指令碼檔案:

x = 3
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
isnumeric(x)
 
x = 23.54
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
isnumeric(x)
 
x = [1 2 3]
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
 
x = 'Hello'
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
isnumeric(x)

執行該檔案時,會產生以下結果:

x = 3
ans = 0
ans = 1
ans = 1
ans = 1
ans = 1
x = 23.540
ans = 0
ans = 1
ans = 1
ans = 1
ans = 1
x =

          1          2          3

ans = 0
ans = 1
ans = 1
ans = 0
x = Hello
ans = 0
ans = 0
ans = 1
ans = 0
ans = 0

MATLAB - 運算子

運算子是告訴編譯器執行特定數學或邏輯操作的符號。MATLAB 旨在主要對整個矩陣和陣列進行操作。因此,MATLAB 中的運算子既作用於標量資料也作用於非標量資料。MATLAB 允許以下型別的基本運算:

  • 算術運算子
  • 關係運算符
  • 邏輯運算子
  • 按位運算
  • 集合運算

算術運算子

MATLAB 允許兩種不同型別的算術運算:

  • 矩陣算術運算
  • 陣列算術運算

矩陣算術運算與線性代數中定義的相同。陣列運算對一維和多維陣列都進行逐元素執行。

矩陣運算子和陣列運算子透過句點 (.) 符號區分。但是,由於加法和減法運算對於矩陣和陣列來說是相同的,因此這兩種情況下的運算子相同。下表簡要描述了這些運算子:

顯示示例

序號 運算子和描述
1

+

加法或一元加法。A+B 將儲存在變數 A 和 B 中的值相加。A 和 B 必須具有相同的大小,除非其中一個是標量。標量可以加到任何大小的矩陣上。

2

-

減法或一元減法。A-B 從 A 中減去 B 的值。A 和 B 必須具有相同的大小,除非其中一個是標量。標量可以從任何大小的矩陣中減去。

3

*

矩陣乘法。C = A*B 是矩陣 A 和 B 的線性代數乘積。更準確地說,

Matrix Multiplication

對於非標量 A 和 B,A 的列數必須等於 B 的行數。標量可以乘以任何大小的矩陣。

4

.*

陣列乘法。A.*B 是陣列 A 和 B 的逐元素乘積。A 和 B 必須具有相同的大小,除非其中一個是標量。

5

/

斜槓或矩陣右除。B/A 粗略地等同於 B*inv(A)。更準確地說,B/A = (A'\B')'。

6

./

陣列右除。A./B 是元素為 A(i,j)/B(i,j) 的矩陣。A 和 B 必須具有相同的大小,除非其中一個是標量。

7

\

反斜槓或矩陣左除。如果 A 是一個方陣,則 A\B 基本上等同於 inv(A)*B,但計算方式不同。如果 A 是一個 n×n 矩陣,而 B 是一個具有 n 個分量的列向量,或者是一個具有多個此類列的矩陣,則 X = A\B 是方程 AX = B 的解。如果 A 縮放比例不好或接近奇異,則會顯示警告訊息。

8

.\

陣列左除。A.\B 是一個矩陣,其元素為 B(i,j)/A(i,j)。A 和 B 必須具有相同的大小,除非其中一個是標量。

9

^

矩陣冪。如果 p 是標量,則 X^p 是 X 的 p 次冪。如果 p 是整數,則冪透過重複平方計算。如果整數為負數,則先對 X 求逆。對於 p 的其他值,計算涉及特徵值和特徵向量,例如,如果 [V,D] = eig(X),則 X^p = V*D.^p/V。

10

.^

陣列冪。A.^B 是一個矩陣,其元素為 A(i,j) 的 B(i,j) 次冪。A 和 B 必須具有相同的大小,除非其中一個是標量。

11

'

矩陣轉置。A' 是 A 的線性代數轉置。對於複數矩陣,這是共軛轉置。

12

.'

陣列轉置。A.' 是 A 的陣列轉置。對於複數矩陣,這不會涉及共軛。

關係運算符

關係運算符也可以作用於標量和非標量資料。陣列的關係運算符對兩個陣列執行逐元素比較,並返回大小相同的邏輯陣列,其中關係為真的元素設定為邏輯 1(真),關係為假的元素設定為邏輯 0(假)。

下表顯示了 MATLAB 中可用的關係運算符 -

顯示示例

序號 運算子和描述
1

<

小於

2

<=

小於或等於

3

>

大於

4

>=

大於或等於

5

==

等於

6

~=

不等於

邏輯運算子

MATLAB 提供兩種型別的邏輯運算子和函式 -

  • 逐元素 - 這些運算子作用於邏輯陣列的對應元素。

  • 短路 - 這些運算子作用於標量和邏輯表示式。

逐元素邏輯運算子對邏輯陣列逐元素進行運算。符號 &、| 和 ~ 分別是邏輯陣列運算子 AND、OR 和 NOT。

短路邏輯運算子允許對邏輯運算進行短路。符號 && 和 || 分別是邏輯短路運算子 AND 和 OR。

顯示示例

按位運算

按位運算子作用於位並執行逐位運算。&、| 和 ^ 的真值表如下 -

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

假設 A = 60;B = 13;現在以二進位制格式,它們將如下所示 -

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

MATLAB 提供了各種用於按位運算的函式,如“按位與”、“按位或”和“按位非”運算、移位運算等。

下表顯示了常用的按位運算 -

顯示示例

函式 用途
bitand(a, b) 整數 ab 的按位與
bitcmp(a) a 的按位補碼
bitget(a,pos) 獲取整數陣列 a 中指定位置 pos 的位
bitor(a, b) 整數 ab 的按位或
bitset(a, pos) 設定 a 的特定位置 pos 的位
bitshift(a, k) 返回 a 左移 k 位的結果,等效於乘以 2k。k 的負值對應於右移位或除以 2|k| 並向負無窮大舍入。任何溢位位都被截斷。
bitxor(a, b) 整數 ab 的按位異或
swapbytes 交換位元組順序

集合運算

MATLAB 提供了各種用於集合運算的函式,如並集、交集和測試集合成員資格等。

下表顯示了一些常用的集合運算 -

顯示示例

序號 函式 & 描述
1

intersect(A,B)

兩個陣列的集合交集;返回 A 和 B 共有的值。返回的值按排序順序排列。

2

intersect(A,B,'rows')

將 A 的每一行和 B 的每一行都視為單個實體,並返回 A 和 B 共有的行。返回矩陣的行按排序順序排列。

3

ismember(A,B)

返回一個與 A 大小相同的陣列,其中 A 的元素在 B 中找到的位置為 1(真)。在其他位置,它返回 0(假)。

4

ismember(A,B,'rows')

將 A 的每一行和 B 的每一行都視為單個實體,並返回一個向量,其中矩陣 A 的行也是 B 的行的位置為 1(真)。在其他位置,它返回 0(假)。

5

issorted(A)

如果 A 的元素按排序順序排列,則返回邏輯 1(真),否則返回邏輯 0(假)。輸入 A 可以是向量或 N×1 或 1×N 字串元胞陣列。如果 A 和 sort(A) 的輸出相等,則認為 A 已排序。

6

issorted(A, 'rows')

如果二維矩陣 A 的行按排序順序排列,則返回邏輯 1(真),否則返回邏輯 0(假)。如果 A 和 sortrows(A) 的輸出相等,則認為矩陣 A 已排序。

7

setdiff(A,B)

兩個陣列的集合差;返回 A 中不在 B 中的值。返回陣列中的值按排序順序排列。

8

setdiff(A,B,'rows')

將 A 的每一行和 B 的每一行都視為單個實體,並返回 A 中不在 B 中的行。返回矩陣的行按排序順序排列。

'rows' 選項不支援元胞陣列。

9

setxor

兩個陣列的集合異或

10

union

兩個陣列的集合並集

11

unique

陣列中的唯一值

MATLAB - 決策

決策結構要求程式設計師指定一個或多個條件,由程式進行評估或測試,以及在確定條件為真時要執行的語句或語句,以及可選地在確定條件為假時要執行的其他語句。

以下是大多數程式語言中典型的決策結構的一般形式 -

Decision making statements in MATLAB

MATLAB 提供以下型別的決策語句。單擊以下連結以檢視其詳細資訊 -

序號 語句 & 描述
1 if ... end 語句

if ... end 語句由一個布林表示式後跟一個或多個語句組成。

2 if...else...end 語句

if 語句後面可以跟一個可選的 else 語句,當布林表示式為假時執行。

3 If... elseif...elseif...else...end 語句

if 語句後面可以跟一個(或多個)可選的 elseif... 和一個 else 語句,這對於測試各種條件非常有用。

4 巢狀 if 語句

您可以在另一個 ifelseif 語句(s)中使用一個 ifelseif 語句。

5 switch 語句

switch 語句允許將變數與其值列表進行相等性測試。

6 巢狀 switch 語句

您可以在另一個 switch 語句(s)中使用一個 switch 語句。

MATLAB - 迴圈型別

可能存在需要執行程式碼塊多次的情況。通常,語句按順序執行。函式中的第一個語句首先執行,然後是第二個語句,依此類推。

程式語言提供各種控制結構,允許更復雜的執行路徑。

迴圈語句允許我們多次執行語句或語句組,以下是大多數程式語言中迴圈語句的一般形式 -

Loop Architecture

MATLAB 提供以下型別的迴圈來處理迴圈需求。單擊以下連結以檢視其詳細資訊 -

序號 迴圈型別 & 描述
1 while 迴圈

在給定條件為真的情況下重複執行語句或語句組。它在執行迴圈體之前測試條件。

2 for 迴圈

多次執行一系列語句,並縮寫管理迴圈變數的程式碼。

3 巢狀迴圈

您可以在任何其他迴圈中使用一個或多個迴圈。

迴圈控制語句

迴圈控制語句將其執行從正常順序更改。當執行離開作用域時,在該作用域中建立的所有自動物件都會被銷燬。

MATLAB 支援以下控制語句。單擊以下連結以檢視其詳細資訊。

序號 控制語句 & 描述
1 break 語句

終止 迴圈語句並將執行轉移到迴圈後緊跟的語句。

2 continue 語句

導致迴圈跳過其主體剩餘部分,並在重新迭代之前立即重新測試其條件。

MATLAB - 向量

向量是一維數字陣列。MATLAB允許建立兩種型別的向量:

  • 行向量
  • 列向量

行向量

行向量透過將元素集括在方括號中建立,使用空格或逗號分隔元素。

r = [7 8 9 10 11]

MATLAB將執行上述語句並返回以下結果:

r =

   7    8    9   10   11 

列向量

列向量是透過將元素集括在方括號中建立的,使用分號分隔元素。

c = [7;  8;  9;  10; 11]

MATLAB將執行上述語句並返回以下結果:

c =
      7       
      8       
      9       
      10       
      11  
 

引用向量的元素

您可以透過多種方式引用向量的一個或多個元素。向量 v 的第 i 個分量稱為 v(i)。例如 -

v = [ 1; 2; 3; 4; 5; 6];	% creating a column vector of 6 elements
v(3)

MATLAB將執行上述語句並返回以下結果:

ans =  3

當您使用冒號引用向量時,例如 v(:),將列出向量的所有分量。

v = [ 1; 2; 3; 4; 5; 6];	% creating a column vector of 6 elements
v(:)

MATLAB將執行上述語句並返回以下結果:

ans =
     1
     2
     3
     4
     5
     6

MATLAB 允許您從向量中選擇一系列元素。

例如,讓我們建立一個具有 9 個元素的行向量 rv,然後我們將透過編寫 rv(3:7) 引用元素 3 到 7 並建立一個名為 sub_rv 的新向量。

rv = [1 2 3 4 5 6 7 8 9];
sub_rv = rv(3:7)

MATLAB將執行上述語句並返回以下結果:

sub_rv =

   3   4   5   6   7

向量運算

在本節中,讓我們討論以下向量運算 -

MATLAB - 矩陣

矩陣是二維數字陣列。

在 MATLAB 中,您可以透過輸入每一行中以逗號或空格分隔的數字作為元素,並使用分號標記每一行的結束來建立矩陣。

例如,讓我們建立一個 4×5 矩陣 a -

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]

MATLAB將執行上述語句並返回以下結果:

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

引用矩陣的元素

要引用矩陣mx中第m行和第n列的元素,我們寫成−

mx(m, n);

例如,要引用上一節中建立的矩陣a的第2行第5列的元素,我們鍵入−

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(2,5)

MATLAB將執行上述語句並返回以下結果:

ans =  6

要引用第m列中的所有元素,我們鍵入A(:,m)。

讓我們從矩陣a的第4行的元素建立一個列向量v−

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
v = a(:,4)

MATLAB將執行上述語句並返回以下結果:

v =
      4
      5
      6
      7

您還可以選擇第m列到第n列的元素,為此我們寫成−

a(:,m:n)

讓我們建立一個較小的矩陣,取第二列和第三列的元素−

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(:, 2:3)

MATLAB將執行上述語句並返回以下結果:

ans =
      2     3
      3     4
      4     5
      5     6

同樣,您可以建立一個子矩陣,取矩陣的一部分。

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(:, 2:3)

MATLAB將執行上述語句並返回以下結果:

ans =
      2     3
      3     4
      4     5
      5     6

同樣,您可以建立一個子矩陣,取矩陣的一部分。

例如,讓我們建立一個子矩陣sa,取a的內部子部分−

3     4     5     
4     5     6     

為此,請寫−

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
sa = a(2:3,2:4)

MATLAB將執行上述語句並返回以下結果:

sa =
      3     4     5
      4     5     6

刪除矩陣中的行或列

您可以透過將空方括號集[]分配給該行或列來刪除矩陣的整行或整列。基本上,[]表示空陣列。

例如,讓我們刪除a的第四行−

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a( 4 , : ) = []

MATLAB將執行上述語句並返回以下結果:

a =
      1     2     3     4     5
      2     3     4     5     6
      3     4     5     6     7

接下來,讓我們刪除a的第五列−

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(: , 5)=[]

MATLAB將執行上述語句並返回以下結果:

a =
      1     2     3     4
      2     3     4     5
      3     4     5     6
      4     5     6     7

示例

在這個例子中,讓我們建立一個3x3的矩陣m,然後我們將這個矩陣的第二行和第三行復制兩次,建立一個4x3的矩陣。

建立一個包含以下程式碼的指令碼檔案:

a = [ 1 2 3 ; 4 5 6; 7 8 9];
new_mat = a([2,3,2,3],:)

執行檔案時,它會顯示以下結果−

new_mat =
      4     5     6
      7     8     9
      4     5     6
      7     8     9

矩陣運算

在本節中,讓我們討論以下基本且常用的矩陣運算−

MATLAB - 陣列

MATLAB 中所有資料型別的變數都是多維陣列。向量是一維陣列,矩陣是二維陣列。

我們已經討論了向量和矩陣。在本章中,我們將討論多維陣列。但是,在此之前,讓我們討論一些特殊型別的陣列。

MATLAB中的特殊陣列

在本節中,我們將討論一些建立一些特殊陣列的函式。對於所有這些函式,單個引數建立一個正方形陣列,雙引數建立一個矩形陣列。

zeros()函式建立一個全為零的陣列−

例如:

zeros(5)

MATLAB將執行上述語句並返回以下結果:

ans =
      0     0     0     0     0
      0     0     0     0     0
      0     0     0     0     0
      0     0     0     0     0
      0     0     0     0     0

ones()函式建立一個全為一的陣列−

例如:

ones(4,3)

MATLAB將執行上述語句並返回以下結果:

ans =
      1     1     1
      1     1     1
      1     1     1
      1     1     1

eye()函式建立一個單位矩陣。

例如:

eye(4)

MATLAB將執行上述語句並返回以下結果:

ans =
      1     0     0     0
      0     1     0     0
      0     0     1     0
      0     0     0     1

rand()函式建立一個(0,1)上均勻分佈的隨機數陣列−

例如:

rand(3, 5)

MATLAB將執行上述語句並返回以下結果:

ans =
   0.8147    0.9134    0.2785    0.9649    0.9572
   0.9058    0.6324    0.5469    0.1576    0.4854
   0.1270    0.0975    0.9575    0.9706    0.8003

幻方

幻方是一個正方形,當其元素按行、按列或對角線相加時,會產生相同的和。

magic()函式建立一個幻方陣列。它接受一個單一引數,該引數給出正方形的大小。引數必須是大於或等於3的標量。

magic(4)

MATLAB將執行上述語句並返回以下結果:

ans =
   16     2     3    13
   5    11    10     8
   9     7     6    12
   4    14    15     1

多維陣列

在MATLAB中,具有兩個以上維度的陣列稱為多維陣列。MATLAB中的多維陣列是普通二維矩陣的擴充套件。

通常,要生成多維陣列,我們首先建立一個二維陣列並對其進行擴充套件。

例如,讓我們建立一個二維陣列a。

a = [7 9 5; 6 1 9; 4 3 2]

MATLAB將執行上述語句並返回以下結果:

a =
   7     9     5
   6     1     9
   4     3     2

陣列a是一個3x3的陣列;我們可以透過提供如下值來向a新增第三個維度−

a(:, :, 2)= [ 1 2 3; 4 5 6; 7 8 9]

MATLAB將執行上述語句並返回以下結果:

a =

ans(:,:,1) =

   0   0   0
   0   0   0
   0   0   0

ans(:,:,2) =

   1   2   3
   4   5   6
   7   8   9

我們也可以使用ones()、zeros()或rand()函式建立多維陣列。

例如:

b = rand(4,3,2)

MATLAB將執行上述語句並返回以下結果:

b(:,:,1) =
   0.0344    0.7952    0.6463
   0.4387    0.1869    0.7094
   0.3816    0.4898    0.7547
   0.7655    0.4456    0.2760

b(:,:,2) =
   0.6797    0.4984    0.2238
   0.6551    0.9597    0.7513
   0.1626    0.3404    0.2551
   0.1190    0.5853    0.5060

我們還可以使用cat()函式構建多維陣列。它沿著指定的維度連線陣列列表−

cat()函式的語法為−

B = cat(dim, A1, A2...)

其中,

  • B是建立的新陣列

  • A1A2、...是要連線的陣列

  • dim是沿其連線陣列的維度

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

a = [9 8 7; 6 5 4; 3 2 1];
b = [1 2 3; 4 5 6; 7 8 9];
c = cat(3, a, b, [ 2 3 1; 4 7 8; 3 9 0])

執行檔案時,它會顯示−

c(:,:,1) =
      9     8     7
      6     5     4
      3     2     1
c(:,:,2) =
      1     2     3
      4     5     6
      7     8     9
c(:,:,3) =
      2     3     1
      4     7     8
      3     9     0

陣列函式

MATLAB 提供以下函式來排序、旋轉、置換、重塑或移動陣列內容。

函式 用途
length 向量或最大陣列維度的長度
ndims 陣列維度的數量
numel 陣列元素的數量
size 陣列維度
iscolumn 確定輸入是否為列向量
isempty 確定陣列是否為空
ismatrix 確定輸入是否為矩陣
isrow 確定輸入是否為行向量
isscalar 確定輸入是否為標量
isvector 確定輸入是否為向量
blkdiag 從輸入引數構造塊對角矩陣
circshift 迴圈移動陣列
ctranspose 複共軛轉置
diag 對角矩陣和矩陣的對角線
flipdim 沿指定維度翻轉陣列
fliplr 從左到右翻轉矩陣
flipud 從上到下翻轉矩陣
ipermute 反轉N維陣列的維度
permute 重新排列N維陣列的維度
repmat 複製和平鋪陣列
reshape 重塑陣列
rot90 將矩陣旋轉90度
shiftdim 移動維度
issorted 確定集合元素是否按排序順序排列
sort 按升序或降序對陣列元素進行排序
sortrows 按升序對行進行排序
squeeze 刪除單一維度
transpose 轉置
vectorize 將表示式向量化

示例

以下示例說明了上面提到的某些函式。

長度、維度和元素數量−

建立一個指令碼檔案,並將以下程式碼輸入其中−

x = [7.1, 3.4, 7.2, 28/4, 3.6, 17, 9.4, 8.9];
length(x)      % length of x vector
y = rand(3, 4, 5, 2);
ndims(y)       % no of dimensions in array y
s = ['Zara', 'Nuha', 'Shamim', 'Riz', 'Shadab'];
numel(s)       % no of elements in s

執行檔案時,它會顯示以下結果−

ans =  8
ans =  4
ans =  23

陣列元素的迴圈移位−

建立一個指令碼檔案,並將以下程式碼輸入其中−

a = [1 2 3; 4 5 6; 7 8 9]  % the original array a
b = circshift(a,1)         %  circular shift first dimension values down by 1.
c = circshift(a,[1 -1])    % circular shift first dimension values % down by 1 
                           % and second dimension values to the left % by 1.

執行檔案時,它會顯示以下結果−

a =
   1     2     3
   4     5     6
   7     8     9

b =
   7     8     9
   1     2     3
   4     5     6

c =
   8     9     7
   2     3     1
   5     6     4

排序陣列

建立一個指令碼檔案,並將以下程式碼輸入其中−

v = [ 23 45 12 9 5 0 19 17]  % horizontal vector
sort(v)                      % sorting v
m = [2 6 4; 5 3 9; 2 0 1]    % two dimensional array
sort(m, 1)                   % sorting m along the row
sort(m, 2)                   % sorting m along the column

執行檔案時,它會顯示以下結果−

v =
   23    45    12     9     5     0    19    17
ans =
   0     5     9    12    17    19    23    45
m =
   2     6     4
   5     3     9
   2     0     1
ans =
   2     0     1
   2     3     4
   5     6     9
ans =
   2     4     6
   3     5     9
   0     1     2

元胞陣列

元胞陣列是索引單元的陣列,其中每個單元可以儲存不同維度和資料型別的陣列。

cell函式用於建立元胞陣列。cell函式的語法為−

C = cell(dim)
C = cell(dim1,...,dimN)
D = cell(obj)

其中,

  • C是元胞陣列;

  • dim是標量整數或整數向量,指定元胞陣列C的維度;

  • dim1, ... , dimN是指定C維度的標量整數;

  • obj是以下之一−

    • Java陣列或物件
    • .NET型別為System.String或System.Object的陣列

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

c = cell(2, 5);
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}

執行檔案時,它會顯示以下結果−

c = 
{
   [1,1] = Red
   [2,1] =  1
   [1,2] = Blue
   [2,2] =  2
   [1,3] = Green
   [2,3] =  3
   [1,4] = Yellow
   [2,4] =  4
   [1,5] = White
   [2,5] =  5
}

訪問元胞陣列中的資料

有兩種方法可以引用元胞陣列的元素−

  • 將索引括在第一個括號()中,以引用單元集
  • 將索引括在大括號{}中,以引用單個單元中的資料

當您將索引括在第一個括號中時,它指的是單元集。

圓括號中的元胞陣列索引指的是單元集。

例如:

c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c(1:2,1:2)

MATLAB將執行上述語句並返回以下結果:

ans = 
{
   [1,1] = Red
   [2,1] =  1
   [1,2] = Blue
   [2,2] =  2
}

您還可以透過使用花括號索引來訪問單元的內容。

例如:

c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c{1, 2:4}

MATLAB將執行上述語句並返回以下結果:

ans = Blue
ans = Green
ans = Yellow

MATLAB - 冒號表示法

冒號(:)是MATLAB中最有用的運算子之一。它用於建立向量、陣列下標和指定迭代

如果要建立一個包含從1到10的整數的行向量,您可以寫−

1:10

MATLAB執行該語句並返回一個包含從1到10的整數的行向量−

ans =                                                                           
                                                                                
   1    2    3    4    5    6    7    8    9   10 

如果要指定除1以外的增量值,例如−

100: -5: 50

MATLAB執行該語句並返回以下結果−

ans =
   100    95    90    85    80    75    70    65    60    55    50

讓我們再舉一個例子−

0:pi/8:pi

MATLAB執行該語句並返回以下結果−

ans =
   Columns 1 through 7
      0    0.3927    0.7854    1.1781    1.5708    1.9635    2.3562
   Columns 8 through 9
      2.7489    3.1416

您可以使用冒號運算子建立索引向量以選擇陣列的行、列或元素。

下表描述了為此目的而使用的它(讓我們有一個矩陣A)−

格式 用途
A(:,j) 是A的第j列。
A(i,:) 是A的第i行。
A(:,:) 是等效的二維陣列。對於矩陣,這與A相同。
A(j:k) 是A(j)、A(j+1)、...、A(k)。
A(:,j:k) 是A(:,j)、A(:,j+1)、...、A(:,k)。
A(:,:,k) 是三維陣列A的第k頁。
A(i,j,k,:) 是四維陣列A中的一個向量。該向量包括A(i,j,k,1)、A(i,j,k,2)、A(i,j,k,3)等。
A(:) 是A的所有元素,被視為單個列。在賦值語句的左側,A(:)填充A,保留其之前的形狀。在這種情況下,右側必須包含與A相同數量的元素。

示例

建立一個指令碼檔案,並在其中鍵入以下程式碼−

A = [1 2 3 4; 4 5 6 7; 7 8 9 10]
A(:,2)      % second column of A
A(:,2:3)    % second and third column of A
A(2:3,2:3)  % second and third rows and second and third columns

執行檔案時,它會顯示以下結果−

A =
      1     2     3     4
      4     5     6     7
      7     8     9    10

ans =
      2
      5
      8

ans =
      2     3
      5     6
      8     9

ans =
      5     6
      8     9

MATLAB - 數字

MATLAB 支援各種數值類,包括有符號和無符號整數以及單精度和雙精度浮點數。預設情況下,MATLAB 將所有數值儲存為雙精度浮點數。

您可以選擇將任何數字或數字陣列儲存為整數或單精度數字。

所有數值型別都支援基本陣列運算和數學運算。

轉換為各種數值資料型別

MATLAB 提供以下函式來轉換為各種數值資料型別−

函式 用途
double 轉換為雙精度數
single 轉換為單精度數
int8 轉換為8位有符號整數
int16 轉換為16位有符號整數
int32 轉換為32位有符號整數
int64 轉換為64位有符號整數
uint8 轉換為8位無符號整數
uint16 轉換為16位無符號整數
uint32 轉換為32位無符號整數
uint64 轉換為64位無符號整數

示例

建立一個指令碼檔案,並鍵入以下程式碼−

x = single([5.32 3.47 6.28]) .* 7.5
x = double([5.32 3.47 6.28]) .* 7.5
x = int8([5.32 3.47 6.28]) .* 7.5
x = int16([5.32 3.47 6.28]) .* 7.5
x = int32([5.32 3.47 6.28]) .* 7.5
x = int64([5.32 3.47 6.28]) .* 7.5

執行檔案時,它會顯示以下結果−

x =

   39.900   26.025   47.100

x =

   39.900   26.025   47.100

x =

   38  23  45

x =

   38  23  45

x =

   38  23  45

x =

   38  23  45

示例

讓我們再擴充套件一下前面的例子。建立一個指令碼檔案,並鍵入以下程式碼−

x = int32([5.32 3.47 6.28]) .* 7.5
x = int64([5.32 3.47 6.28]) .* 7.5
x = num2cell(x)

執行檔案時,它會顯示以下結果−

x =

   38  23  45

x =

   38  23  45

x = 
{
   [1,1] = 38
   [1,2] = 23
   [1,3] = 45
}

最小和最大整數

intmax()intmin()函式返回所有型別的整數可以表示的最大值和最小值。

這兩個函式都將整數資料型別作為引數,例如intmax(int8)或intmin(int64),並返回可以使用整數資料型別表示的最大值和最小值。

示例

以下示例說明如何獲取整數的最小值和最大值。建立一個指令碼檔案,並在其中編寫以下程式碼−

% displaying the smallest and largest signed integer data
str = 'The range for int8 is:\n\t%d to %d ';
sprintf(str, intmin('int8'), intmax('int8'))
str = 'The range for int16 is:\n\t%d to %d ';
sprintf(str, intmin('int16'), intmax('int16'))
str = 'The range for int32 is:\n\t%d to %d ';
sprintf(str, intmin('int32'), intmax('int32'))
str = 'The range for int64 is:\n\t%d to %d ';
sprintf(str, intmin('int64'), intmax('int64'))
 
% displaying the smallest and largest unsigned integer data
str = 'The range for uint8 is:\n\t%d to %d ';
sprintf(str, intmin('uint8'), intmax('uint8'))
str = 'The range for uint16 is:\n\t%d to %d ';
sprintf(str, intmin('uint16'), intmax('uint16'))
str = 'The range for uint32 is:\n\t%d to %d ';
sprintf(str, intmin('uint32'), intmax('uint32'))
str = 'The range for uint64 is:\n\t%d to %d ';
sprintf(str, intmin('uint64'), intmax('uint64'))

執行檔案時,它會顯示以下結果−

ans = The range for int8 is:
	-128 to 127 
ans = The range for int16 is:
	-32768 to 32767 
ans = The range for int32 is:
	-2147483648 to 2147483647 
ans = The range for int64 is:
	0 to 0 
ans = The range for uint8 is:
	0 to 255 
ans = The range for uint16 is:
	0 to 65535 
ans = The range for uint32 is:
	0 to -1 
ans = The range for uint64 is:
	0 to 18446744073709551616 

最小和最大浮點數

realmax()realmin()函式返回可以用浮點數表示的最大值和最小值。

這兩個函式在使用引數'single'呼叫時,返回可以使用單精度資料型別表示的最大值和最小值,而在使用引數'double'呼叫時,返回可以使用雙精度資料型別表示的最大值和最小值。

示例

以下示例說明如何獲取最小和最大浮點數。建立一個指令碼檔案,並在其中編寫以下程式碼−

% displaying the smallest and largest single-precision 
% floating point number
str = 'The range for single is:\n\t%g to %g and\n\t %g to  %g';
sprintf(str, -realmax('single'), -realmin('single'), ...
   realmin('single'), realmax('single'))

% displaying the smallest and largest double-precision 
% floating point number
str = 'The range for double is:\n\t%g to %g and\n\t %g to  %g';
sprintf(str, -realmax('double'), -realmin('double'), ...
   realmin('double'), realmax('double'))

執行檔案時,它會顯示以下結果−

ans = The range for single is:                                                  
        -3.40282e+38 to -1.17549e-38 and                                        
         1.17549e-38 to  3.40282e+38                                            
ans = The range for double is:                                                  
        -1.79769e+308 to -2.22507e-308 and                                      
         2.22507e-308 to  1.79769e+308

MATLAB - 字串

在 MATLAB 中建立字元陣列非常簡單。事實上,我們已經多次使用過它。例如,您可以在命令提示符中鍵入以下內容:

my_string = 'Tutorials Point'

MATLAB將執行上述語句並返回以下結果:

my_string = Tutorials Point

MATLAB 將所有變數視為陣列,字串被視為字元陣列。讓我們使用 **whos** 命令來檢查上面建立的變數:

whos

MATLAB將執行上述語句並返回以下結果:

Name           Size            Bytes  Class    Attributes
my_string      1x16               32  char

有趣的是,您可以使用數值轉換函式(如 **uint8** 或 **uint16**)將字串中的字元轉換為其數值程式碼。**char** 函式將整數向量轉換回字元:

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

my_string = 'Tutorial''s Point';
str_ascii = uint8(my_string)        % 8-bit ascii values
str_back_to_char= char(str_ascii)  
str_16bit = uint16(my_string)       % 16-bit ascii values
str_back_to_char = char(str_16bit)  

執行檔案時,它會顯示以下結果−

str_ascii =

   84  117  116  111  114  105   97  108   39  115   32   80  111  105  110  116

str_back_to_char = Tutorial's Point
str_16bit =

   84  117  116  111  114  105   97  108   39  115   32   80  111  105  110  116

str_back_to_char = Tutorial's Point

矩形字元陣列

到目前為止,我們討論的字串是一維字元陣列;但是,我們需要儲存更多內容。我們需要在程式中儲存更多維度的文字資料。這是透過建立矩形字元陣列來實現的。

建立矩形字元陣列最簡單的方法是將兩個或多個一維字元陣列垂直或水平連線起來,具體取決於需要。

您可以透過以下任一方式垂直組合字串:

  • 使用 MATLAB 連線運算子 **[]** 並用分號 (;) 分隔每一行。請注意,在此方法中,每一行必須包含相同數量的字元。對於長度不同的字串,應根據需要用空格字元填充。

  • 使用 **char** 函式。如果字串長度不同,char 會用尾隨空格填充較短的字串,以便每一行具有相同數量的字元。

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

doc_profile = ['Zara Ali                             '; ...
               'Sr. Surgeon                          '; ...
               'R N Tagore Cardiology Research Center']
doc_profile = char('Zara Ali', 'Sr. Surgeon', ...
                  'RN Tagore Cardiology Research Center')

執行檔案時,它會顯示以下結果−

doc_profile =
Zara Ali                             
Sr. Surgeon                          
R N Tagore Cardiology Research Center
doc_profile =
Zara Ali                            
Sr. Surgeon                         
RN Tagore Cardiology Research Center

您可以透過以下任一方式水平組合字串:

  • 使用 MATLAB 連線運算子 **[]** 並用逗號或空格分隔輸入字串。此方法保留輸入陣列中的任何尾隨空格。

  • 使用字串連線函式 **strcat**。此方法會刪除輸入中的尾隨空格。

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

name =     'Zara Ali                             ';
position = 'Sr. Surgeon                          '; 
worksAt =  'R N Tagore Cardiology Research Center';
profile = [name ', ' position ', ' worksAt]
profile = strcat(name, ', ', position, ', ', worksAt)

執行檔案時,它會顯示以下結果−

profile = Zara Ali      , Sr. Surgeon      , R N Tagore Cardiology Research Center
profile = Zara Ali,Sr. Surgeon,R N Tagore Cardiology Research Center

將字串組合到元胞陣列中

從我們之前的討論中可以清楚地看出,組合長度不同的字串可能很麻煩,因為陣列中的所有字串都必須具有相同的長度。我們已在字串末尾使用空格來使它們的長度相等。

但是,組合字串的更有效方法是將結果陣列轉換為元胞陣列。

MATLAB 元胞陣列可以在陣列中儲存不同大小和型別的數。元胞陣列提供了一種更靈活的方式來儲存不同長度的字串。

**cellstr** 函式將字元陣列轉換為字串的元胞陣列。

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

name =     'Zara Ali                             ';
position = 'Sr. Surgeon                          '; 
worksAt =  'R N Tagore Cardiology Research Center';
profile = char(name, position, worksAt);
profile = cellstr(profile);
disp(profile)

執行檔案時,它會顯示以下結果−

{                                                                               
   [1,1] = Zara Ali                                                              
   [2,1] = Sr. Surgeon                                                           
   [3,1] = R N Tagore Cardiology Research Center                                 
}   

MATLAB 中的字串函式

MATLAB 提供了許多用於建立、組合、解析、比較和操作字串的字串函式。

下表簡要描述了 MATLAB 中的字串函式:

函式 用途
用於在字元陣列中儲存文字、組合字元陣列等的函式。
blanks 建立空格字元字串
cellstr 從字元陣列建立字串的元胞陣列
char 轉換為字元陣列(字串)
iscellstr 確定輸入是否為字串的元胞陣列
ischar 確定專案是否為字元陣列
sprintf 將資料格式化為字串
strcat 水平連線字串
strjoin 將元胞陣列中的字串連線成單個字串
用於識別字符串部分、查詢和替換子字串的函式
ischar 確定專案是否為字元陣列
isletter 字母字元的陣列元素
isspace 空格字元的陣列元素
isstrprop 確定字串是否屬於指定類別
sscanf 從字串讀取格式化資料
strfind 在一個字串中查詢另一個字串
strrep 查詢和替換子字串
strsplit 在指定分隔符處分割字串
strtok 字串的選定部分
validatestring 檢查文字字串的有效性
symvar 確定表示式中的符號變數
regexp 匹配正則表示式(區分大小寫)
regexpi 匹配正則表示式(不區分大小寫)
regexprep 使用正則表示式替換字串
regexptranslate 將字串轉換為正則表示式
用於字串比較的函式
strcmp 比較字串(區分大小寫)
strcmpi 比較字串(不區分大小寫)
strncmp 比較字串的前 n 個字元(區分大小寫)
strncmpi 比較字串的前 n 個字元(不區分大小寫)
用於將字串更改為大寫或小寫、建立或刪除空格的函式
deblank 從字串末尾刪除尾隨空格
strtrim 刪除字串開頭和結尾的空格
lower 將字串轉換為小寫
upper 將字串轉換為大寫
strjust 調整字元陣列

示例

以下示例說明了一些上述字串函式:

格式化字串

建立一個指令碼檔案,並將以下程式碼輸入其中−

A = pi*1000*ones(1,5);
sprintf(' %f \n %.2f \n %+.2f \n %12.2f \n %012.2f \n', A)

執行檔案時,它會顯示以下結果−

ans =  3141.592654 
   3141.59 
   +3141.59 
      3141.59 
   000003141.59 

連線字串

建立一個指令碼檔案,並將以下程式碼輸入其中−

%cell array of strings
str_array = {'red','blue','green', 'yellow', 'orange'};

% Join strings in cell array into single string
str1 = strjoin(str_array, "-")
str2 = strjoin(str_array, ",")

執行檔案時,它會顯示以下結果−

str1 = red-blue-green-yellow-orange
str2 = red,blue,green,yellow,orange

查詢和替換字串

建立一個指令碼檔案,並將以下程式碼輸入其中−

students = {'Zara Ali', 'Neha Bhatnagar', ...
            'Monica Malik', 'Madhu Gautam', ...
            'Madhu Sharma', 'Bhawna Sharma',...
            'Nuha Ali', 'Reva Dutta', ...
            'Sunaina Ali', 'Sofia Kabir'};
 
% The strrep function searches and replaces sub-string.
new_student = strrep(students(8), 'Reva', 'Poulomi')
% Display first names
first_names = strtok(students)

執行檔案時,它會顯示以下結果−

new_student = 
{
   [1,1] = Poulomi Dutta
}
first_names = 
{
   [1,1] = Zara
   [1,2] = Neha
   [1,3] = Monica
   [1,4] = Madhu
   [1,5] = Madhu
   [1,6] = Bhawna
   [1,7] = Nuha
   [1,8] = Reva
   [1,9] = Sunaina
   [1,10] = Sofia
}

比較字串

建立一個指令碼檔案,並將以下程式碼輸入其中−

str1 = 'This is test'
str2 = 'This is text'
if (strcmp(str1, str2))
   sprintf('%s and %s are equal', str1, str2)
else
   sprintf('%s and %s are not equal', str1, str2)
end

執行檔案時,它會顯示以下結果−

str1 = This is test
str2 = This is text
ans = This is test and This is text are not equal

MATLAB - 函式

函式是一組一起執行任務的語句。在 MATLAB 中,函式在單獨的檔案中定義。檔案和函式的名稱應相同。

函式在其自己的工作區(也稱為 **區域性工作區**)中操作變數,該工作區與您在 MATLAB 命令提示符下訪問的工作區(稱為 **基本工作區**)分開。

函式可以接受多個輸入引數,並且可以返回多個輸出引數。

函式語句的語法為:

function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)

示例

名為 *mymax* 的以下函式應寫入名為 *mymax.m* 的檔案中。它以五個數字作為引數,並返回這些數字中的最大值。

建立一個名為 mymax.m 的函式檔案,並在其中鍵入以下程式碼:

function max = mymax(n1, n2, n3, n4, n5)

%This function calculates the maximum of the
% five numbers given as input
max =  n1;
if(n2 > max)
   max = n2;
end
if(n3 > max)
   max = n3;
end
if(n4 > max)
   max = n4;
end
if(n5 > max)
   max = n5;
end

函式的第一行以關鍵字 **function** 開頭。它給出函式的名稱和引數的順序。在我們的示例中,*mymax* 函式有五個輸入引數和一個輸出引數。

緊跟在函式語句之後的註釋行提供幫助文字。當您鍵入以下內容時,將列印這些行:

help mymax

MATLAB將執行上述語句並返回以下結果:

This function calculates the maximum of the
   five numbers given as input

您可以這樣呼叫函式:

mymax(34, 78, 89, 23, 11)

MATLAB將執行上述語句並返回以下結果:

ans = 89

匿名函式

匿名函式類似於傳統程式語言中的行內函數,在單個 MATLAB 語句中定義。它包含一個 MATLAB 表示式和任意數量的輸入和輸出引數。

您可以在 MATLAB 命令列或函式或指令碼中定義匿名函式。

這樣,您就可以建立簡單的函式,而無需為它們建立檔案。

從表示式建立匿名函式的語法為

f = @(arglist)expression

示例

在此示例中,我們將編寫一個名為 power 的匿名函式,它將以兩個數字作為輸入,並返回第一個數字的第二個數字次冪。

建立一個指令碼檔案,並在其中鍵入以下程式碼−

power = @(x, n) x.^n;
result1 = power(7, 3)
result2 = power(49, 0.5)
result3 = power(10, -10)
result4 = power (4.5, 1.5)

執行檔案時,它會顯示−

result1 =  343
result2 =  7
result3 =  1.0000e-10
result4 =  9.5459

主函式和子函式

除匿名函式之外的任何函式都必須在檔案中定義。每個函式檔案都包含一個必需的主函式(首先出現)和任意數量的可選子函式(出現在主函式之後並由其使用)。

主函式可以從定義它們的外部檔案呼叫,無論是從命令列還是從其他函式呼叫,但子函式不能從命令列或其他函式呼叫,不能在函式檔案外部呼叫。

子函式僅對定義它們的函式檔案中的主函式和其他子函式可見。

示例

讓我們編寫一個名為 quadratic 的函式,該函式將計算二次方程的根。該函式將接收三個輸入,即二次係數、線性係數和常數項。它將返回根。

函式檔案 quadratic.m 將包含主函式 *quadratic* 和子函式 *disc*,後者計算判別式。

建立一個函式檔案 *quadratic.m*,並在其中鍵入以下程式碼:

function [x1,x2] = quadratic(a,b,c)

%this function returns the roots of 
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficients of x2, x and the 
%constant term
% It returns the roots
d = disc(a,b,c); 
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end   % end of quadratic

function dis = disc(a,b,c) 
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end   % end of sub-function

您可以從命令提示符處呼叫上述函式,如下所示:

quadratic(2,4,-4)

MATLAB將執行上述語句並返回以下結果:

ans = 0.7321

巢狀函式

您可以在另一個函式的主體中定義函式。這些稱為巢狀函式。巢狀函式包含任何其他函式的任何或所有元件。

巢狀函式在另一個函式的作用域內定義,並且它們共享對包含函式工作區的訪問許可權。

巢狀函式遵循以下語法:

function x = A(p1, p2)
...
B(p2)
   function y = B(p3)
   ...
   end
...
end

示例

讓我們重寫上一個示例中的 *quadratic* 函式,但是,這次 disc 函式將是一個巢狀函式。

建立一個函式檔案 *quadratic2.m*,並在其中鍵入以下程式碼:

function [x1,x2] = quadratic2(a,b,c)
function disc  % nested function
d = sqrt(b^2 - 4*a*c);
end   % end of function disc

disc;
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end   % end of function quadratic2

您可以從命令提示符處呼叫上述函式,如下所示:

quadratic2(2,4,-4)

MATLAB將執行上述語句並返回以下結果:

ans =  0.73205

私有函式

私有函式是一個主函式,它僅對有限數量的其他函式可見。如果您不想公開函式的實現,則可以將其建立為私有函式。

私有函式駐留在名稱為 **private** 的 **子資料夾** 中。

它們僅對父資料夾中的函式可見。

示例

讓我們重寫 *quadratic* 函式。但是,這次計算判別式的 *disc* 函式將是一個私有函式。

在工作目錄中建立一個名為 private 的子資料夾。將以下函式檔案 *disc.m* 儲存在其中:

function dis = disc(a,b,c) 
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end      % end of sub-function

在您的工作目錄中建立一個函式 quadratic3.m,並在其中鍵入以下程式碼:

function [x1,x2] = quadratic3(a,b,c)

%this function returns the roots of 
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficient of x2, x and the 
%constant term
% It returns the roots
d = disc(a,b,c); 

x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end      % end of quadratic3

您可以從命令提示符處呼叫上述函式,如下所示:

quadratic3(2,4,-4)

MATLAB將執行上述語句並返回以下結果:

ans =  0.73205

全域性變數

全域性變數可以被多個函式共享。為此,您需要在所有函式中將變數宣告為全域性變數。

如果要從基本工作區訪問該變數,則在命令列中宣告該變數。

全域性宣告必須在函式中實際使用變數之前發生。最好對全域性變數的名稱使用大寫字母,以將其與其他變數區分開來。

示例

讓我們建立一個名為 average.m 的函式檔案,並在其中鍵入以下程式碼:

function avg = average(nums)
global TOTAL
avg = sum(nums)/TOTAL;
end

建立一個指令碼檔案,並在其中鍵入以下程式碼−

global TOTAL;
TOTAL = 10;
n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];
av = average(n)

執行該檔案時,它將顯示以下結果:

av =  35.500

MATLAB - 資料匯入

在 MATLAB 中匯入資料意味著從外部檔案載入資料。**importdata** 函式允許載入各種不同格式的資料檔案。它具有以下五種形式:

序號 函式 & 描述
1

A = importdata(filename)

從 *filename* 表示的檔案將資料載入到陣列 A 中。

2

A = importdata('-pastespecial')

從系統剪貼簿而不是從檔案載入資料。

3

A = importdata(___, delimiterIn)

將 *delimiterIn* 解釋為 ASCII 檔案、filename 或剪貼簿資料中的列分隔符。您可以將 *delimiterIn* 與上述語法中的任何輸入引數一起使用。

4

A = importdata(___, delimiterIn, headerlinesIn)

從 ASCII 檔案、filename 或剪貼簿載入資料,從第 *headerlinesIn+1* 行開始讀取數值資料。

5

[A, delimiterOut, headerlinesOut] = importdata(___)

使用先前語法中的任何輸入引數,在 *delimiterOut* 中返回輸入 ASCII 檔案的檢測到的分隔符字元,並在 *headerlinesOut* 中返回檢測到的標題行數。

預設情況下,Octave 不支援 *importdata()* 函式,因此您需要搜尋並安裝此軟體包才能使以下示例與您的 Octave 安裝一起使用。

示例 1

讓我們載入並顯示一個影像檔案。建立一個指令碼檔案,並在其中鍵入以下程式碼:

filename = 'smile.jpg';
A = importdata(filename);
image(A);

執行該檔案時,MATLAB 會顯示影像檔案。但是,您必須將其儲存在當前目錄中。

Importing Imange Files

示例 2

在此示例中,我們匯入一個文字檔案並指定分隔符和列標題。讓我們建立一個以空格分隔的帶列標題的 ASCII 檔案,命名為 *weeklydata.txt*。

我們的文字檔案 weeklydata.txt 如下所示:

SunDay  MonDay  TuesDay  WednesDay  ThursDay  FriDay  SaturDay
95.01   76.21   61.54    40.57       55.79    70.28   81.53
73.11   45.65   79.19    93.55       75.29    69.87   74.68
60.68   41.85   92.18    91.69       81.32    90.38   74.51
48.60   82.14   73.82    41.03       0.99     67.22   93.18
89.13   44.47   57.63    89.36       13.89    19.88   46.60

建立一個指令碼檔案,並在其中鍵入以下程式碼−

filename = 'weeklydata.txt';
delimiterIn = ' ';
headerlinesIn = 1;
A = importdata(filename,delimiterIn,headerlinesIn);

% View data
for k = [1:7]
   disp(A.colheaders{1, k})
   disp(A.data(:, k))
   disp(' ')
end

執行檔案時,它會顯示以下結果−

SunDay
   95.0100
   73.1100
   60.6800
   48.6000
   89.1300
 
MonDay
   76.2100
   45.6500
   41.8500
   82.1400
   44.4700
 
TuesDay
   61.5400
   79.1900
   92.1800
   73.8200
   57.6300

WednesDay
   40.5700
   93.5500
   91.6900
   41.0300
   89.3600
 
ThursDay
   55.7900
   75.2900
   81.3200
   0.9900
   13.8900
 
FriDay
   70.2800
   69.8700
   90.3800
   67.2200
   19.8800

SaturDay
   81.5300
   74.6800
   74.5100
   93.1800
   46.6000

示例 3

在此示例中,讓我們從剪貼簿匯入資料。

將以下行復制到剪貼簿:

數學很簡單

建立一個指令碼檔案,並鍵入以下程式碼−

A = importdata('-pastespecial')

執行檔案時,它會顯示以下結果−

A = 
   'Mathematics is simple'

低階檔案 I/O

importdata 函式是一個高階函式。MATLAB 中的低階檔案 I/O 函式允許對讀取或寫入檔案的資料進行最精細的控制。但是,這些函式需要有關檔案的更多詳細資訊才能有效地工作。

MATLAB 提供以下函式用於位元組或字元級別的讀寫操作:

函式 描述
fclose 關閉一個或所有開啟的檔案
feof 測試檔案結束
ferror 檔案 I/O 錯誤資訊
fgetl 從檔案中讀取一行,刪除換行符
fgets 從檔案中讀取一行,保留換行符
fopen 開啟檔案或獲取有關開啟檔案的資訊
fprintf 將資料寫入文字檔案
fread 從二進位制檔案讀取資料
frewind 將檔案位置指示器移動到開啟檔案的開頭
fscanf 從文字檔案讀取資料
fseek 移動到檔案中的指定位置
ftell 開啟檔案中的位置
fwrite 將資料寫入二進位制檔案

使用低階 I/O 匯入文字資料檔案

MATLAB 提供以下函式用於文字資料檔案的低階匯入:

  • fscanf 函式讀取文字或 ASCII 檔案中的格式化資料。

  • fgetlfgets 函式每次讀取檔案的一行,其中換行符分隔每一行。

  • fread 函式以位元組或位級別讀取資料流。

示例

我們在工作目錄中儲存了一個名為“myfile.txt”的文字資料檔案。該檔案儲存了 2012 年 6 月、7 月和 8 月三個月的降雨資料。

myfile.txt 中的資料包含五個地點重複的時間、月份和降雨量測量值集。標題資料儲存月份數 M;因此我們有 M 個測量值集。

檔案如下所示:

Rainfall Data
Months: June, July, August
 
M = 3
12:00:00
June-2012
17.21  28.52  39.78  16.55 23.67
19.15  0.35   17.57  NaN   12.01
17.92  28.49  17.40  17.06 11.09
9.59   9.33   NaN    0.31  0.23 
10.46  13.17  NaN    14.89 19.33
20.97  19.50  17.65  14.45 14.00
18.23  10.34  17.95  16.46 19.34
09:10:02
July-2012
12.76  16.94  14.38  11.86 16.89
20.46  23.17  NaN    24.89 19.33
30.97  49.50  47.65  24.45 34.00
18.23  30.34  27.95  16.46 19.34
30.46  33.17  NaN    34.89  29.33
30.97  49.50  47.65  24.45 34.00
28.67  30.34  27.95  36.46 29.34
15:03:40
August-2012
17.09  16.55  19.59  17.25 19.22
17.54  11.45  13.48  22.55 24.01
NaN    21.19  25.85  25.05 27.21
26.79  24.98  12.23  16.99 18.67
17.54  11.45  13.48  22.55 24.01
NaN    21.19  25.85  25.05 27.21
26.79  24.98  12.23  16.99 18.67

我們將從該檔案匯入資料並顯示此資料。請執行以下步驟:

  • 使用 fopen 函式開啟檔案並獲取檔案識別符號。

  • 使用 格式說明符(例如字串的“%s”、整數的“%d”或浮點數的“%f”)描述檔案中的資料。

  • 要跳過檔案中的文字字元,請將它們包含在格式描述中。要跳過資料欄位,請在說明符中使用星號(“*”)。

    例如,要讀取標題並返回 M 的單個值,我們編寫:

    M = fscanf(fid, '%*s %*s\n%*s %*s %*s %*s\nM=%d\n\n', 1);
    
  • 預設情況下,fscanf 會根據我們的格式描述讀取資料,直到它找不到任何匹配的資料,或者到達檔案末尾。這裡我們將使用 for 迴圈讀取 3 組資料,每次讀取 7 行 5 列。

  • 我們將在工作區中建立一個名為 mydata 的結構來儲存從檔案中讀取的資料。該結構具有三個欄位 - timemonthraindata 陣列。

建立一個指令碼檔案,並在其中鍵入以下程式碼−

filename = '/data/myfile.txt';
rows = 7;
cols = 5;
 
% open the file
fid = fopen(filename);
 
% read the file headers, find M (number of months)
M = fscanf(fid, '%*s %*s\n%*s %*s %*s %*s\nM=%d\n\n', 1);
 
% read each set of measurements
for n = 1:M
   mydata(n).time = fscanf(fid, '%s', 1);
   mydata(n).month = fscanf(fid, '%s', 1);
 
   % fscanf fills the array in column order,
   % so transpose the results
   mydata(n).raindata  = ...
      fscanf(fid, '%f', [rows, cols]);
end
for n = 1:M
   disp(mydata(n).time), disp(mydata(n).month)
   disp(mydata(n).raindata)
end
 
% close the file
fclose(fid);

執行檔案時,它會顯示以下結果−

12:00:00
June-2012
   17.2100   17.5700   11.0900   13.1700   14.4500
   28.5200       NaN    9.5900       NaN   14.0000
   39.7800   12.0100    9.3300   14.8900   18.2300
   16.5500   17.9200       NaN   19.3300   10.3400
   23.6700   28.4900    0.3100   20.9700   17.9500
   19.1500   17.4000    0.2300   19.5000   16.4600
   0.3500   17.0600   10.4600   17.6500   19.3400

09:10:02
July-2012
   12.7600       NaN   34.0000   33.1700   24.4500
   16.9400   24.8900   18.2300       NaN   34.0000
   14.3800   19.3300   30.3400   34.8900   28.6700
   11.8600   30.9700   27.9500   29.3300   30.3400
   16.8900   49.5000   16.4600   30.9700   27.9500
   20.4600   47.6500   19.3400   49.5000   36.4600
   23.1700   24.4500   30.4600   47.6500   29.3400

15:03:40
August-2012
   17.0900   13.4800   27.2100   11.4500   25.0500
   16.5500   22.5500   26.7900   13.4800   27.2100
   19.5900   24.0100   24.9800   22.5500   26.7900
   17.2500       NaN   12.2300   24.0100   24.9800
   19.2200   21.1900   16.9900       NaN   12.2300
   17.5400   25.8500   18.6700   21.1900   16.9900
   11.4500   25.0500   17.5400   25.8500   18.6700

MATLAB - 資料輸出

MATLAB 中的資料匯出(或輸出)意味著寫入檔案。MATLAB 允許您在讀取 ASCII 檔案的其他應用程式中使用您的資料。為此,MATLAB 提供了多種資料匯出選項。

您可以建立以下型別的檔案:

  • 來自陣列的矩形、分隔的 ASCII 資料檔案。

  • 鍵擊和生成的文字輸出的日記(或日誌)檔案。

  • 使用低階函式(如 fprintf)的專用 ASCII 檔案。

  • MEX 檔案以訪問寫入特定文字檔案格式的 C/C++ 或 Fortran 例程。

除此之外,您還可以將資料匯出到電子表格。

有兩種方法可以將數值陣列匯出為分隔的 ASCII 資料檔案:

  • 使用 save 函式並指定 -ascii 限定符

  • 使用 dlmwrite 函式

使用 save 函式的語法為:

save my_data.out num_array -ascii

其中,my_data.out 是建立的分隔的 ASCII 資料檔案,num_array 是數值陣列,−ascii 是說明符。

使用 dlmwrite 函式的語法為:

dlmwrite('my_data.out', num_array, 'dlm_char')

其中,my_data.out 是建立的分隔的 ASCII 資料檔案,num_array 是數值陣列,dlm_char 是分隔符字元。

示例

以下示例演示了該概念。建立一個指令碼檔案並鍵入以下程式碼:

num_array = [ 1 2 3 4 ; 4 5 6 7; 7 8 9 0];
save array_data1.out num_array -ascii;
type array_data1.out
dlmwrite('array_data2.out', num_array, ' ');
type array_data2.out

執行檔案時,它會顯示以下結果−

   1.0000000e+00   2.0000000e+00   3.0000000e+00   4.0000000e+00
   4.0000000e+00   5.0000000e+00   6.0000000e+00   7.0000000e+00
   7.0000000e+00   8.0000000e+00   9.0000000e+00   0.0000000e+00

1 2 3 4
4 5 6 7
7 8 9 0

請注意,save -ascii 命令和 dlmwrite 函式不適用於單元陣列作為輸入。要從單元陣列的內容建立分隔的 ASCII 檔案,您可以

  • 或者,使用 cell2mat 函式將單元陣列轉換為矩陣

  • 或者使用低階檔案 I/O 函式匯出單元陣列。

如果使用 save 函式將字元陣列寫入 ASCII 檔案,它會將字元的 ASCII 等效項寫入檔案。

例如,讓我們將單詞“hello”寫入檔案:

h = 'hello';
save textdata.out h -ascii
type textdata.out

MATLAB 執行上述語句並顯示以下結果。即字串“hello”的字元以 8 位 ASCII 格式顯示。

1.0400000e+02   1.0100000e+02   1.0800000e+02   1.0800000e+02   1.1100000e+02

寫入日記檔案

日記檔案是 MATLAB 會話的活動日誌。diary 函式在磁碟檔案中建立會話的精確副本,但不包括圖形。

要開啟 diary 函式,請鍵入:

diary

可選地,您可以給出日誌檔案的名稱,例如:

diary logdata.out

要關閉 diary 函式:

diary off

您可以在文字編輯器中開啟日記檔案。

使用低階 I/O 將資料匯出到文字資料檔案

到目前為止,我們已經匯出了數值陣列。但是,您可能需要建立其他文字檔案,包括數值和字元資料的組合、非矩形輸出檔案或使用非 ASCII 編碼方案的檔案。為此,MATLAB 提供了低階 fprintf 函式。

與低階 I/O 檔案活動一樣,在匯出之前,您需要使用 fopen 函式開啟或建立檔案並獲取檔案識別符號。預設情況下,fopen 以只讀方式開啟檔案。您應該指定寫入或追加的許可權,例如“w”或“a”。

處理完檔案後,您需要使用 fclose(fid) 函式關閉它。

以下示例演示了該概念:

示例

建立一個指令碼檔案,並在其中鍵入以下程式碼−

% create a matrix y, with two rows
x = 0:10:100;
y = [x; log(x)];
 
% open a file for writing
fid = fopen('logtable.txt', 'w');
 
% Table Header
fprintf(fid, 'Log     Function\n\n');
 
% print values in column order
% two values appear on each row of the file
fprintf(fid, '%f    %f\n', y);
fclose(fid);

% display the file created
type logtable.txt

執行檔案時,它會顯示以下結果−

Log         Function

0.000000    -Inf
10.000000    2.302585
20.000000    2.995732
30.000000    3.401197
40.000000    3.688879
50.000000    3.912023
60.000000    4.094345
70.000000    4.248495
80.000000    4.382027
90.000000    4.499810
100.000000    4.605170

MATLAB - 繪圖

要繪製函式的圖形,您需要執行以下步驟:

  • 定義 x,指定變數 x值範圍,在此範圍內要繪製函式

  • 定義函式 y = f(x)

  • 呼叫 plot 命令,如 plot(x, y)

以下示例將演示該概念。讓我們繪製從 0 到 100 的 x 值範圍內的簡單函式 y = x,增量為 5。

建立一個指令碼檔案,並鍵入以下程式碼−

x = [0:5:100];
y = x;
plot(x, y)

執行檔案時,MATLAB 將顯示以下圖形:

Plotting y = x

讓我們再舉一個繪製函式 y = x2 的例子。在此示例中,我們將繪製兩個具有相同函式的圖形,但在第二次繪製時,我們將減少增量值。請注意,隨著我們減少增量,圖形變得更平滑。

建立一個指令碼檔案,並鍵入以下程式碼−

x = [1 2 3 4 5 6 7 8 9 10];
x = [-100:20:100];
y = x.^2;
plot(x, y)

執行檔案時,MATLAB 將顯示以下圖形:

Plotting y = x^2

稍微修改程式碼檔案,將增量減少到 5:

x = [-100:5:100];
y = x.^2;
plot(x, y)

MATLAB 繪製了一個更平滑的圖形:

Plotting y = x^2 with less increment

在圖形上新增標題、標籤、網格線和縮放

MATLAB 允許您新增標題、沿 x 軸和 y 軸的標籤、網格線以及調整軸以美化圖形。

  • xlabelylabel 命令在 x 軸和 y 軸上生成標籤。

  • title 命令允許您在圖形上放置標題。

  • grid on 命令允許您在圖形上放置網格線。

  • axis equal 命令允許使用相同的比例因子和兩個軸上的空間生成圖形。

  • axis square 命令生成一個正方形圖形。

示例

建立一個指令碼檔案,並鍵入以下程式碼−

x = [0:0.01:10];
y = sin(x);
plot(x, y), xlabel('x'), ylabel('Sin(x)'), title('Sin(x) Graph'),
grid on, axis equal

MATLAB 生成以下圖形:

Sprucing up our graphs

在同一圖形上繪製多個函式

您可以在同一圖形上繪製多個圖形。以下示例演示了該概念:

示例

建立一個指令碼檔案,並鍵入以下程式碼−

x = [0 : 0.01: 10];
y = sin(x);
g = cos(x);
plot(x, y, x, g, '.-'), legend('Sin(x)', 'Cos(x)')

MATLAB 生成以下圖形:

Multiple Functions on the Same Graph

在圖形上設定顏色

MATLAB 提供了八種基本顏色選項用於繪製圖形。下表顯示了顏色及其程式碼:

程式碼 顏色
w 白色
k 黑色
b 藍色
r 紅色
c 青色
g 綠色
m 品紅色
y 黃色

示例

讓我們繪製兩個多項式的圖形

  • f(x) = 3x4 + 2x3+ 7x2 + 2x + 9 和

  • g(x) = 5x3 + 9x + 2

建立一個指令碼檔案,並鍵入以下程式碼−

x = [-10 : 0.01: 10];
y = 3*x.^4 + 2 * x.^3 + 7 * x.^2 + 2 * x + 9;
g = 5 * x.^3 + 9 * x + 2;
plot(x, y, 'r', x, g, 'g')

執行檔案時,MATLAB 將生成以下圖形:

Colors on Graph

設定軸刻度

axis 命令允許您設定軸刻度。您可以使用以下方式的 axis 命令為 x 軸和 y 軸提供最小值和最大值:

axis ( [xmin xmax ymin ymax] )

以下示例說明了這一點:

示例

建立一個指令碼檔案,並鍵入以下程式碼−

x = [0 : 0.01: 10];
y = exp(-x).* sin(2*x + 3);
plot(x, y), axis([0 10 -1 1])

執行檔案時,MATLAB 將生成以下圖形:

Setting Axis Scales

生成子圖

當您在同一圖形中建立一系列圖形時,這些圖形中的每一個都稱為子圖。subplot 命令用於建立子圖。

該命令的語法為:

subplot(m, n, p)

其中,mn 是圖形陣列的行數和列數,p 指定放置特定圖形的位置。

使用 subplot 命令建立的每個圖形都可以具有自己的特性。以下示例演示了該概念:

示例

讓我們生成兩個圖形:

y = e−1.5xsin(10x)

y = e−2xsin(10x)

建立一個指令碼檔案,並鍵入以下程式碼−

x = [0:0.01:5];
y = exp(-1.5*x).*sin(10*x);
subplot(1,2,1)
plot(x,y), xlabel('x'),ylabel('exp(–1.5x)*sin(10x)'),axis([0 5 -1 1])
y = exp(-2*x).*sin(10*x);
subplot(1,2,2)
plot(x,y),xlabel('x'),ylabel('exp(–2x)*sin(10x)'),axis([0 5 -1 1])

執行檔案時,MATLAB 將生成以下圖形:

Generating Sub-Plots

MATLAB - 圖形

本章將繼續探索 MATLAB 的繪圖和圖形功能。我們將討論:

  • 繪製條形圖
  • 繪製等值線
  • 三維圖形

繪製條形圖

bar 命令繪製二維條形圖。讓我們舉一個例子來演示這個想法。

示例

讓我們假設一個有 10 名學生的虛擬教室。我們知道這些學生獲得的分數百分比分別為 75、58、90、87、50、85、92、75、60 和 95。我們將為這些資料繪製條形圖。

建立一個指令碼檔案,並鍵入以下程式碼−

x = [1:10];
y = [75, 58, 90, 87, 50, 85, 92, 75, 60, 95];
bar(x,y), xlabel('Student'),ylabel('Score'),
title('First Sem:')
print -deps graph.eps

執行檔案時,MATLAB 將顯示以下條形圖:

Drawing Bar Charts

繪製等值線

雙變數函式的等值線是函式具有恆定值的曲線。等值線用於透過連線高於給定水平(例如平均海平面)的相同高度的點來建立等高線圖。

MATLAB 提供了一個 contour 函式用於繪製等高線圖。

示例

讓我們生成一個等高線圖,顯示給定函式 g = f(x, y) 的等值線。此函式有兩個變數。因此,我們將不得不生成兩個自變數,即兩個資料集 x 和 y。這是透過呼叫 meshgrid 命令完成的。

meshgrid 命令用於生成元素矩陣,這些元素給出 x 和 y 上的範圍以及每種情況下增量的規範。

讓我們繪製我們的函式 g = f(x, y),其中 −5 ≤ x ≤ 5,−3 ≤ y ≤ 3。讓我們為這兩個值取 0.1 的增量。變數設定為:

[x,y] = meshgrid(–5:0.1:5, –3:0.1:3);

最後,我們需要分配函式。讓我們的函式為:x2 + y2

建立一個指令碼檔案,並鍵入以下程式碼−

[x,y] = meshgrid(-5:0.1:5,-3:0.1:3);   %independent variables
g = x.^2 + y.^2;                       % our function
contour(x,y,g)                         % call the contour function
print -deps graph.eps

執行檔案時,MATLAB 將顯示以下等高線圖:

Contour Map in Matlab

讓我們稍微修改一下程式碼以美化地圖

[x,y] = meshgrid(-5:0.1:5,-3:0.1:3);   %independent variables
g = x.^2 + y.^2;                       % our function
[C, h] = contour(x,y,g);               % call the contour function
set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2)
print -deps graph.eps

執行檔案時,MATLAB 將顯示以下等高線圖:

A good looking Contour Map

三維圖形

三維圖形基本上顯示由雙變數函式 g = f (x,y) 定義的曲面。

和之前一樣,為了定義g,我們首先使用**meshgrid**命令在函式的定義域上建立一組(x,y)點。接下來,我們賦值給函式本身。最後,我們使用**surf**命令建立一個曲面圖。

以下示例演示了該概念:

示例

讓我們為函式g = xe-(x2 + y2)建立一個3D曲面圖。

建立一個指令碼檔案,並鍵入以下程式碼−

[x,y] = meshgrid(-2:.2:2);
g = x .* exp(-x.^2 - y.^2);
surf(x, y, g)
print -deps graph.eps

當你執行檔案時,MATLAB將顯示以下3D圖 -

3-D Map in Matlab

你也可以使用**mesh**命令生成三維曲面。但是,**surf**命令以彩色顯示連線線和曲面的面,而**mesh**命令建立一個線框曲面,用彩色線連線定義點。

MATLAB - 代數

到目前為止,我們已經看到所有示例都可以在MATLAB及其GNU版本(也稱為Octave)中執行。但是對於求解基本代數方程,MATLAB和Octave略有不同,因此我們將嘗試在單獨的部分中介紹MATLAB和Octave。

我們還將討論代數表示式的因式分解和化簡。

在MATLAB中求解基本代數方程

**solve**函式用於求解代數方程。在其最簡單的形式中,solve函式將用引號括起來的方程作為引數。

例如,讓我們求解方程x-5 = 0中的x。

solve('x-5=0')

MATLAB將執行上述語句並返回以下結果:

ans =
   5

你也可以這樣呼叫solve函式 -

y = solve('x-5 = 0')

MATLAB將執行上述語句並返回以下結果:

y =
   5

你甚至可以不包含方程的右側 -

solve('x-5')

MATLAB將執行上述語句並返回以下結果:

ans =
   5

如果方程包含多個符號,那麼MATLAB預設情況下假設你正在求解x,但是,solve函式還有另一種形式 -

solve(equation, variable)

其中,你也可以提及變數。

例如,讓我們求解方程v – u – 3t2 = 0關於v的解。在這種情況下,我們應該寫 -

solve('v-u-3*t^2=0', 'v')

MATLAB將執行上述語句並返回以下結果:

ans =
   3*t^2 + u

在Octave中求解基本代數方程

**roots**函式用於在Octave中求解代數方程,你可以將上述示例寫成如下形式 -

例如,讓我們求解方程x-5 = 0中的x。

roots([1, -5])

Octave將執行上述語句並返回以下結果 -

ans = 5

你也可以這樣呼叫solve函式 -

y = roots([1, -5])

Octave將執行上述語句並返回以下結果 -

y = 5

在MATLAB中求解二次方程

**solve**函式也可以求解高階方程。它通常用於求解二次方程。該函式將方程的根返回到一個數組中。

以下示例求解二次方程x2 -7x +12 = 0。建立一個指令碼檔案並輸入以下程式碼 -

eq = 'x^2 -7*x + 12 = 0';
s = solve(eq);
disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));

執行檔案時,它會顯示以下結果−

The first root is: 
   3
The second root is: 
   4

在Octave中求解二次方程

以下示例在Octave中求解二次方程x2 -7x +12 = 0。建立一個指令碼檔案並輸入以下程式碼 -

s = roots([1, -7, 12]);

disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));

執行檔案時,它會顯示以下結果−

The first root is: 
   4
The second root is: 
   3

在MATLAB中求解高階方程

**solve**函式也可以求解高階方程。例如,讓我們求解三次方程(x-3)2(x-7) = 0。

solve('(x-3)^2*(x-7)=0')

MATLAB將執行上述語句並返回以下結果:

ans =
   3
   3
   7

對於高階方程,根很長,包含很多項。你可以透過將它們轉換為double來獲取這些根的數值。以下示例求解四次方程x4 − 7x3 + 3x2 − 5x + 9 = 0。

建立一個指令碼檔案,並鍵入以下程式碼−

eq = 'x^4 - 7*x^3 + 3*x^2 - 5*x + 9 = 0';
s = solve(eq);
disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));
disp('The third root is: '), disp(s(3));
disp('The fourth root is: '), disp(s(4));

% converting the roots to double type
disp('Numeric value of first root'), disp(double(s(1)));
disp('Numeric value of second root'), disp(double(s(2)));
disp('Numeric value of third root'), disp(double(s(3)));
disp('Numeric value of fourth root'), disp(double(s(4)));

當你執行檔案時,它將返回以下結果 -

The first root is: 
6.630396332390718431485053218985
 The second root is: 
1.0597804633025896291682772499885
 The third root is: 
- 0.34508839784665403032666523448675 - 1.0778362954630176596831109269793*i
 The fourth root is: 
- 0.34508839784665403032666523448675 + 1.0778362954630176596831109269793*i
Numeric value of first root
   6.6304
Numeric value of second root
   1.0598
Numeric value of third root
   -0.3451 - 1.0778i
Numeric value of fourth root
   -0.3451 + 1.0778i

請注意,最後兩個根是複數。

在Octave中求解高階方程

以下示例求解四次方程x4 − 7x3 + 3x2 − 5x + 9 = 0。

建立一個指令碼檔案,並鍵入以下程式碼−

v = [1, -7,  3, -5, 9];
s = roots(v);

% converting the roots to double type
disp('Numeric value of first root'), disp(double(s(1)));
disp('Numeric value of second root'), disp(double(s(2)));
disp('Numeric value of third root'), disp(double(s(3)));
disp('Numeric value of fourth root'), disp(double(s(4)));

當你執行檔案時,它將返回以下結果 -

Numeric value of first root
 6.6304
Numeric value of second root
-0.34509 + 1.07784i
Numeric value of third root
-0.34509 - 1.07784i
Numeric value of fourth root
 1.0598

在MATLAB中求解方程組

**solve**函式還可以用來生成包含多個變數的方程組的解。讓我們舉一個簡單的例子來演示這種用法。

讓我們求解以下方程 -

5x + 9y = 5

3x – 6y = 4

建立一個指令碼檔案,並鍵入以下程式碼−

s = solve('5*x + 9*y = 5','3*x - 6*y = 4');
s.x
s.y

執行檔案時,它會顯示以下結果−

ans =
   22/19
ans =
   -5/57

同樣地,你可以求解更大的線性系統。考慮以下方程組 -

x + 3y -2z = 5

3x + 5y + 6z = 7

2x + 4y + 3z = 8

在Octave中求解方程組

我們有一個稍微不同的方法來求解'n'個未知數的'n'個線性方程組。讓我們舉一個簡單的例子來演示這種用法。

讓我們求解以下方程 -

5x + 9y = 5

3x – 6y = 4

這樣的線性方程組可以寫成單個矩陣方程Ax = b,其中A是係數矩陣,b是包含線性方程右側的列向量,x是表示解的列向量,如下面的程式所示 -

建立一個指令碼檔案,並鍵入以下程式碼−

A = [5, 9; 3, -6];
b = [5;4];
A \ b

執行檔案時,它會顯示以下結果−

ans =

   1.157895
  -0.087719

同樣地,你可以求解如下所示的更大的線性系統 -

x + 3y -2z = 5

3x + 5y + 6z = 7

2x + 4y + 3z = 8

在MATLAB中展開和收集方程

**expand**和**collect**函式分別展開和收集方程。以下示例演示了這些概念 -

當你使用許多符號函式時,你應該宣告你的變數是符號變數。

建立一個指令碼檔案,並鍵入以下程式碼−

syms x   %symbolic variable x
syms y   %symbolic variable x
% expanding equations
expand((x-5)*(x+9))
expand((x+2)*(x-3)*(x-5)*(x+7))
expand(sin(2*x))
expand(cos(x+y))
 
% collecting equations
collect(x^3 *(x-7))
collect(x^4*(x-3)*(x-5))

執行檔案時,它會顯示以下結果−

ans =
   x^2 + 4*x - 45
ans =
   x^4 + x^3 - 43*x^2 + 23*x + 210
ans =
   2*cos(x)*sin(x)
ans =
   cos(x)*cos(y) - sin(x)*sin(y)
ans =
   x^4 - 7*x^3
ans =
   x^6 - 8*x^5 + 15*x^4

在Octave中展開和收集方程

你需要安裝**symbolic**包,它提供了**expand**和**collect**函式,分別用於展開和收集方程。以下示例演示了這些概念 -

當你使用許多符號函式時,你應該宣告你的變數是符號變數,但Octave定義符號變數的方法不同。注意**Sin**和**Cos**的使用,它們也在symbolic包中定義。

建立一個指令碼檔案,並鍵入以下程式碼−

% first of all load the package, make sure its installed.
pkg load symbolic

% make symbols module available
symbols

% define symbolic variables
x = sym ('x');
y = sym ('y');
z = sym ('z');

% expanding equations
expand((x-5)*(x+9))
expand((x+2)*(x-3)*(x-5)*(x+7))
expand(Sin(2*x))
expand(Cos(x+y))
 
% collecting equations
collect(x^3 *(x-7), z)
collect(x^4*(x-3)*(x-5), z)

執行檔案時,它會顯示以下結果−

ans =

-45.0+x^2+(4.0)*x
ans =

210.0+x^4-(43.0)*x^2+x^3+(23.0)*x
ans =

sin((2.0)*x)
ans =

cos(y+x)
ans =

x^(3.0)*(-7.0+x)
ans =

(-3.0+x)*x^(4.0)*(-5.0+x)

代數表示式的因式分解和化簡

**factor**函式對錶達式進行因式分解,**simplify**函式對錶達式進行化簡。以下示例演示了這個概念 -

示例

建立一個指令碼檔案,並鍵入以下程式碼−

syms x
syms y
factor(x^3 - y^3)
factor([x^2-y^2,x^3+y^3])
simplify((x^4-16)/(x^2-4))

執行檔案時,它會顯示以下結果−

ans =
   (x - y)*(x^2 + x*y + y^2)
ans =
   [ (x - y)*(x + y), (x + y)*(x^2 - x*y + y^2)]
ans =
   x^2 + 4

MATLAB - 微積分

MATLAB提供了多種方法來解決微積分問題,求解任意階的微分方程以及計算極限。最棒的是,你可以輕鬆地繪製複雜函式的圖形,並透過求解原始函式及其導數來檢查圖形上的最大值、最小值和其他駐點。

本章將討論微積分問題。在本章中,我們將討論預備微積分的概念,即計算函式的極限並驗證極限的性質。

在下一章“微分”中,我們將計算表示式的導數,並在圖形上找到區域性最大值和最小值。我們還將討論求解微分方程。

最後,在“積分”一章中,我們將討論積分學。

計算極限

MATLAB提供了**limit**函式用於計算極限。在其最基本的形式中,**limit**函式將表示式作為引數,並找到當自變數趨於零時表示式的極限。

例如,讓我們計算函式f(x) = (x3 + 5)/(x4 + 7)在x趨於零時的極限。

syms x
limit((x^3 + 5)/(x^4 + 7))

MATLAB將執行上述語句並返回以下結果:

ans =
   5/7

limit函式屬於符號計算的範疇;你需要使用**syms**函式來告訴MATLAB你正在使用哪些符號變數。你還可以計算函式的極限,當變數趨於某個非零數時。為了計算lim x->a(f(x)),我們使用帶有引數的limit命令。第一個是表示式,第二個是x接近的數字,這裡它是a。

例如,讓我們計算函式f(x) = (x-3)/(x-1)在x趨於1時的極限。

limit((x - 3)/(x-1),1)

MATLAB將執行上述語句並返回以下結果:

ans =
   NaN

讓我們再舉一個例子,

limit(x^2 + 5, 3)

MATLAB將執行上述語句並返回以下結果:

ans =
   14

使用Octave計算極限

以下是使用**symbolic**包的上述示例的Octave版本,嘗試執行並比較結果 -

pkg load symbolic
symbols

x = sym("x");
subs((x^3+5)/(x^4+7),x,0)

Octave將執行上述語句並返回以下結果 -

ans =
   0.7142857142857142857

驗證極限的基本性質

代數極限定理提供了一些極限的基本性質。它們如下 -

Basic Properties of Limits

讓我們考慮兩個函式 -

  • f(x) = (3x + 5)/(x - 3)
  • g(x) = x2 + 1。

讓我們計算這兩個函式在x趨於5時的極限,並使用這兩個函式和MATLAB驗證極限的基本性質。

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

syms x
f = (3*x + 5)/(x-3);
g = x^2 + 1;
l1 = limit(f, 4)
l2 = limit (g, 4)
lAdd = limit(f + g, 4)
lSub = limit(f - g, 4)
lMult = limit(f*g, 4)
lDiv = limit (f/g, 4)

執行檔案時,它會顯示−

l1 =
   17
  
l2 =
   17
  
lAdd =
   34
 
lSub =
   0
  
lMult =
   289
  
lDiv =
   1

使用Octave驗證極限的基本性質

以下是使用**symbolic**包的上述示例的Octave版本,嘗試執行並比較結果 -

pkg load symbolic
symbols

x = sym("x");
f = (3*x + 5)/(x-3);
g = x^2 + 1;

l1 = subs(f, x, 4)
l2 = subs (g, x, 4)
lAdd = subs (f+g, x, 4)
lSub = subs (f-g, x, 4)
lMult = subs (f*g, x, 4)
lDiv = subs (f/g, x, 4)

Octave將執行上述語句並返回以下結果 -

l1 =
   17.0
l2 =
   17.0
lAdd =
   34.0
lSub =
   0.0
lMult =
   289.0
lDiv =
   1.0

左側和右側極限

當函式在變數的某個特定值處存在間斷時,該點的極限不存在。換句話說,當x從左側逼近a時的極限值不等於x從右側逼近a時的極限值時,函式f(x)在x = a處存在間斷。

這導致了左側極限和右側極限的概念。左側極限定義為x從左側趨於a時的極限,即x逼近a,且x < a。右側極限定義為x從右側趨於a時的極限,即x逼近a,且x > a。當左側極限和右側極限不相等時,極限不存在。

讓我們考慮一個函式 -

f(x) = (x - 3)/|x - 3|

我們將證明limx->3 f(x)不存在。MATLAB透過兩種方式幫助我們證實這一點 -

  • 透過繪製函式的圖形並顯示間斷點。
  • 透過計算極限並顯示兩者不同。

左側和右側極限是透過將字元字串'left'和'right'作為最後一個引數傳遞給limit命令來計算的。

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

f = (x - 3)/abs(x-3);
ezplot(f,[-1,5])
l = limit(f,x,3,'left')
r = limit(f,x,3,'right')

當你執行檔案時,MATLAB將繪製以下圖形

Discontinuity in a Function

之後將顯示以下輸出 -

l =
   -1
  
r =
   1

MATLAB - 微分

MATLAB提供了**diff**命令用於計算符號導數。在其最簡單的形式中,你將要微分的函式作為引數傳遞給diff命令。

例如,讓我們計算函式f(t) = 3t2 + 2t-2的導數。

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

syms t
f = 3*t^2 + 2*t^(-2);
diff(f)

編譯並執行上述程式碼後,會產生以下結果:

ans =
6*t - 4/t^3

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

t = sym("t");
f = 3*t^2 + 2*t^(-2);
differentiate(f,t)

Octave執行程式碼並返回以下結果 -

ans =
   -(4.0)*t^(-3.0)+(6.0)*t

驗證微分的基本規則

讓我們簡要說明函式微分的各種方程或規則,並驗證這些規則。為此,我們將使用f'(x)表示一階導數,f"(x)表示二階導數。

以下是微分的規則 -

規則1

對於任何函式f和g以及任何實數a和b,函式 -

**h(x) = af(x) + bg(x)**關於x的導數由 -

h'(x) = af'(x) + bg'(x)

規則2

**加法**和**減法**規則指出,如果f和g是兩個函式,f'和g'分別是它們的導數,則,

(f + g)' = f' + g'

(f - g)' = f' - g'

規則3

**乘積**規則指出,如果f和g是兩個函式,f'和g'分別是它們的導數,則,

(f.g)' = f'.g + g'.f

規則4

**商**規則指出,如果f和g是兩個函式,f'和g'分別是它們的導數,則,

(f/g)' = (f'.g - g'.f)/g2

規則5

**多項式**或基本冪規則指出,如果y = f(x) = xn,則f' = n. x(n-1)

該規則的一個直接結果是任何常數的導數為零,即如果y = k,任何常數,則

f' = 0

規則6

鏈式法則指出,函式的函式h(x) = f(g(x))關於x的導數為:

h'(x)= f'(g(x)).g'(x)

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

syms x
syms t

f = (x + 2)*(x^2 + 3)
der1 = diff(f)
f = (t^2 + 3)*(sqrt(t) + t^3)
der2 = diff(f)
f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2)
der3 = diff(f)
f = (2*x^2 + 3*x)/(x^3 + 1)
der4 = diff(f)
f = (x^2 + 1)^17
der5 = diff(f)
f = (t^3 + 3* t^2 + 5*t -9)^(-6)
der6 = diff(f)

執行檔案後,MATLAB 顯示以下結果:

f =
   (x^2 + 3)*(x + 2)
 
   der1 =
   2*x*(x + 2) + x^2 + 3
  
f =
   (t^(1/2) + t^3)*(t^2 + 3)
 
   der2 =
   (t^2 + 3)*(3*t^2 + 1/(2*t^(1/2))) + 2*t*(t^(1/2) + t^3)
  
f =
   (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2)
  
der3 =
   (2*x - 2)*(3*x^3 - 5*x^2 + 2) - (- 9*x^2 + 10*x)*(x^2 - 2*x + 1)
 
f =
   (2*x^2 + 3*x)/(x^3 + 1)
  
der4 =
   (4*x + 3)/(x^3 + 1) - (3*x^2*(2*x^2 + 3*x))/(x^3 + 1)^2
  
f =
   (x^2 + 1)^17
  
der5 =
   34*x*(x^2 + 1)^16
  
f =
   1/(t^3 + 3*t^2 + 5*t - 9)^6
  
der6 =
   -(6*(3*t^2 + 6*t + 5))/(t^3 + 3*t^2 + 5*t - 9)^7

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

x = sym("x");
t = sym("t");
f = (x + 2)*(x^2 + 3) 
der1 = differentiate(f,x) 
f = (t^2 + 3)*(t^(1/2) + t^3) 
der2 = differentiate(f,t) 
f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2) 
der3 = differentiate(f,x) 
f = (2*x^2 + 3*x)/(x^3 + 1) 
der4 = differentiate(f,x) 
f = (x^2 + 1)^17 
der5 = differentiate(f,x) 
f = (t^3 + 3* t^2 + 5*t -9)^(-6) 
der6 = differentiate(f,t)

Octave執行程式碼並返回以下結果 -

f =

(2.0+x)*(3.0+x^(2.0))
der1 =

3.0+x^(2.0)+(2.0)*(2.0+x)*x
f =

(t^(3.0)+sqrt(t))*(3.0+t^(2.0))
der2 =

(2.0)*(t^(3.0)+sqrt(t))*t+((3.0)*t^(2.0)+(0.5)*t^(-0.5))*(3.0+t^(2.0))
f =

(1.0+x^(2.0)-(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0))
der3 =

(-2.0+(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0))+((9.0)*x^(2.0)-(10.0)*x)*(1.0+x^(2.0)-(2.0)*x)
f =

(1.0+x^(3.0))^(-1)*((2.0)*x^(2.0)+(3.0)*x)
der4 =

(1.0+x^(3.0))^(-1)*(3.0+(4.0)*x)-(3.0)*(1.0+x^(3.0))^(-2)*x^(2.0)*((2.0)*x^(2.0)+(3.0)*x)
f =

(1.0+x^(2.0))^(17.0)
der5 =

(34.0)*(1.0+x^(2.0))^(16.0)*x
f =

(-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-6.0)
der6 =

-(6.0)*(-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-7.0)*(5.0+(3.0)*t^(2.0)+(6.0)*t)

指數函式、對數函式和三角函式的導數

下表提供了常用指數函式、對數函式和三角函式的導數:

函式 導數
ca.x ca.x.ln c.a(ln 為自然對數)
ex ex
ln x 1/x
lncx 1/x.ln c
xx xx.(1 + ln x)
sin(x) cos(x)
cos(x) -sin(x)
tan(x) sec2(x),或 1/cos2(x),或 1 + tan2(x)
cot(x) -csc2(x),或 -1/sin2(x),或 -(1 + cot2(x))
sec(x) sec(x).tan(x)
csc(x) -csc(x).cot(x)

示例

建立一個指令碼檔案,並將以下程式碼輸入其中−

syms x
y = exp(x)
diff(y)
y = x^9
diff(y)
y = sin(x)
diff(y)
y = tan(x)
diff(y)
y = cos(x)
diff(y)
y = log(x)
diff(y)
y = log10(x)
diff(y)
y = sin(x)^2
diff(y)
y = cos(3*x^2 + 2*x + 1)
diff(y)
y = exp(x)/sin(x)
diff(y)

執行檔案後,MATLAB 顯示以下結果:

y =
   exp(x)
   ans =
   exp(x)

y =
   x^9
   ans =
   9*x^8
  
y =
   sin(x)
   ans =
   cos(x)
  
y =
   tan(x)
   ans =
   tan(x)^2 + 1
 
y =
   cos(x)
   ans =
   -sin(x)
  
y =
   log(x)
   ans =
   1/x
  
y =
   log(x)/log(10)
   ans =
   1/(x*log(10))
 
y =
   sin(x)^2
   ans =
   2*cos(x)*sin(x)
 
y =
   cos(3*x^2 + 2*x + 1)
   ans =
   -sin(3*x^2 + 2*x + 1)*(6*x + 2)
  
y =
   exp(x)/sin(x)
   ans =
   exp(x)/sin(x) - (exp(x)*cos(x))/sin(x)^2

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

x = sym("x");
y = Exp(x)
differentiate(y,x)

y = x^9
differentiate(y,x)

y = Sin(x)
differentiate(y,x)

y = Tan(x)
differentiate(y,x)

y = Cos(x)
differentiate(y,x)

y = Log(x)
differentiate(y,x)

% symbolic packages does not have this support
%y = Log10(x)
%differentiate(y,x)

y = Sin(x)^2
differentiate(y,x)

y = Cos(3*x^2 + 2*x + 1)
differentiate(y,x)

y = Exp(x)/Sin(x)
differentiate(y,x)

Octave執行程式碼並返回以下結果 -

y =

exp(x)
ans =

exp(x)
y =

x^(9.0)
ans =

(9.0)*x^(8.0)
y =

sin(x)
ans =

cos(x)
y =

tan(x)
ans =

1+tan(x)^2
y =

cos(x)
ans =

-sin(x)
y =

log(x)
ans =

x^(-1)
y =

sin(x)^(2.0)
ans =

(2.0)*sin(x)*cos(x)
y =

cos(1.0+(2.0)*x+(3.0)*x^(2.0))
ans =

-(2.0+(6.0)*x)*sin(1.0+(2.0)*x+(3.0)*x^(2.0))
y =

sin(x)^(-1)*exp(x)
ans =

sin(x)^(-1)*exp(x)-sin(x)^(-2)*cos(x)*exp(x)

計算高階導數

要計算函式 f 的高階導數,我們使用語法diff(f,n)

讓我們計算函式 y = f(x) = x .e-3x 的二階導數。

f = x*exp(-3*x);
diff(f, 2)

MATLAB 執行程式碼並返回以下結果:

ans =
9*x*exp(-3*x) - 6*exp(-3*x)

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

x = sym("x");
f = x*Exp(-3*x);
differentiate(f, x, 2)

Octave執行程式碼並返回以下結果 -

ans =

(9.0)*exp(-(3.0)*x)*x-(6.0)*exp(-(3.0)*x)

示例

在這個例子中,讓我們解決一個問題。給定一個函式y = f(x) = 3 sin(x) + 7 cos(5x)。我們需要找出方程f" + f = -5cos(2x)是否成立。

建立一個指令碼檔案,並將以下程式碼輸入其中−

syms x
y = 3*sin(x)+7*cos(5*x);  % defining the function
lhs = diff(y,2)+y;        %evaluting the lhs of the equation
rhs = -5*cos(2*x);        %rhs of the equation
if(isequal(lhs,rhs))
   disp('Yes, the equation holds true');
else
   disp('No, the equation does not hold true');
end
disp('Value of LHS is: '), disp(lhs);

執行檔案時,它會顯示以下結果−

No, the equation does not hold true
Value of LHS is: 
-168*cos(5*x)

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

x = sym("x");
y = 3*Sin(x)+7*Cos(5*x);           % defining the function
lhs = differentiate(y, x, 2) + y;  %evaluting the lhs of the equation
rhs = -5*Cos(2*x);                 %rhs of the equation

if(lhs == rhs)
   disp('Yes, the equation holds true');
else
   disp('No, the equation does not hold true');
end
disp('Value of LHS is: '), disp(lhs);

Octave執行程式碼並返回以下結果 -

No, the equation does not hold true
Value of LHS is: 
-(168.0)*cos((5.0)*x)

尋找曲線的極大值和極小值

如果我們正在尋找圖形的區域性極大值和極小值,我們基本上是在尋找函式圖形在特定區域性或特定符號變數值範圍內最高或最低的點。

對於函式 y = f(x),圖形上斜率為零的點稱為駐點。換句話說,駐點是 f'(x) = 0 的點。

為了找到函式的駐點,我們需要求導,並將導數設為零並求解方程。

示例

讓我們找到函式 f(x) = 2x3 + 3x2 − 12x + 17 的駐點。

採取以下步驟:

首先,讓我們輸入函式並繪製其圖形。

syms x
y = 2*x^3 + 3*x^2 - 12*x + 17;   % defining the function
ezplot(y)

MATLAB 執行程式碼並返回以下圖形:

Finding Maxima and Minima

以下是上述示例的 Octave 等效程式碼:

pkg load symbolic
symbols

x = sym('x');
y = inline("2*x^3 + 3*x^2 - 12*x + 17");

ezplot(y)
print -deps graph.eps

我們的目標是在圖形上找到一些區域性極大值和極小值,因此讓我們在圖形的區間 [-2, 2] 上找到區域性極大值和極小值。

syms x
y = 2*x^3 + 3*x^2 - 12*x + 17;   % defining the function
ezplot(y, [-2, 2])

MATLAB 執行程式碼並返回以下圖形:

Finding Maxima and Minima

以下是上述示例的 Octave 等效程式碼:

pkg load symbolic
symbols

x = sym('x');
y = inline("2*x^3 + 3*x^2 - 12*x + 17");

ezplot(y, [-2, 2])
print -deps graph.eps

接下來,讓我們計算導數。

g = diff(y)

MATLAB 執行程式碼並返回以下結果:

g =
   6*x^2 + 6*x - 12

以下是上述計算的 Octave 等效程式碼:

pkg load symbolic
symbols

x = sym("x");
y = 2*x^3 + 3*x^2 - 12*x + 17;
g = differentiate(y,x)

Octave執行程式碼並返回以下結果 -

g =
   -12.0+(6.0)*x+(6.0)*x^(2.0)

讓我們求解導數函式 g,以獲得其變為零的值。

s = solve(g)

MATLAB 執行程式碼並返回以下結果:

s =
   1
   -2

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

x = sym("x");
y = 2*x^3 + 3*x^2 - 12*x + 17;
g = differentiate(y,x)
roots([6, 6, -12])

Octave執行程式碼並返回以下結果 -

g =

-12.0+(6.0)*x^(2.0)+(6.0)*x
ans =

  -2
   1

這與我們的圖形一致。因此,讓我們在臨界點 x = 1, -2 處計算函式 f 的值。 我們可以使用subs命令在符號函式中替換一個值。

subs(y, 1), subs(y, -2)

MATLAB 執行程式碼並返回以下結果:

ans =
   10
ans =
   37

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

x = sym("x");
y = 2*x^3 + 3*x^2 - 12*x + 17;
g = differentiate(y,x)

roots([6, 6, -12])
subs(y, x, 1), subs(y, x, -2)

ans =
   10.0
ans =
   37.0-4.6734207789940138748E-18*I

因此,函式 f(x) = 2x3 + 3x2 − 12x + 17 在區間 [-2,2] 上的最小值和最大值分別為 10 和 37。

求解微分方程

MATLAB 提供了dsolve命令來符號求解微分方程。

dsolve命令用於求解單個方程的最基本形式是

dsolve('eqn') 

其中eqn是用於輸入方程的文字字串。

它返回一個符號解,其中包含一組 MATLAB 標記為 C1、C2 等的任意常數。

您還可以為問題指定初始條件和邊界條件,作為方程後面的逗號分隔列表,如下所示:

dsolve('eqn','cond1', 'cond2',…)  

為了使用 dsolve 命令,導數用 D 表示。例如,方程 f'(t) = -2*f + cost(t) 輸入為:

'Df = -2*f + cos(t)'

高階導數用 D 後跟導數的階數表示。

例如,方程 f"(x) + 2f'(x) = 5sin3x 應輸入為:

'D2y + 2Dy = 5*sin(3*x)'

讓我們舉一個一階微分方程的簡單例子:y' = 5y。

s = dsolve('Dy = 5*y')

MATLAB 執行程式碼並返回以下結果:

s =
   C2*exp(5*t)

讓我們再舉一個二階微分方程的例子:y" - y = 0,y(0) = -1,y'(0) = 2。

dsolve('D2y - y = 0','y(0) = -1','Dy(0) = 2')

MATLAB 執行程式碼並返回以下結果:

ans =
   exp(t)/2 - (3*exp(-t))/2

MATLAB - 積分

積分處理兩種本質上不同的問題型別。

  • 在第一種型別中,給定函式的導數,我們想要找到該函式。因此,我們基本上是反轉微分過程。這個反向過程稱為反微分、求原函式或求不定積分

  • 第二類問題涉及將非常多的非常小的量加起來,然後取這些量的大小接近零時的極限,而項數趨於無窮大。這個過程導致了定積分的定義。

定積分用於求面積、體積、重心、慣性矩、力做的功以及許多其他應用。

使用 MATLAB 求不定積分

根據定義,如果函式 f(x) 的導數是 f'(x),那麼我們說 f'(x) 關於 x 的不定積分是 f(x)。例如,由於 x2 關於 x 的導數是 2x,所以我們可以說 2x 的不定積分是 x2

用符號表示:

f'(x2) = 2x,因此,

∫ 2xdx = x2

不定積分不是唯一的,因為對於任意常數 c 的值,x2 + c 的導數也將是 2x。

用符號表示為:

∫ 2xdx = x2 + c.

其中,c 稱為“任意常數”。

MATLAB 提供了一個int命令來計算表示式的積分。要推匯出函式不定積分的表示式,我們寫:

int(f);

例如,從我們之前的例子:

syms x 
int(2*x)

MATLAB 執行上述語句並返回以下結果:

ans =
   x^2

示例 1

在這個例子中,讓我們找到一些常用表示式的積分。建立一個指令碼檔案,並在其中鍵入以下程式碼:

syms x n

int(sym(x^n))
f = 'sin(n*t)'
int(sym(f))
syms a t
int(a*cos(pi*t))
int(a^x)

執行檔案時,它會顯示以下結果−

ans =
   piecewise([n == -1, log(x)], [n ~= -1, x^(n + 1)/(n + 1)])
f =
sin(n*t)
ans =
   -cos(n*t)/n
   ans =
   (a*sin(pi*t))/pi
   ans =
   a^x/log(a)

示例 2

建立一個指令碼檔案,並在其中鍵入以下程式碼−

syms x n
int(cos(x))
int(exp(x))
int(log(x))
int(x^-1)
int(x^5*cos(5*x))
pretty(int(x^5*cos(5*x)))
int(x^-5)
int(sec(x)^2)
pretty(int(1 - 10*x + 9 * x^2))
int((3 + 5*x -6*x^2 - 7*x^3)/2*x^2)
pretty(int((3 + 5*x -6*x^2 - 7*x^3)/2*x^2))

請注意,pretty函式以更易讀的格式返回表示式。

執行檔案時,它會顯示以下結果−

ans =
   sin(x)
 
ans =
   exp(x)
 
ans =
   x*(log(x) - 1)
 
ans =
   log(x)
 
ans =
(24*cos(5*x))/3125 + (24*x*sin(5*x))/625 - (12*x^2*cos(5*x))/125 + (x^4*cos(5*x))/5 - (4*x^3*sin(5*x))/25 + (x^5*sin(5*x))/5
                                    2             4 
   24 cos(5 x)   24 x sin(5 x)   12 x  cos(5 x)   x  cos(5 x) 
   ----------- + ------------- - -------------- + ------------ 
      3125            625             125              5 
   
        3             5 
 
   4 x  sin(5 x)   x  sin(5 x) 
   ------------- + ----------- 
         25              5
 
ans =
-1/(4*x^4)
 
ans =
tan(x)
        2 
  x (3 x  - 5 x + 1)
 
ans = 
- (7*x^6)/12 - (3*x^5)/5 + (5*x^4)/8 + x^3/2
 
      6      5      4    3 
    7 x    3 x    5 x    x 
  - ---- - ---- + ---- + -- 
     12     5      8     2

使用 MATLAB 求定積分

根據定義,定積分基本上是和的極限。我們使用定積分來求面積,例如曲線與 x 軸之間的面積以及兩條曲線之間的面積。定積分也可以用於其他情況,其中所需的數量可以表示為和的極限。

int函式可以透過傳遞要計算積分的極限來用於定積分。

計算

Definite Integral

我們寫:

int(x, a, b)

例如,要計算Example的值,我們寫:

int(x, 4, 9)

MATLAB 執行上述語句並返回以下結果:

ans =
   65/2

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

x = sym("x");
f = x;
c = [1, 0];
integral = polyint(c);

a = polyval(integral, 9) - polyval(integral, 4);
display('Area: '), disp(double(a));

Octave執行程式碼並返回以下結果 -

Area: 

   32.500

可以使用 Octave 提供的 quad() 函式給出另一種解決方案,如下所示:

pkg load symbolic
symbols

f = inline("x");
[a, ierror, nfneval] = quad(f, 4, 9);

display('Area: '), disp(double(a));

Octave執行程式碼並返回以下結果 -

Area: 
   32.500

示例 1

讓我們計算 x 軸、曲線 y = x3−2x+5 和縱座標 x = 1 和 x = 2 所包圍的面積。

所需面積由下式給出:

Area Calculation

建立一個指令碼檔案,並鍵入以下程式碼−

f = x^3 - 2*x +5;
a = int(f, 1, 2)
display('Area: '), disp(double(a));

執行檔案時,它會顯示以下結果−

a =
23/4
Area: 
   5.7500

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

x = sym("x");
f = x^3 - 2*x +5;
c = [1, 0, -2, 5];
integral = polyint(c);

a = polyval(integral, 2) - polyval(integral, 1);
display('Area: '), disp(double(a));

Octave執行程式碼並返回以下結果 -

Area: 

   5.7500

可以使用 Octave 提供的 quad() 函式給出另一種解決方案,如下所示:

pkg load symbolic
symbols

x = sym("x");
f = inline("x^3 - 2*x +5");

[a, ierror, nfneval] = quad(f, 1, 2);
display('Area: '), disp(double(a));

Octave執行程式碼並返回以下結果 -

Area: 
   5.7500

示例 2

求曲線 f(x) = x2 cos(x) 在 −4 ≤ x ≤ 9 範圍內的面積。

建立一個指令碼檔案,並編寫以下程式碼:

f = x^2*cos(x);
ezplot(f, [-4,9])
a = int(f, -4, 9)
disp('Area: '), disp(double(a));

執行檔案後,MATLAB 會繪製圖形:

Definite Integral

輸出如下:

a = 
8*cos(4) + 18*cos(9) + 14*sin(4) + 79*sin(9)
 
Area: 
   0.3326

以下是上述計算的Octave等價物 -

pkg load symbolic
symbols

x = sym("x");
f = inline("x^2*cos(x)");

ezplot(f, [-4,9])
print -deps graph.eps

[a, ierror, nfneval] = quad(f, -4, 9);
display('Area: '), disp(double(a));

MATLAB - 多項式

MATLAB 將多項式表示為包含按降冪排序的係數的行向量。例如,方程 P(x) = x4 + 7x3 - 5x + 9 可以表示為:

p = [1 7 0 -5 9];

評估多項式

polyval函式用於在指定值處評估多項式。例如,要評估我們之前在 x = 4 處的多項式p,鍵入:

p = [1 7 0  -5 9];
polyval(p,4)

MATLAB 執行上述語句並返回以下結果:

ans = 693

MATLAB 還提供了polyvalm函式來評估矩陣多項式。矩陣多項式是多項式,其變數為矩陣。

例如,讓我們建立一個方陣 X 並評估多項式 p 在 X 處的值:

p = [1 7 0  -5 9];
X = [1 2 -3 4; 2 -5 6 3; 3 1 0 2; 5 -7 3 8];
polyvalm(p, X)

MATLAB 執行上述語句並返回以下結果:

ans =
      2307       -1769        -939        4499
      2314       -2376        -249        4695
      2256       -1892        -549        4310
      4570       -4532       -1062        9269

查詢多項式的根

roots函式計算多項式的根。例如,要計算我們多項式 p 的根,鍵入:

p = [1 7 0  -5 9];
r = roots(p)

MATLAB 執行上述語句並返回以下結果:

r =
   -6.8661 + 0.0000i
   -1.4247 + 0.0000i
   0.6454 + 0.7095i
   0.6454 - 0.7095i

poly函式是 roots 函式的反函式,並返回到多項式係數。例如:

p2 = poly(r)

MATLAB 執行上述語句並返回以下結果:

p2 =

   Columns 1 through 3:

      1.00000 + 0.00000i   7.00000 + 0.00000i   0.00000 + 0.00000i

   Columns 4 and 5:

      -5.00000 - 0.00000i   9.00000 + 0.00000i

多項式曲線擬合

polyfit函式找到以最小二乘意義擬合一組資料的多項式的係數。如果 x 和 y 是兩個包含要擬合到 n 次多項式的 x 和 y 資料的向量,那麼我們可以透過編寫以下程式碼獲得擬合數據的多項式:

p = polyfit(x,y,n)

示例

建立一個指令碼檔案,並鍵入以下程式碼−

x = [1 2 3 4 5 6]; y = [5.5 43.1 128 290.7 498.4 978.67];   %data
p = polyfit(x,y,4)   %get the polynomial

% Compute the values of the polyfit estimate over a finer range, 
% and plot the estimate over the real data values for comparison:
x2 = 1:.1:6;          
y2 = polyval(p,x2);
plot(x,y,'o',x2,y2)
grid on

執行檔案後,MATLAB 顯示以下結果:

p =
   4.1056  -47.9607  222.2598 -362.7453  191.1250

並繪製以下圖形:

Polynomial Curve Fitting

MATLAB - 變換

MATLAB 提供了用於處理變換的命令,例如拉普拉斯變換和傅立葉變換。變換在科學和工程中用作簡化分析和從另一個角度檢視資料的工具。

例如,傅立葉變換允許我們將表示為時間函式的訊號轉換為頻率函式。拉普拉斯變換允許我們將微分方程轉換為代數方程。

MATLAB 提供了laplacefourierfft命令來處理拉普拉斯變換、傅立葉變換和快速傅立葉變換。

拉普拉斯變換

時間函式 f(t) 的拉普拉斯變換由以下積分給出:

Laplace Transform

拉普拉斯變換也表示為 f(t) 到 F(s) 的變換。您可以看到此變換或積分過程將 f(t)(符號變數 t 的函式)轉換為另一個函式 F(s),其變數為 s。

拉普拉斯變換將微分方程轉換為代數方程。要計算函式 f(t) 的拉普拉斯變換,請編寫:

laplace(f(t))

示例

在這個例子中,我們將計算一些常用函式的拉普拉斯變換。

建立一個指令碼檔案,並鍵入以下程式碼−

syms s t a b w

laplace(a)
laplace(t^2)
laplace(t^9)
laplace(exp(-b*t))
laplace(sin(w*t))
laplace(cos(w*t))

執行檔案時,它會顯示以下結果−

ans =
   1/s^2

ans =
   2/s^3

ans =
   362880/s^10

ans =
   1/(b + s)
  
ans =
   w/(s^2 + w^2)
  
ans =
   s/(s^2 + w^2)

拉普拉斯逆變換

MATLAB 允許我們使用ilaplace命令計算拉普拉斯逆變換。

例如:

ilaplace(1/s^3)

MATLAB 將執行上述語句並顯示結果:

ans =
   t^2/2

示例

建立一個指令碼檔案,並鍵入以下程式碼−

syms s t a b w

ilaplace(1/s^7)
ilaplace(2/(w+s))
ilaplace(s/(s^2+4))
ilaplace(exp(-b*t))
ilaplace(w/(s^2 + w^2))
ilaplace(s/(s^2 + w^2))

執行檔案時,它會顯示以下結果−

ans =
   t^6/720

ans =
   2*exp(-t*w)

ans =
   cos(2*t)

ans =
   ilaplace(exp(-b*t), t, x)

ans =
   sin(t*w)

ans =
   cos(t*w)

傅立葉變換

傅立葉變換通常將時間數學函式 f(t) 轉換為一個新函式,有時表示為或 F,其引數為頻率,單位為週期/秒(赫茲)或弧度/秒。然後將新函式稱為傅立葉變換和/或函式 f 的頻譜。

示例

建立一個指令碼檔案,並在其中鍵入以下程式碼−

syms x 
f = exp(-2*x^2);     %our function
ezplot(f,[-2,2])     % plot of our function
FT = fourier(f)      % Fourier transform

執行檔案後,MATLAB 會繪製以下圖形:

Fourier Transforms

顯示以下結果:

FT =
   (2^(1/2)*pi^(1/2)*exp(-w^2/8))/2

繪製傅立葉變換為:

ezplot(FT)

給出以下圖形:

Plotting the fourier transform

傅立葉逆變換

MATLAB 提供了ifourier命令來計算函式的傅立葉逆變換。例如,

f = ifourier(-2*exp(-abs(w)))

MATLAB 將執行上述語句並顯示結果:

f =
   -2/(pi*(x^2 + 1))

MATLAB - GNU Octave 教程

GNU Octave 是一種類似於 MATLAB 的高階程式語言,並且與 MATLAB 大部分相容。它也用於數值計算。

Octave 與 MATLAB 具有以下共同特徵:

  • 矩陣是基本資料型別
  • 它內建支援複數
  • 它具有內建的數學函式和庫
  • 它支援使用者定義的函式

GNU Octave 也是免費可再分發的軟體。您可以根據自由軟體基金會發布的 GNU 通用公共許可證 (GPL) 的條款重新分發和/或修改它。

MATLAB 與 Octave 的比較

大多數 MATLAB 程式都可以在 Octave 中執行,但一些 Octave 程式可能無法在 MATLAB 中執行,因為 Octave 允許某些 MATLAB 不支援的語法。

例如,MATLAB 僅支援單引號,但 Octave 支援單引號和雙引號來定義字串。如果您正在尋找 Octave 的教程,那麼請從頭到尾閱讀本教程,它涵蓋了 MATLAB 和 Octave。

相容示例

本教程中涵蓋的幾乎所有示例都相容 MATLAB 和 Octave。讓我們在 MATLAB 和 Octave 中嘗試以下示例,該示例在沒有任何語法更改的情況下產生相同的結果。

此示例為函式 g = xe-(x2 + y2) 建立一個 3D 表面圖。建立一個指令碼檔案並鍵入以下程式碼:

[x,y] = meshgrid(-2:.2:2);
g = x .* exp(-x.^2 - y.^2);
surf(x, y, g)
print -deps graph.eps

當你執行檔案時,MATLAB將顯示以下3D圖 -

3-D Map in Matlab

不相容的示例

儘管 Octave 中提供了 MATLAB 的所有核心功能,但也有一些功能(例如,微積分和積分),在兩種語言中的匹配並不完全相同。本教程嘗試提供兩種型別的示例,其中它們的語法有所不同。

考慮以下示例,其中 MATLAB 和 Octave 使用不同的函式來獲取曲線的面積:f(x) = x2 cos(x),其中 -4 ≤ x ≤ 9。以下是 MATLAB 版本的程式碼:

f = x^2*cos(x);
ezplot(f, [-4,9])
a = int(f, -4, 9)
disp('Area: '), disp(double(a));

執行檔案後,MATLAB 會繪製圖形:

Definite Integral

顯示以下結果

a =
8*cos(4) + 18*cos(9) + 14*sin(4) + 79*sin(9)
 
Area: 
   0.3326

但是,要在 Octave 中獲得相同曲線的面積,您必須使用 **symbolic** 包,如下所示:

pkg load symbolic
symbols

x = sym("x");
f = inline("x^2*cos(x)");

ezplot(f, [-4,9])
print -deps graph.eps

[a, ierror, nfneval] = quad(f, -4, 9);
display('Area: '), disp(double(a));

MATLAB - Simulink

Simulink 是一個用於動態和嵌入式系統的模擬和基於模型的設計環境,與 MATLAB 整合在一起。Simulink 也是由 MathWorks 開發的,是一種用於建模、模擬和分析多領域動態系統的資料流圖形程式語言工具。它基本上是一個圖形化塊圖工具,具有可自定義的塊庫集。

它允許您將 MATLAB 演算法整合到模型中,並將模擬結果匯出到 MATLAB 以進行進一步分析。

Simulink 支援:

  • 系統級設計
  • 模擬
  • 自動程式碼生成
  • 嵌入式系統的測試和驗證

MathWorks 提供了許多其他附加產品,以及可與 Simulink 一起使用的第三方硬體和軟體產品。

以下列表簡要介紹了其中一些:

  • **Stateflow** 允許開發狀態機和流程圖。

  • **Simulink Coder** 允許自動生成 C 原始碼,以便即時實現系統。

  • **xPC Target** 以及 **基於 x86 的即時系統** 提供了一個環境,可以在物理系統上即時模擬和測試 Simulink 和 Stateflow 模型。

  • **Embedded Coder** 支援特定的嵌入式目標。

  • **HDL Coder** 允許自動生成可綜合的 VHDL 和 Verilog。

  • **SimEvents** 提供了一個圖形化構建塊庫,用於建模排隊系統。

Simulink 能夠透過建模風格檢查、需求跟蹤和模型覆蓋率分析來系統地驗證和確認模型。

Simulink Design Verifier 允許您識別設計錯誤併為模型檢查生成測試用例場景。

使用 Simulink

要開啟 Simulink,請在 MATLAB 工作空間中鍵入:

simulink

Simulink 將開啟 **庫瀏覽器**。庫瀏覽器用於構建模擬模型。

 Simulink Library Browser

在左側視窗窗格中,您會發現幾個根據各種系統分類的庫,單擊每個庫將在右側視窗窗格中顯示設計塊。

構建模型

要建立新模型,請單擊庫瀏覽器工具欄上的 **新建** 按鈕。這將開啟一個新的無標題模型視窗。

Simulink New Model Window

Simulink 模型是一個塊圖。

模型元素是透過從庫瀏覽器中選擇相應的元素並將其拖放到模型視窗中來新增的。

或者,您可以複製模型元素並將其貼上到模型視窗中。

示例

從 Simulink 庫中拖放專案以建立您的專案。

出於本示例的目的,將使用兩個塊進行模擬 - **源**(訊號)和 **匯點**(示波器)。訊號發生器(源)生成模擬訊號,然後示波器(匯點)將以圖形方式顯示該訊號。

Source and Sink

首先將所需的塊從庫拖到專案視窗。然後,將塊連線在一起,這可以透過將聯結器從一個塊上的連線點拖到另一個塊上的連線點來完成。

讓我們將一個“正弦波”塊拖到模型中。

Sine Wave Block

從庫中選擇“匯點”,並將“示波器”塊拖到模型中。

Scope Block

將訊號線從正弦波塊的輸出拖到示波器塊的輸入。

Blocks are not connected

Blocks are connected

透過按下“**執行**”按鈕執行模擬,保持所有引數為預設值(您可以從“模擬”選單中更改它們)

您應該從示波器中獲得以下圖形。

Simulation
廣告

© . All rights reserved.