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
>>
廣告
© . All rights reserved.