在MATLAB中处理对象行为


MATLAB 是一种面向对象的编程 (OOP) 语言,允许我们创建对象并定义它们的行为。

  • 在 MATLAB 中,有一种称为“句柄”的数据类型,用于指向对象。MATLAB 中的句柄还允许我们将函数作为其他函数的输入参数传递。

  • 在 MATLAB 编程中,句柄是按引用而不是按值传递的。因此,当对对象的属性进行任何更改时,它将反映在所有引用中。

  • 在 MATLAB 程序中使用句柄可以提高内存效率,因为它不需要复制对象的全部数据。

总的来说,句柄是 MATLAB 编程中一种用于存储对象引用的对象类型。现在,让我们讨论句柄对象的特性。

MATLAB 中句柄的副本

当我们在 MATLAB 中创建句柄的多个副本时,句柄的副本也将指向与原始句柄相同的对象。

示例

考虑以下 MATLAB 代码来理解这种 MATLAB 句柄对象的特性。

% MATLAB program to explain copies of handle object
% Define a function
function square = f(a)
    square = a^2;
end

% Create a function handle
fun_handle = @f;

% Display the square of a number using the original function handle (@f)
fprintf('Square using original handle: %d
', fun_handle(5)); % Create a copy of the function handle copy_fh = fun_handle; % Display the square of a number using the copied function handle fprintf('Square using copied handle: %d
', copy_fh(5));

输出

Square using original handle: 25
Square using copied handle: 25

解释

在此 MATLAB 代码中,我们首先定义了一个函数“f”来计算数字“a”的平方。然后,我们创建一个函数句柄“fun_handle”来调用该函数并使用此函数句柄显示结果。

之后,我们创建此函数句柄的副本作为“copy_fh”,并使用此复制的函数句柄显示结果。

我们可以看到,两个函数句柄生成的输出相同。因此,这解释了当使用复制的函数句柄时,它也指向与原始函数句柄相同的对象。

使用函数修改句柄

在 MATLAB 中,我们还可以使用函数更改/修改函数句柄。换句话说,我们可以利用函数句柄直接更改对象。因此,当我们传递一个指向函数的函数句柄时,我们在函数内部对对象所做的任何修改也会影响函数外部存在的原始对象。这是因为我们正在处理同一个对象,只是名称不同。

总的来说,在 MATLAB 中,当我们使用函数句柄更改对象时,实际上是在修改此函数句柄指向的对象。

示例

让我们考虑一个例子来理解 MATLAB 中函数句柄的这种行为。

% MATLAB code to modify handles using functions
% Define a function
function result = f(x)
    result = (x.^2) / 2;
end

% Create a function handle
fh = @f;

% Specify values for which the sum to be calculated
a = [5, 3];

% Calculate the sum using the function handle
sum_result = sum(fh(a));

% Display the sum result
fprintf('Sum of the values: %f
', sum_result);

输出

Sum of the values: 17.000000

解释

此代码演示了我们可以轻松地使用函数修改函数句柄。在这个例子中,我们使用内置函数“sum”修改了函数句柄“fh”来计算两个数字的和。

确定对象是否为句柄

在 MATLAB 中,有一个内置函数“isa”,用于确定指定的对象是否为句柄。

此函数采用以下语法

isa(object_name, 'handle')

此函数的输出是一个布尔值,即 True 或 False。如果指定的对象是句柄,则该函数将返回 True,否则返回 False。

示例

让我们考虑一个例子来理解 MATLAB 中句柄的这种行为

% MATLAB code to check if an object is a handle
% Define a function
function result = f(x)
    result = (x.^2);
end

% Create a function handle
a = @f;

% Create a variable
b = 200;

% Determine if the objects are a handle or not
fprintf('Determining for the object a:');
disp(isa(a, 'handle'));

fprintf('Determining for the object b:');
disp(isa(b, 'handle'));

输出

Determining for the object a:  1
Determining for the object b:  0

解释

这里,对象“a”的值“1”表示“a”是一个函数句柄,它指向使用“@f”创建的函数“f”。第二个结果,即对象“b”的值“0”表示“b”不是函数句柄,而是一个变量。

这就是我们在 MATLAB 中检查给定对象是否为句柄的方法。

已删除的句柄对象

在 MATLAB 中,如果我们删除句柄指向的对象,那么指向该对象的句柄仍然可能存在于工作区中。但是,此句柄变为无效或为空,因为它指向的对象不再存在。

因此,删除对象会将对象从工作区中删除,但不会删除指向该对象的句柄。

示例

让我们考虑一个例子来理解这个概念。

% MATLAB code to delete an object pointed by a handle
% Create axes to plot a graph
a = axes;

% Specify data to plot the graph
x = 0:.5:2;
y = 0: 0.2: 2;

% Plot data on the axes
plot(a, x, y);

% Delete the axes after plotting
delete(a);

% Determine if the handle still exists or not
fprintf('Does the handle 'a' still exist? ');
if exist('a', 'var')
    disp('Yes');
else
    disp('No');
end

输出

Does the handle 'a' still exist? Yes

解释

此代码首先使用“axes”函数创建一个 axes 对象,然后绘制由“x”和“y”指定的数据。之后,“delete”函数删除了 axes。接下来,它检查指向 axes 对象的句柄“a”是否存在。在 MATLAB 中,如果对象被删除,指向它的句柄仍然可能存在。因此,此代码的输出将为“是”。

结论

这就是关于 MATLAB 中句柄对象行为的全部内容。在本教程中,我们借助示例程序解释了句柄对象的各种行为。

更新于:2023年9月7日

62 次浏览

启动你的职业生涯

完成课程获得认证

开始
广告