Matlab 函数进阶:使用匿名函数和内嵌函数处理多变量传递问题(Matlab 7.0以上)

2023-11-15

from: http://asc.2dark.org/node/70

Matlab 函数进阶:

使用匿名函数(Anonymous Function)和内嵌函数(Nested Function)处理多变量传递问题(Matlab 7.0以上)

问题:有一个多变量函数 f(abcx) ,现需要分别在 a=a0b=b0c=c0 a=a1b=b1c=c1 的条件下对 f(abcx) 进行某一操作。

此类问题常在数值积分时出现。

解决方案:

1. 使用全局变量

可在主调函数和被调函数中分别将a,b,c声明为全局变量(global a b c),这时f通过全局变量传递abc, 定义时可以只有一个参数x。

2. 使用anonymous function

3. 使用 nested function

下面举例说明anonymous function和nested function的使用。

例:对任意二次多项式进行数值积分 01(ax2+bx+c)dx  (此处显然可以解析得到,此例使用anonymous function做演示)

解:(1)使用匿名函数

编写文件intpoly2.m
如下

function y_int=intpoly2(a,b,c)
y_int=quad(@(x)(poly2(a,b,c,x)), 0,1);  %此处利用matlab内部函
                              %数quad(fun, x0,xt)进行积分,
                              %被积函数fun我们使用匿名函
                              %数“@(x)(poly2(a,b,c,x))”以便
                              %将自变量限制为x. 
 
function y=poly2(ai,bi,ci,x)  %此处定义一个多变量的子函数 poly2( a,b,c,x)
y=ai.*x.^2+bi.*x+ci;         %此处使用矩阵元素运算(.*  和.^)等便于
                              %被矩阵化的内部函数调用,且提高程序效率


执行:

保存该文件并将matlab切换至该文件目录下,命令行输入intpoly2(1,2,3), 便给出积分结果ans=4.33

实际上,上例也可以简化成:

function y_int=intpoly2(a,b,c)
y_int=quad(@(x)(a.*x.^2+b.*x+c), 0,1);  %此处利用matlab内部函
                              %数quad(fun, x0,xt)进行积分,
                              %被积函数fun我们使用匿名函
                              %数@(x)(a.*x.^2+b.*x+c)以便
                              %将自变量限制为x. 

(2)使用nested function

编写函数保存为intnest.m, 内容如下

function y_int=intnest(a,b,c)
y_int=quad(@poly2, 0,1);      %此处利用matlab内部函
                               %数quad(fun, x0,xt)进行积分,
                               %被积函数fun我们使用内嵌函
                               %数poly2(x)的句柄@poly2 
 
function y=poly2(x)           %此处定义一个内嵌函数 poly2( a,b,c,x) 
y=a.*x.^2+b.*x+c;            %直接调用母函数中的变量a,b,c
end                           % 结束内嵌函数poly2
end                           % 结束母函数intpoly2

保存后执行,同样效果。

可见nestedfunction只是将主调函数和被调函数封装到了一起以共享主调函数的变量。

注意:一般函数不需要end,当出现nested function时,主调函数和被调函数都必须有end 来结束

 

 

附:

M脚本文件和M函数文件、函数句柄
m文件分两种:函数和脚本。
1、matlab script file:
脚本文件没有输入输出,对工作空间(workspace)中的变量进行操作。
任何可执行的matlab命令都可以写入脚本文件。先来看一个简单的例子:
 
例1: 产生一个20元素的一维随机数组并画出。
解: 新建一个m文件命名为randplt.m(或者任何你喜欢的名字), 在其中加入如下两行代码:
data=randn(1,20);  
plot(data);
保存后选择debug/run菜单或按F5键运行,观察workspace中多出了一个变量data。
脚本文件执行时, 就如同将文件中的每一条命令依次输入到matlab命令行中一样, 顺次执行。你可以尝试在command history窗口中按住ctrl键选择几行执行过的命令并单击鼠标右键在快捷菜单中选择creat M file来快速创建一个m文件。
 
