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)8192gongSound.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)8192modifySampleRate(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 对象:
whosName Size Bytes Class AttributesFs 1x1 8 double gongSound 1x1 0 audioplayer y 42028x1 336224 double
注意
whos命令返回的字节值不包括句柄引用的数据,因为许多变量可以引用相同的数据。句柄 gongSound 不再引用有效对象,如 isvalid 句柄方法所示:
isvalid(gongSound)ans =logical0
对已删除的句柄调用 delete 不起任何作用,也不会导致错误。可以将同时包含有效和无效句柄的数组传递给 delete。MATLAB 会删除有效句柄,但遇到已无效的句柄时不会生成错误。
不能通过无效的句柄变量来访问属性:
gongSound.SampleRateInvalid or deleted object.
访问对象属性的函数和方法会导致错误:
play(gongSound)Invalid or deleted object.
要删除变量 gongSound,请使用 clear:
clear gongSoundwhosName Size Bytes Class AttributesFs 1x1 8 double y 42028x1 336224 double
Matlab中句柄对象行为相关推荐
- Matlab中句柄类和值类的比较
句柄类和值类的比较 基本差异 值类构造函数返回一个与其赋值变量相关联的对象.如果对此变量重新赋值,MATLAB® 会创建原始对象的独立副本.如果将此变量传递给函数以修改它,函数必须将 ...
- matlab中句柄图性对像的设置
1.获取图形对象的属性列表或者属性列表的值 调用格式:get(h,'propernamr'); 可以的得到图形对象h指定的属性值: 2.设置对象属性值 set(h,'propername','prop ...
- matlab中符号对象的数据类型是,符号对象(Symbolic Object)的使用
符号对象是什么?符号对象是Matlab中一种特殊的数据类型, 其实质是"a data structure that stores a string representation of the ...
- oop matlab,oop – 在Matlab中设置对象的属性
所以我在设置对象的特定属性时遇到问题.我对Matlab相对较新,特别是面向对象编程.以下是我的代码: classdef Card < handle properties suit; color; ...
- matlab等待按键响应,matlab中figure对象的按键响应
常用的有两个WindowKeyPressFcn和WindowKeyReleaseFcn,分别表示按下按键和释放按键的响应函数,两者调用形式上是一样的. 1.说明 以indowKeyPressFcn为例 ...
- matlab中线形_MATLAB在绘图时的用法——线形图
MATLAB有很强的绘图功能,我们可以通过简单的代码画出一些直观而漂亮的代码. 在MATLAB中绘图首先需要设定x的范围,一般使用冒号来创建向量. x = 0:pi/100:pi; &x 为0 ...
- matlab中struct2,Matlab中struct的用法
struct在matlab中是用来建立结构体数组的.通常有两种用法: s = struct('field1',{},'field2',{},...) 这是建立一个空的结构体,field1,field2 ...
- Matlab中的图形句柄(转载)
在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每次创建一个对象时,matlab就为它建立一个唯一的句柄 句柄中包含有该对象的相关信息参数,可以在后续程序中进行操作,改变其中的参数,以便达 ...
- handle句柄 matlab_学习随笔之Matlab句柄对象深拷贝方法
最近在使用Matlab句柄对象时,被深拷贝和浅拷贝的坑折腾得不轻,而且网上相关的应用资料也比较少,好在MathWork的帮助文档非常丰富,并且有应用案例,花了几天时间终于理出了一些头绪,以下是自己使用 ...
最新文章
- [NOI2010]能量采集
- 操作主机 Infrastructure Master[为企业维护windows server 2008系列八]
- Idea报错,但是项目可以正常启动运行
- 使用Vant完成DatetimePicker 日期的选择器
- php外部对象如何使用方法,php面向对象全攻略 (三)特殊的引用“$this”的使用...
- 快速锁屏电脑快捷键_一学就会的8个电脑快捷键一定要掌握!堪称“高效”神器...
- RabbitMQ实现RPC
- memcache服务应用实践
- 设计模式-适配器模式(Adapter)
- 组件中使用_Cocos Creator中Button组件使用详解
- java 工资如何_Java编写员工薪资表
- 改变linux 背景修改命令,Linux命令行下更改桌面背景(GNOME环境)
- beego 2.0升级的巨坑,graceful错误
- Windows 10(Win10) 怎么删除设备和驱动里的CD驱动器
- ubuntu18.0 调节显卡GPU涡轮风扇转速
- 遥感图像处理:最小噪声分离变换(Minimum Noise Fraction Rotation,MNF Rotation)
- 用辅助功能实现自动点击
- SEAndroid中sepolicy/adbd.te策略文件分析
- 浅谈 RISC-V 软件开发生态之 IDE
- allegro Shape has connect lines attached 问题解决办法