Matlab自学笔记:句柄、函数句柄、图像句柄(概念、用法、原理和区别)

本文以Matlab编程环境为例,介绍了句柄的概念。句柄是一种特殊变量,指向结构体,包含可读写的属性或方法,如修改图形属性需通过句柄查找。还介绍了函数句柄,它指向函数表达式本身,用于解决求函数极值、根等问题。

句柄的概念

今天看交流群里在讨论句柄是什么意思,我觉得这是一个很好话题,浅述己见,欢迎交流;

1 首先说,a=1,这里a是一个变量,它的值简单明了,就是1,计算a+1,不用多说,大家立刻明白,结果是2;

2 再说句柄,其实也是一种变量(变量可以直接理解成它的名字,如上例,找到变量名a,那么就找到了它的值1,在一个程序环境中,变量名必须是唯一的,否则会出现变量覆盖的现象,从这个角度说,变量名也就约等于,大家的身份证号了),不过它是一种特别的变量;

3 具体说,句柄作为一种变量,它的特殊性在于,它指向的不是一个简单具体的值,而是一个结构体,这个结构体包含了很多可以读写的分支数据,一般称为属性或者方法,例如图窗类的句柄,使用plot作图之后,形成的图形对象包含线型、颜色、坐标轴刻度、作图范围等,都是这个图像结构体的属性;如果要修改其中的线型或者颜色等属性,就需要通过句柄先找到这个图像,再在图像中找到相应的属性,索引格式是:h.width(h就是图像句柄,width是其中一个表达线宽的属性),至于如何修改和赋值参照上述a=1思考就好了。(这个就比如,通过身份证号先找到你这个人,然后,你的年龄、性别、学历等信息都可以查找了,你就是一个句柄,年龄、性别等都是你的属性)

4 最后再说下,句柄中的非常规概念句柄,函数句柄,它虽然也称为句柄,但用法上,基本不太使用他的属性(它好像也没有什么属性),而是指向函数表达式本身,为什么会这样,例如,函数f(x)=sin(x),常规用法是求函数值,x=0,f(x)=sin(0)=0,没有问题,问题是,如果要求函数f(x0的极值,或者f(x)=0方程的根,大家立刻发现,仅输入自变量或者函数值是不行的,而需要输入整个函数表达式,也就是说,把函数表达式作为一个整体输入变量,常规变量如a=1是做不到的,不信你试试a=f(x),肯定回报错,怎么办呢,函数句柄应运而生,使用@符号创建一种新的变量,如,a=@f(上面已经定义了f函数),那么求方程f=0的根,只需要调用求根函数fzero,应用格式为:fzero(a),或者fzero(@f),求最值就不用说了,事实上,在优化专题里,目标函数的输入都是用函数句柄的这种方式。

以上是以Matlab编程环境说明的。

End

### Matlab函数句柄的使用方法 #### 什么是函数句柄函数句柄MATLAB 中是一种特殊的数据类型,用于存储对某个特定函数的引用。通过这种方式,可以在程序的不同部分传递调用同一个函数[^2]。 #### 创建函数句柄的方法 以下是几种常见的创建函数句柄的方式: 1. **匿名函数** 匿名函数允许快速定义简单的数学表达式并将其作为函数句柄保存。 ```matlab mysqr = @(x) x.^2; result = mysqr(3); ``` 上述代码中 `@(x)` 定义了一个接受单个参数 `x` 的匿名函数,并对其执行平方运算[^3]。 2. **内置函数** 对于 MATLAB 提供的标准库函数,可以直接为其创建句柄。 ```matlab sinHandle = @sin; value = sinHandle(pi / 2); ``` 这里的 `@sin` 是对正弦函数的一个引用,可以通过这个句柄调用原生的 `sin` 函数[^2]。 3. **自定义函数** 如果已经编写了独立的 M 文件形式的函数,则可以利用 `@` 符号生成其对应的句柄。 假设存在如下文件 `customFunction.m`: ```matlab function output = customFunction(input) output = input ^ 3 + 2 * input; end ``` 那么可以通过下面方式获取它的句柄: ```matlab funcHandle = @customFunction; computedValue = funcHandle(4); ``` #### 应用场景举例 - **数值积分** 使用 `integral` 计算定积分时需传入被积函数的形式化描述——这正是函数句柄擅长的地方。 ```matlab fun = @(t) exp(-t) .* log(t).^2; % 被积函数 q = integral(fun,0,Inf); % 积分上下限分别为0到无穷大 disp(q); % 显示结果 ``` - **优化问题求解器** 当寻找方程根或者最小值点的时候也常常用到这种技术。 ```matlab eqn = @(z)(exp(z)-pi*z); % 方程式子 rootOfEquation = fzero(eqn,[1,5]);% 寻找区间内的零点位置 fprintf('The solution is %.4f.\n',rootOfEquation); ``` #### 类型验证 为了确认某对象确实是一个有效的函数句柄实例,可借助命令 `isa()` 或者直接查询类别名称。 ```matlab if isa(myVar,'function_handle') disp('This variable represents a valid function handle.'); else error('Invalid type detected!'); end ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freexyn

码字不易,谢谢鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值