MATLAB - 用户自定义类



MATLAB 传统上以其强大的矩阵运算和内置函数而闻名,但它也支持面向对象编程 (OOP)。MATLAB 中的用户自定义类允许您创建自定义数据类型,这些数据类型封装了数据和对该数据进行操作的函数(方法)。这种方法可以帮助组织代码,提高可重用性,并更自然地对复杂系统进行建模。

什么是类?

类是创建对象(实例)的蓝图。它定义了对象将具有的属性(数据)和方法(函数)。

定义类

在 MATLAB 中,您可以使用 classdef 关键字定义类。以下是一个简单的示例:

classdef MyClass
    properties
        Property1
    end
    
    methods
        function obj = MyClass(val)
            if nargin > 0
                obj.Property1 = val;
            end
        end
        
        function output = myMethod(obj, input)
            output = obj.Property1 + input;
        end
    end
end

示例的分解

1. 类定义

classdef MyClass

此行声明了一个名为 MyClass 的新类。

2. 属性块

properties
    Property1
end

属性是保存类对象的变量。在此示例中,MyClass 有一个属性 Property1。

3. 方法块

methods

方法是定义类行为的函数。它们对类的对象进行操作。

4. 构造函数方法

function obj = MyClass(val)
    if nargin > 0
        obj.Property1 = val;
    end
end

构造函数方法是 MATLAB 在创建新对象时调用的特殊函数。构造函数方法的名称与类名称相同。在此,如果提供了输入值 val,则构造函数会初始化 Property1。

5. 其他方法

function output = myMethod(obj, input)
    output = obj.Property1 + input;
end

这是一个名为 myMethod 的常规方法。它接受两个输入:obj(对象本身)和 input。它返回 Property1 和 input 的总和。

创建对象

要创建 MyClass 的对象,您可以使用构造函数方法

obj = MyClass(10);
disp(obj.Property1);  % Here Output: 10

使用方法

您可以使用点表示法在对象上调用方法

result = obj.myMethod(5);
disp(result);  % Here Output: 15

使用类的优势

  • 封装 - 将相关的数据和函数组合在一起,使代码更模块化,更易于管理。
  • 可重用性 - 定义类后,可以在项目的不同部分或不同项目中重用它。
  • 抽象 - 隐藏内部实现细节,仅公开必要的接口。
  • 继承 - 创建继承现有类的属性和方法的新类,从而促进代码重用和层次结构类结构。

示例 1:点类

以下是一个更实用的示例,定义一个类来表示二维点。

classdef Point
    properties
        X
        Y
    end
    methods
        function obj = Point(x, y)
            if nargin > 0
                obj.X = x;
                obj.Y = y;
            end
        end
        
        function obj = set.X(obj, x)
            if x >= 0
                obj.X = x;
            else
                error('X must be non-negative');
            end
        end
        
        function obj = set.Y(obj, y)
            if y >= 0
                obj.Y = y;
            else
                error('Y must be non-negative');
            end
        end
        
        function distance = distanceToOrigin(obj)
            distance = sqrt(obj.X^2 + obj.Y^2);
        end
    end
end

使用点类

p = Point(3, 4);
disp(p.X);  % Output: 3
disp(p.Y);  % Output: 4

dist = p.distanceToOrigin();
disp(dist);  % Output: 5

在此示例中 -

  • 点类具有 X 和 Y 属性来存储坐标。
  • 构造函数初始化这些属性。
  • 设置方法(set.X 和 set.Y)验证坐标是否为非负数。
  • distanceToOrigin 方法计算从原点到点的欧几里得距离。

示例 2:圆形类

此类将包括圆的半径和中心的属性,以及计算面积、周长以及检查点是否在圆内的的方法。

圆形类定义

classdef Circle
    properties
        Radius
        Center
    end
    methods
        % Constructor
        function obj = Circle(radius, center)
            if nargin > 0
                obj.Radius = radius;
                obj.Center = center;
            end
        end
        
        % Method to calculate area
        function area = area(obj)
            area = pi * obj.Radius^2;
        end
        
        % Method to calculate circumference
        function circumference = circumference(obj)
            circumference = 2 * pi * obj.Radius;
        end
        
        % Method to check if a point is inside the circle
        function isIn = isPointInside(obj, point)
            distance = sqrt((point(1) - obj.Center(1))^2 + (point(2) - obj.Center(2))^2);
            isIn = distance <= obj.Radius;
        end
    end
end

圆形类的分解

1. 类定义

classdef Circle

2. 属性

properties
    Radius
    Center
end

圆形类有两个属性:Radius(圆的半径)和 Center(一个 2 元素向量,表示圆中心的 x 和 y 坐标)。

3. 构造函数方法

function obj = Circle(radius, center)
    if nargin > 0
        obj.Radius = radius;
        obj.Center = center;
    end
end

如果提供了输入参数,则构造函数会初始化 Radius 和 Center 属性。

4. 面积方法

function area = area(obj)
    area = pi * obj.Radius^2;
end

此方法使用公式 𝜋 x Radius2 计算圆的面积。

5. 周长方法

function circumference = circumference(obj)
    circumference = 2 * pi * obj.Radius;
end

此方法使用公式 2 x x Radius 计算圆的周长。

6. 点在圆内检查方法。

function isIn = isPointInside(obj, point)
    distance = sqrt((point(1) - obj.Center(1))^2 + (point(2) - obj.Center(2))^2);
    isIn = distance <= obj.Radius;
end

此方法检查给定点是否在圆内。它计算点到圆中心的距离,并检查此距离是否小于或等于半径。

使用圆形类

要创建圆形对象并使用其方法,您可以执行以下操作。

% Create a Circle object with radius 5 and center at (0, 0)
c = Circle(5, [0, 0]);

% Calculate the area
a = c.area();
disp(['Area: ', num2str(a)]);  % Output: Area: 78.5398

% Calculate the circumference
circ = c.circumference();
disp(['Circumference: ', num2str(circ)]);  % Output: Circumference: 31.4159

% Check if a point is inside the circle
point = [3, 4];
isInside = c.isPointInside(point);
disp(['Is the point inside the circle? ', num2str(isInside)]);  % Output: Is the point inside the circle? 1

% Check if another point is inside the circle
point = [6, 0];
isInside = c.isPointInside(point);
disp(['Is the point inside the circle? ', num2str(isInside)]);  % Output: Is the point inside the circle? 0
广告