2、matlab function
函数文件可以接受输入和给出输出,当然也可以没有,就像c语言的函数。matlab函数最大的书写特点(同C比起来)是它的输出变量定义在函数名前面。看一例:
例2: matlab内部函数std给出数组的标准差std=sqrt(sum(X)/N),编写函数stderr求实验误
差err=sqrt(sum(X)/(N*(N-1))), 代码如下:
function err=stderr(arr)
%实验误差(标准差估计)
%caculate along each column of arr
err=std(arr)./sqrt(size(arr,1)-1);
文件存为stderr.m, 运行时输入a=[1;2;3];建立一个列数组a, 然后输入stderr(a)则给出a的方差。(若输入行数组则发散,因N-1=0)
此例中输入变量为arr, 函数名为stderr, 输出变量err, 此三者皆写在关键字function后面同一行。无需再使用return将err的值返回。
注意:
(1)函数文件的命名要使用文件内主函数声明的名称,否则出错。
(2)函数内部可以嵌套子函数并为该文件的主函数调用,只需将子函数写在主函数代码后
面。
(3)一个函数可以有多个输入输出。如function [y1,y2]=myfun(x1,x2,x3)
例1中的m文件可在第一行前插入一行:
function randplt
保存后则该文件成为一个没有输入输出宗量的函数。
一般来说matlab中执行同样的任务使用函数文件比脚本文件的效率高。
 
3.函数句柄的使用
函数句柄起到c语言中函数指针的作用。
例3: 编写函数求出数组arr1和arr2的标准差(std)以及误差(stderr)。
解: 编写如下文件并保存为erreval.m
function [s1,s2]=erreval(err,arr1,arr2)
% err为所调用的误差函数,s1,s2分别返回arr1和arr2的误差.
s1=feval(err,arr1);
s2=feval(err,arr2);
此文件的输入包含"函数变量", 通过函数句柄实现函数变量err的赋值。
运行时先运行如下命令建立数组arr1,arr2:
arr1=[1;2;3];
arr2=[10;20;30];
然后输入
[std1,std2]=erreval(@std,arr1,arr2)
[stderr1,stderr2]=erreval(@stderr,arr1,arr2)
执行后返回四个误差值。
@std,@stderr为两误差函数的函数句柄。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab 函数进阶:使用匿名函数和内嵌函数处理多变量传递问题(Matlab 7.0以上) 的相关文章

  • 使用符号求解器仅求解某些变量

    我正在尝试在 MATLAB 中求解包含 3 个变量和 5 个常量的方程组 是否可以使用solve求解三个变量 同时保持常量为符号而不用数值替换它们 当您使用SOLVE http www mathworks com access helpde
  • 为什么这个函数不是纯粹的?

    在维基百科文章中https en wikipedia org wiki Pure function Impure functions https en wikipedia org wiki Pure function Impure func
  • 查找提供的 Sum 值的组合

    我有一系列这样的数字 myvar 57 71 87 97 99 101 103 113 114 115 128 129 131 137 147 156 163 186 现在我想计算所有这些可能的组合 长度为1到20 其总和等于给定的数字m
  • 为什么 C++ 对于 new 和 delete 有其单独的语法?

    为什么不能只是常规的函数调用 新本质上是 malloc sizeof Foo Foo Foo 虽然删除是 Foo Foo free 那么为什么 new delete 最终会拥有自己的语法而不是常规函数呢 这是一个尝试 The new操作员呼
  • matlab中类库的全局变量

    我有一些matlab声明的类 我如何声明所有类中都可见的常量 例如 这些常量可以是在所有类的方法中使用的物理常量 首先想到的是使用全局变量 还有更好的办法吗 最好在单独的文件中声明这些常量 包含常量的类是执行此操作的一种很好的干净方法 请参
  • javascript - setTimeout() 与 setInterval()

    之间的主要和次要区别是什么setTimeout and setInterval 我在网上搜索了一下 但它让我很困惑 它们之间有什么区别 主要区别是 setInterval fires again and again in intervals
  • Python Tkinter,停止线程函数

    我目前正在为 3D 打印机开发 GUI 并且遇到如何停止线程函数的问题 我希望能够单击 GUI 中具有另一个功能的按钮 该按钮将阻止线程函数通过串行端口发送 G 代码字符串 目前 该函数已合并线程 以允许在打印期间触发其他函数 我非常感谢有
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • 获取ERLANG中的最长公共子序列

    我是这个 ERLANG 的新手 我了解基础知识 这就像计划 但范围更广 我知道如何创建一个函数 但在创建一个获取最长公共子序列的函数时遇到问题 lcs str1 str2 是一个接受两个字符串并输出一个整数的函数 lcs algorithm
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 什么是异地退货?

    什么是非本地退货 什么场景下有用 请举个例子来解释一下 这是一篇好文章 http yehudakatz com 2010 02 07 the building blocks of ruby 关于在 ruby 块的上下文中使用非本地返回 Ru
  • 了解 fminunc 参数和匿名函数、函数处理程序

    请多多包涵 问题在最后 我试图找出 fminunc 调用方式的差异 这个问题源于 Andrew Ng 在他的 Coursera 机器学习课程中的第 3 周材料 我正在回答这个问题 Matlab Andrew Ng 机器学习课程中 t cos
  • LNK2019 错误,无法解析的外部符号

    错误逐字读取 1 gt yes obj error LNK2019 unresolved external symbol int cdecl availableMoves int const int const 4 int availabl
  • 是否存在 IsCallable 为 false 但 IsConstructor 为 true 的 JS 对象?

    ECMAScript 规范函数可调用 https www ecma international org ecma 262 6 0 index html sec iscallable当且仅当其参数具有 Call 内部方法时返回 true 它在
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 对数据进行分布拟合 - MATLAB

    我正在尝试对从显微镜图像中收集的一些数据进行分布 我们知道 152 左右的峰值是由于泊松过程造成的 我想将分布拟合到图像中心的大密度 同时忽略高强度数据 我知道如何将正态分布拟合到数据 红色曲线 但它不能很好地捕获右侧的重尾 尽管泊松分布应
  • R:如何应用输出多列数据帧的函数(使用 dplyr)?

    我想查找数据框中某一特定列与所有其他列之间的相关性 p 值和 95 CI broom 包提供了一个示例 说明如何使用带有 dplyr 和管道的 cor test 在两列之间执行此操作 对于 mtcars 和 mpg 列 我们可以与另一列进行
  • 点击事件的事件处理程序自动触发 - jQuery [重复]

    这个问题在这里已经有答案了 可能的重复 为什么单击事件处理程序会在页面加载后立即触发 https stackoverflow com questions 7102413 why does click event handler fire i
  • putc 和 ungetc 和有什么区别?

    int ungetc int c FILE fp 将字符 c 推回 fp 并返回 c 或EOF对于一个错误 其中 intputc int c FILE fp 将字符 c 写入文件 fp 并返回写入的字符 或者EOF对于一个错误 这些是 K
  • MATLAB 类的 Description 和DetailedDescription 属性

    内置 MATLAB 类具有 Description 和 DetailedDescription 属性的值 gt gt handle ans meta class handle Package meta Properties Name han

