- Matlab 教程
- MATLAB - 首頁
- MATLAB - 概述
- MATLAB - 特性
- MATLAB - 環境設定
- MATLAB - 編輯器
- MATLAB - 線上版
- MATLAB - 工作區
- MATLAB - 語法
- MATLAB - 變數
- MATLAB - 命令
- MATLAB - 資料型別
- MATLAB - 運算子
- MATLAB - 日期和時間
- MATLAB - 數字
- MATLAB - 隨機數
- MATLAB - 字串和字元
- MATLAB - 文字格式化
- MATLAB - 時間表
- MATLAB - M 檔案
- MATLAB - 冒號表示法
- MATLAB - 資料匯入
- MATLAB - 資料匯出
- MATLAB - 資料歸一化
- MATLAB - 預定義變數
- MATLAB - 決策
- MATLAB - 決策語句
- MATLAB - if-end 語句
- MATLAB - if-else 語句
- MATLAB - if-elseif-else 語句
- MATLAB - 巢狀 if 語句
- MATLAB - switch 語句
- MATLAB - 巢狀 switch
- MATLAB - 迴圈
- MATLAB - 迴圈
- MATLAB - for 迴圈
- MATLAB - while 迴圈
- MATLAB - 巢狀迴圈
- MATLAB - break 語句
- MATLAB - continue 語句
- MATLAB - end 語句
- MATLAB - 陣列
- MATLAB - 陣列
- MATLAB - 向量
- MATLAB - 轉置運算子
- MATLAB - 陣列索引
- MATLAB - 多維陣列
- MATLAB - 相容陣列
- MATLAB - 分類陣列
- MATLAB - 元胞陣列
- MATLAB - 矩陣
- MATLAB - 稀疏矩陣
- MATLAB - 表格
- MATLAB - 結構體
- MATLAB - 陣列乘法
- MATLAB - 陣列除法
- MATLAB - 陣列函式
- MATLAB - 函式
- MATLAB - 函式
- MATLAB - 函式引數
- MATLAB - 匿名函式
- MATLAB - 巢狀函式
- MATLAB - return 語句
- MATLAB - 無返回值函式
- MATLAB - 區域性函式
- MATLAB - 全域性變數
- MATLAB - 函式控制代碼
- MATLAB - filter 函式
- MATLAB - 階乘
- MATLAB - 私有函式
- MATLAB - 子函式
- MATLAB - 遞迴函式
- MATLAB - 函式優先順序順序
- MATLAB - map 函式
- MATLAB - mean 函式
- MATLAB - end 函式
- MATLAB - 錯誤處理
- MATLAB - 錯誤處理
- MATLAB - try...catch 語句
- MATLAB - 除錯
- MATLAB - 繪圖
- MATLAB - 繪圖
- MATLAB - 繪製陣列
- MATLAB - 繪製向量
- MATLAB - 條形圖
- MATLAB - 直方圖
- MATLAB - 圖形
- MATLAB - 二維線圖
- MATLAB - 三維圖
- MATLAB - 圖表格式化
- MATLAB - 對數座標軸圖
- MATLAB - 繪製誤差條
- MATLAB - 繪製三維等高線圖
- MATLAB - 極座標圖
- MATLAB - 散點圖
- MATLAB - 繪製表示式或函式
- MATLAB - 繪製矩形
- MATLAB - 繪製頻譜圖
- MATLAB - 繪製網格曲面
- MATLAB - 繪製正弦波
- MATLAB - 插值
- MATLAB - 插值
- MATLAB - 線性插值
- MATLAB - 二維陣列插值
- MATLAB - 三維陣列插值
- MATLAB - 多項式
- MATLAB - 多項式
- MATLAB - 多項式加法
- MATLAB - 多項式乘法
- MATLAB - 多項式除法
- MATLAB - 多項式的導數
- MATLAB - 變換
- MATLAB - 變換函式
- MATLAB - 拉普拉斯變換
- MATLAB - 拉普拉斯濾波器
- MATLAB - 高斯-拉普拉斯濾波器
- MATLAB - 逆傅立葉變換
- MATLAB - 傅立葉變換
- MATLAB - 快速傅立葉變換
- MATLAB - 二維逆餘弦變換
- MATLAB - 向座標軸新增圖例
- MATLAB - 面向物件
- MATLAB - 面向物件程式設計
- MATLAB - 類和物件
- MATLAB - 函式過載
- MATLAB - 運算子過載
- MATLAB - 使用者自定義類
- MATLAB - 複製物件
- MATLAB - 代數
- MATLAB - 線性代數
- MATLAB - 高斯消元法
- MATLAB - 高斯-約當消元法
- MATLAB - 簡化行階梯形
- MATLAB - 特徵值和特徵向量
- MATLAB - 積分
- MATLAB - 積分
- MATLAB - 二重積分
- MATLAB - 梯形法則
- MATLAB - 辛普森法則
- MATLAB - 其他
- MATLAB - 微積分
- MATLAB - 微分
- MATLAB - 矩陣的逆
- MATLAB - GNU Octave
- MATLAB - Simulink
- MATLAB - 有用資源
- MATLAB - 快速指南
- MATLAB - 有用資源
- MATLAB - 討論
MATLAB - 運算子過載
MATLAB 中的運算子過載允許您為標準運算子(如 +、-、*、/ 等)定義自定義行為,當它們與您自定義類的物件一起使用時。當您希望類的物件以自然直觀的方式相互互動或與其他 MATLAB 型別互動時,這尤其有用,類似於內建型別的行為。
為什麼要過載運算子?
在 MATLAB 中過載運算子允許您為標準運算子(如 +、*、- 等)定義自定義行為,當它們與您的類物件一起使用時。這使得您可以以自然的方式使用您的物件,並與 MATLAB 的內建功能無縫整合。
例如:
- 算術運算 - 如果您的類包含數值資料,您可以定義 + 或 * 等運算子如何與您的物件一起工作。這樣,您可以直接對您的物件執行算術運算。
- 關係運算 - 透過定義關係運算符(如 <、>、==),您可以在條件語句(如 if 或 switch)中使用您的物件。
簡單來說,運算子過載使您的自定義物件的行為像內建 MATLAB 型別一樣,允許您在程式碼中更直觀地使用它們。
如何定義運算子?
在 MATLAB 中,您可以透過定義處理這些操作的方法來自定義標準運算子(如 +、-、* 等)如何與您的類物件一起工作。每個運算子都有一個相應的方法名稱(例如,+ 運算子對應於 plus 方法)。要實現一個運算子,您需要在類中建立一個具有適當名稱的方法,並定義操作步驟。
運算中的物件優先順序
使用者定義的類比內建類具有更高的優先順序。這意味著如果您定義了您的類的一個物件並將其與內建類物件(如雙精度浮點數)一起使用,如果存在,MATLAB 將使用您的類的方法。例如,如果 p 是您類的物件,而 q 是一個雙精度浮點數,則 p + q 和 q + p 都將呼叫您類的 plus 方法。當來自不同使用者定義類的物件一起使用時,MATLAB 將遵循優先順序規則來決定呼叫哪個方法。
運算子優先順序
MATLAB 根據預定義的操作順序(稱為優先順序級別)計算表示式。這決定了表示式的哪些部分首先計算。同一級別的運算子從左到右計算。以下是從最高到最低優先順序的順序:
- 括號: ()
- 轉置和冪: .', .^, .', ^
- 一元運算: 一元減號、加號和邏輯非與冪: .^-, .^+, .^~
- 一元運算: 一元加號、減號、邏輯非: +, -, ~
- 乘法和除法: .*, ./, .\, *, /, \
- 加法和減法: +, -
- 冒號運算子: :
- 關係運算符: <, <=, >, >=, ==, ~=
- 按元素與: &
- 按元素或: |
- 短路與: &&
- 短路或: ||
與和或運算子的優先順序
MATLAB 賦予 & 運算子比 | 運算子更高的優先順序。例如,表示式 a | b & c 將計算為 a | (b & c)。為了避免混淆,最好使用括號來清楚地指示預期的操作順序。
覆蓋預設優先順序
您可以使用括號更改預設的計算順序。例如:
A = [3 9 5]; B = [2 1 5]; C = A./B.^2 % Evaluates division after exponentiation % C = [0.7500 9.0000 0.2000] C = (A./B).^2 % Evaluates division before exponentiation % C = [2.2500 81.0000 1.0000]
輸出將是:
簡而言之,定義運算子並理解它們的優先順序允許您控制自定義物件如何與 MATLAB 的內建函式互動,並確保表示式按照您預期的順序計算。
運算子過載示例
在 MATLAB 中,運算子過載允許您定義當與您的類的物件一起使用時特定運算子的行為。下面是一些帶有解釋的示例來說明這個概念。
示例 1:過載加號運算子
讓我們建立一個簡單的類來表示一個二維點,並重載 + 運算子以將兩個點加在一起。
classdef Point
properties
X
Y
end
methods
function obj = Point(x, y)
if nargin > 0
obj.X = x;
obj.Y = y;
end
end
% Overload the plus operator
function result = plus(obj1, obj2)
result = Point(obj1.X + obj2.X, obj1.Y + obj2.Y);
end
end
end
將上述程式碼儲存為 Point.m
在這個例子中,
- 我們定義了一個 Point 類,具有 X 和 Y 屬性。
- 函式定義:function obj = Point(x, y) 定義了 Point 類的建構函式方法。建構函式是一個特殊的方法,在建立類的新的例項時會被呼叫。
- 建構函式接受兩個輸入,x 和 y,它們用於初始化屬性 X 和 Y。
- if nargin > 0 條件檢查建構函式是否帶有任何引數被呼叫。nargin 是一個內建變數,它返回傳遞給函式的輸入引數的數量。如果沒有傳遞引數(即,nargin == 0),則屬性 X 和 Y 不會被修改。
- obj.X = x; 和 obj.Y = y; 將 x 和 y 的值賦值給新 Point 物件 (obj) 的屬性 X 和 Y。
- 函式 result = plus(obj1, obj2) 定義了一個方法來過載 Point 物件的 + 運算子。這意味著當您使用 + 運算子和兩個 Point 物件時,將呼叫此方法。該方法接受兩個輸入,obj1 和 obj2,它們是 Point 類的例項。
- result = Point(obj1.X + obj2.X, obj1.Y + obj2.Y); 建立一個新的 Point 物件 (result),其 X 和 Y 屬性是 obj1 和 obj2 的 X 和 Y 屬性的總和。它使用建構函式方法來使用相加的座標建立這個新的 Point 物件。
讓我們訪問 Point 類並執行以下程式碼:
% Create two Point objects p1 = Point(1, 2); p2 = Point(3, 4); % Use the overloaded + operator p3 = p1 + p2; % Display the result disp(['X: ' num2str(p3.X) ', Y: ' num2str(p3.Y)]);
這裡:
- p1 = Point(1, 2); 建立一個 X=1,Y=2 的 Point 物件 p1。類似地,p2 = Point(3, 4); 建立另一個 X=3,Y=4 的 Point 物件 p2。
- p3 = p1 + p2; 使用過載的 + 運算子將 p1 和 p2 相加,得到一個新的 Point 物件 p3,其中 X=4,Y=6。
- p3 的座標使用 disp 顯示。
在 Matlab 命令視窗中執行後的輸出為:
>> % Create two Point objects p1 = Point(1, 2); p2 = Point(3, 4); % Use the overloaded + operator p3 = p1 + p2; % Display the result disp(['X: ' num2str(p3.X) ', Y: ' num2str(p3.Y)]); X: 4, Y: 6 >>
示例 2:過載減號運算子
接下來,讓我們過載 - 運算子,以便從一個點中減去另一個點。
classdef Point
properties
X
Y
end
methods
function obj = Point(x, y)
if nargin > 0
obj.X = x;
obj.Y = y;
end
end
% Overload the plus operator
function result = plus(obj1, obj2)
result = Point(obj1.X + obj2.X, obj1.Y + obj2.Y);
end
% Overload the minus operator
function result = minus(obj1, obj2)
result = Point(obj1.X - obj2.X, obj1.Y - obj2.Y);
end
end
end
將上述程式碼儲存到 Point.m 檔案中。現在,我們可以將 - 運算子與 Point 物件一起使用。
% Create two Point objects p1 = Point(5, 7); p2 = Point(2, 3); % Use the overloaded - operator p3 = p1 - p2; % Display the result disp(['X: ' num2str(p3.X) ', Y: ' num2str(p3.Y)]);
在 Matlab 命令視窗中執行後的輸出為:
>> % Create two Point objects p1 = Point(5, 7); p2 = Point(2, 3); % Use the overloaded - operator p3 = p1 - p2; % Display the result disp(['X: ' num2str(p3.X) ', Y: ' num2str(p3.Y)]); X: 3, Y: 4
示例 3:過載乘號運算子
最後,讓我們過載 * 運算子,以便將一個點按標量值縮放。
if nargin > 0
obj.X = x;
obj.Y = y;
end
end
% Overload the plus operator
function result = plus(obj1, obj2)
result = Point(obj1.X + obj2.X, obj1.Y + obj2.Y);
end
% Overload the minus operator
function result = minus(obj1, obj2)
result = Point(obj1.X - obj2.X, obj1.Y - obj2.Y);
end
% Overload the mtimes operator
function result = mtimes(obj, scalar)
result = Point(obj.X * scalar, obj.Y * scalar);
end
end
end
現在,我們可以使用 * 運算子來縮放 Point 物件。
% Create a Point object p = Point(3, 4); % Use the overloaded * operator to scale the point p2 = p * 2; % Display the result disp(['X: ' num2str(p2.X) ', Y: ' num2str(p2.Y)]);
執行後的輸出如下:
>> % Create a Point object p = Point(3, 4); % Use the overloaded * operator to scale the point p2 = p * 2; % Display the result disp(['X: ' num2str(p2.X) ', Y: ' num2str(p2.Y)]); X: 6, Y: 8 >>