Matlab中句柄对象行为
目录
句柄对象行为
多个变量可以引用同一个句柄对象。因此,用户与句柄类的实例的交互不同于值类的实例。了解句柄对象的行为可以帮助您确定是实现句柄还是值类。本主题说明其中的一些交互。可以参考句柄类。
什么是句柄?
句柄是特定类型的 MATLAB® 对象。当变量保存句柄时,它实际上保存的是对相应对象的引用。
句柄对象允许多个变量引用同一个对象。句柄对象行为会影响复制句柄对象以及将它们传递给函数时发生的事情。
句柄的副本
句柄对象变量的所有副本都引用同一个底层对象。这种引用行为意味着,如果h标识某个句柄对象,则:
h2 = h;
创建另一个变量h2,它引用与h相同的对象。例如,MATLAB audioplayer 函数创建一个包含音频源数据的句柄对象,以重现特定的声音片段。audioplayer函数返回的变量可标识音频数据,并允许访问对象函数来播放音频。
MATLAB 软件包含音频数据,可以加载这些数据并使用它们创建 audioplayer 对象。以下示例会加载音频数据、创建音频播放器,并播放音频:
例如,MATLAB audioplayer 函数创建一个包含音频源数据的句柄对象,以重现特定的声音片段。audioplayer 函数返回的变量可标识音频数据,并允许您访问对象函数来播放音频。
load gong Fs y
gongSound = audioplayer(y,Fs);
play(gongSound)
假设将 gongSound 对象句柄复制到另一个变量 (gongSound2):
gongSound2 = gongSound;
变量 gongSound 和 gongSound2 是同一句柄的副本,因此引用的是同一音频源。使用任一变量访问 audioplayer 信息。
例如,通过为 SampleRate 属性赋一个新值来设置锣声音频源的采样率。首先获取当前采样率,然后设置新采样率:
sr = gongSound.SampleRate;
disp(sr)
8192
gongSound.SampleRate = sr*2;
可以使用 gongSound2 访问同一音频源:
disp(gongSound2.SampleRate)
16384
以新采样率播放锣声:
play(gongSound2)
在函数中修改过的句柄对象
将实参传递给函数时,函数会将变量从调用该函数的工作区复制到函数工作区的形参变量中。
将非句柄变量传递给函数不会影响调用方工作区中的原始变量。例如,myFunc 会修改名为 var 的局部变量,但当函数结束时,局部变量 var 便不再存在:
function myFunc(var)
var = var + 1;
end
定义一个变量,并将其传递给 myfunc:
x = 12;
myFunc(x)
执行 myFunc(x) 后,x 的值没有更改:
disp(x)
12
myFunc 函数可以返回修改后的值,可以将该值赋给同一个变量名称 (x) 或另一个变量。
function out = myFunc(var)
out = var + 1;
end
修改 myfunc 中的值:
x = 12;
x = myFunc(x);
disp(x)
13
当参数是句柄变量时,函数只复制句柄,而不复制由该句柄标识的对象。两个句柄(原始句柄和本地副本)引用同一个对象。
当函数修改对象句柄引用的数据时,可以从调用工作区的句柄变量中访问这些更改,而不需要返回修改后的对象。
例如,使用 modifySampleRate 函数更改 audioplayer 的采样率:
function modifySampleRate(audioObj,sr)
audioObj.SampleRate = sr;
end
创建一个 audioplayer 对象,并将其传递给 modifySampleRate 函数:
load gong Fs y
gongSound = audioplayer(y,Fs);
disp(gongSound.SampleRate)
8192
modifySampleRate(gongSound,16384)
disp(gongSound.SampleRate)
16384
modifySampleRate 函数不需要返回修改后的 gongSound 对象,因为 audioplayer 对象是句柄对象。
确定对象是否为句柄
句柄对象是 handle 类的成员。因此,始终可以使用 isa 函数将对象标识为句柄。测试句柄变量时,isa 返回逻辑值 true (1):
load gong Fs y
gongSound = audioplayer(y,Fs);
isa(gongSound,'handle')
要确定变量是否为有效的句柄对象,请使用 isa
和 isvalid
:
if isa(gongSound,'handle') && isvalid(gongSound)
...
end
删除的句柄对象
要确定变量是否为有效的句柄对象,请使用 isa 和 isvalid:删除句柄对象后,引用该对象的句柄变量仍可存在。这些变量将不再有效,因为它们所引用的对象已不再存在。对对象调用 delete 会删除对象,但不会清除句柄变量。
例如,创建一个 audioplayer 对象:
load gong Fs y
gongSound = audioplayer(y,Fs);
输出参数 gongSound 是一个句柄变量。调用 delete 删除该对象及其包含的音频源信息:
delete(gongSound)
但是,句柄变量仍然存在:
disp(gongSound)
handle to deleted audioplayer
whos 命令将 gongSound 显示为一个 audioplayer 对象:
whos
Name Size Bytes Class Attributes
Fs 1x1 8 double
gongSound 1x1 0 audioplayer
y 42028x1 336224 double
注意
whos命令返回的字节值不包括句柄引用的数据,因为许多变量可以引用相同的数据。句柄 gongSound 不再引用有效对象,如 isvalid 句柄方法所示:
isvalid(gongSound)
ans =
logical
0
对已删除的句柄调用 delete 不起任何作用,也不会导致错误。可以将同时包含有效和无效句柄的数组传递给 delete。MATLAB 会删除有效句柄,但遇到已无效的句柄时不会生成错误。
不能通过无效的句柄变量来访问属性:
gongSound.SampleRate
Invalid or deleted object.
访问对象属性的函数和方法会导致错误:
play(gongSound)
Invalid or deleted object.
要删除变量 gongSound,请使用 clear:
clear gongSound
whos
Name Size Bytes Class Attributes
Fs 1x1 8 double
y 42028x1 336224 double
相关文章
- Matlab中图形对象属性gca使用
- Matlab中writecell函数的使用
- Matlab中修改图形对象
- Matlab中图形对象控制的功能
- Matlab中属性特性
- Matlab中repmat函数的使用
- Matlab中sqrtm函数的用法
- matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields
- 基于Pointnet++深度学习网络的点云数据分类matlab仿真
- 【眼底检测】视网膜动静脉血管检测和特征计算matlab仿真
- 基于深度学习的步态识别算法的MATLAB仿真
- 【MATLAB教程案例83】通过matlab实现数据的插值拟合
- 【MATLAB教程案例80】matlab在大学数学中的应用——高等数学
- 【MATLAB教程案例73】通过MATLAB编程实现滑模变结构控制系统——控制对象为二级直线倒立摆模型
- 【MATLAB教程案例51~67总结】MATLAB人工智能类算法仿真经验和技巧总结
- 【MATLAB教程案例66】基于Q-learning强化学习的智能体栅格地图路线规划matlab仿真
- 【MATLAB教程案例64】深度学习网络建模1,通过matlab编程实现
- 【MATLAB教程案例61】使用matlab实现基于ResNet残差网络的数据分类仿真分析
- 【MATLAB教程案例57】使用matlab实现RCNN,FastRCNN以及FasterRCNN网络目标检测功能与仿真分析
- 【MATLAB教程案例44】通过matlab学习三维曲面的建模,颜色,透明度,动态变化等——以海浪曲面函数为例
- 【MATLAB教程案例33】基于高斯混合模型的视频背景提取算法的matlab仿真实现
- 【MATLAB教程案例32】基于matlab的交通标志检测分割算法的仿真——形态学处理,膨胀,腐蚀,形状检测,颜色模型,小波滤波等知识的综合应用
- 【MATLAB教程案例15】基于WOA鲸鱼优化算法的函数极值计算matlab仿真及其他应用
- 基于NSCT变换的人脸图像特征提取matlab仿真
- 【滤波器设计】根据设计指标使用matlab定制滤波器
- 【电网规划】基于智能算法的电力系统最优规划matlab仿真
- 【CUDA7.5】MATLAB中配置Win7+Matlab R2015b+CUDA7.5+vs2013配置方法
- 用MATLAB实现OFDM仿真分析
- 杨氏干涉的模拟matlab源码
- MATLAB中用imfilter()对图像进行相关或卷积运算前一定要用tofloat()或im2double()将数据类型转换为浮点型
- 【Matlab 六自由度机器人】定义标准型及改进型D-H参数建立机器人模型(附MATLAB建模代码)
- MatLab教程之使用Excel和MATLAB求解工程中的线性和非线性方程
- MATLAB求解矩阵特征值的六种方法