随机推荐

  • shared_ptr的线程安全性

    shared ptr的线程安全性 shared ptr的reference count是线程安全的 但是指向的对象不是线程安全的 本文链接 https blog csdn net D Guco article details 8015532
  • SpringBoot+SSM+MySQL整合项目演示(不涉及前后端交互)

    文章目录 准备工作 创建项目 图1 图2 图3 图4 工程目录 代码编写 数据库 pom文件修改 完整项目目录 User类 创建一个来接收查询出来数据的对象 UserMapper接口 UserMapper xml文件配置 Service层
  • git 常用操作总结

    记录一下经常使用到的 git 操作 目录 开发新功能 拉取远程分支 开发新功能 创建 develop 分支 git branch dev 新建功能分支 根据 develop 为基础再键新的 feature 功能分支 b 是创建并且切换到改分
  • # vue# 【九】 个人中心的制作

    Z vue个人中心的制作 个人中心的制作 在实际开发里面 经常会有一些登录页需要进行编写 例如下面这些类型 而这些版面的制作 比较讲究的是思路问题 例如我们想要制作一个登录页 点击就可以输入名字 并且修改名字 整体思路 我们可以先把整体拆分
  • AV1视频编码标准资源汇总

    AV1视频编码标准资源汇总 A Progress Report The Alliance for Open Media and the AV1 Codec http www streamingmedia com Articles Edito
  • NoPrint.js:使用JavaScript在HTML中禁用打印、截屏、复制和粘贴

    NoPrint js是一个小巧整洁的开源JS库 可禁用HTML中的打印 截图 复制和粘贴功能 它还提供启用AutoBlur选项 让鼠标离开网页后内容变得模糊 这个功能可以阻止大多数普通用户截取屏幕截图 NoPrint js可以在几乎所有的浏
  • javaweb期末课设之图书管理系统(附源码)

    一 设计目标 项目是以北京航天航空大学图书管理系统为主题的网站 包含如下功能 注册 登录 用户端 图书查询及借阅 用户端 借阅记录及归还 管理员端 添加及修改图书 管理员端 管理用户信息 用户 管理员端 更改密码 二 运用的软件技术 前端设
  • Spring Boot项目pom

    spring boot web
  • VMware Workstation 虚拟机创建客户端系统,出现此主机不支持64位客户机操作系统问题解决

    安装VMware Workstation 虚拟机 选择centos7 64位是出现此主机不支持64位客户机操作系统 由于是window10系统 我们肯定是支持64的 所以硬件和系统应该是支持的才对 那么可能是哪个系统设置影响到了 有可能有下
  • 编译安装QGLViewerPlugin

    QGLViewer 编译安装步骤 由于工作学习的需要 要用opengl绘制显示些模型动画 原来用的是Qt做UI 直接调用的是QGLWidget类 但这个只是提供了基本的框架 很多交互操作还需添加代码完成 自己偷懒也觉得繁琐 就借用了开源的工
  • linux内核源码分析之页表

    目录 页表说明 虚拟地址转换为物理地址过程 内核中的宏以及说明 页表用来把虚拟页映射到物理页 并且存放页的保护单位 即访问权限 页表说明 5级页表如下 1 页全局目录 Page Global Directory PGD 2 页四级目录 Pa
  • ​Unity的50个重要技巧

    刚开始学习Unity3D时间不长 在看各种资料 除了官方的手册以外 其他人的经验也是非常有益的 偶尔看到老外这篇文章 觉得还不错 于是翻译过来和大家共享 原文地址 50 Tips for Working with Unity Best Pr
  • 区块链系统架构图_区块链模型架构

    一般说来 区块链系统由数据层 网络层 共识层 激励层 合约层和应用层组成 其中 数据层封装了底层数据区块以及相关的数据加密和时间戳等技术 网络层则包括分布式组网机制 数据传播机制和数据验证机制等 共识层主要封装网络节点的各类共识算法 激励层
  • 如何成为一名合格的互联网大厂Python工程师?

    Python开发工程师 是一个在IT行业圈子里一直都很热门的话题 无论是像腾讯 百度这样的大型公司 还是刚刚起步的初创公司 都会招python开发工程师 python已成为越来越多开发者的开发语言选择 而python开发工程师工资基本上都高
  • 投影矩阵的推导(Deriving Projection Matrices)

    本文乃 lt 投影矩阵的推导 gt 译文 原文地址为 http www codeguru com cpp misc misc math article php c10123 1 Deriving Projection Matrices ht
  • ibmmq生产事故

    ibmmq生产事故 在代码中创建了一个没使用的mq的连接对象 也没有进行资源释放 上生产前最好确保连接队列管理器的资源在流程结束后都得到了释放 disconnect 或者进行大批量报文测试 至少需要一百笔 因为ibmmq默认通道连接数是10
  • Neo4j 5的自治图数据库集群

    原文作者 John Stegeman 图数据库产品专家 Neo4j 基于原文翻译并补充整理而成 新近发布的Neo4j 版本5推出了自治集群 Autonomous Cluster 以支持易于部署 可扩展 自容错等重要特性 下面我们就来一睹自治
  • chromedp模拟键盘回车事件

    chromedp 的 SendKeys 可以模拟各种键盘事件 并且支持组合使用 假设以下场景 有一个输入框 我们想模拟键盘输入内容并回车
  • Vuforia VirtualButtons 虚拟按键

    Vuforia VirtualButtons 虚拟按键 注意 1 不介意使用Unity自带的Vuforia 引擎 否则下载商场里的示例项目时可能会因为版本问题产生报错 推荐直接从商店下载示例的引擎使用 2 不推荐下载目前最新9 2版引擎 导
  • Matlab 函数进阶:使用匿名函数和内嵌函数处理多变量传递问题(Matlab 7.0以上)

    from http asc 2dark org node 70 Matlab 函数进阶 使用匿名函数 Anonymous Function 和内嵌函数 Nested Function 处理多变量传递问题 Matlab 7 0以上 问题 有一