MATLAB系列05:自定义函数

news2024/9/21 12:30:28

MATLAB系列05:自定义函数

  • 5. 自定义函数
    • 5.1 MATLAB函数简介
    • 5.2 在MATLAB中传递变量:按值传递机制
    • 5.3 选择性参数
    • 5.4 用全局内存分享数据
    • 5.5 在函数两次调用之间本地数据的存储
    • 5.6 函数的函数(function functions)
    • 5.7 子函数和私有函数
    • 5.8 总结

5. 自定义函数

MATLAB 有一个专门的机制,在建立最终的程序之前用于独立地开发与调试每一个子程序。每一个子程序都可以独立函数的形式进行编程,在这个程序中,每一个函数都能独立地检测与调试,而不受其他子程序的影响。良好的函数可以大大提高编程的效率。它的好处如下:

  1. 子程序的独立检测

    每一个子程序都可以当作一个独立的单元来编写。在把子程序联合成一个的大程序之前,我们必须检测每一个子程序以保证它运转的正确性。

  2. 代码的可复用性

    在许多的情况下,一个基本的子程序可应用在程序的许多地方。可重用性代码有两大好处:它大大提高了整体编程效率,它更易于调试。

  3. 远离意外副作用

    函数通过输入参数列表(input argument list)从程序中读取输入值,通过输出参数列表(output argument list)给程序返回结果。程序中,只有在输入参数列表中的变量才能被函数利用。函数中,只有输出参数列表中的变量才能被程序调用。好的函数的应用可以通过数据隐藏使问题最小化。在主函数中的变量在函数中是不可见的(除了在输入变量列表中的变量),在主程序中的变量不能被函数任意修改。所以在函数中改变变量或发生错误不会在程序的其他部分发生意外的副作用。

5.1 MATLAB函数简介

MATLAB 函数是一种特殊形式的 M 文件,它运行在独立的工作区。它通过输入参数列表接受输入数据,它通过输出参数列表返回结果给输出参数列表。 MATLAB 函数的基本形式如下:

function [outarg1, outarg2, ...] = fname(inarg1, inarg2, ...)
%H1 comment line
%Other comment lines
...
(Executable code)
...
(return)

在一个函数中的初始注释行有特定的目的。在 function 语句的第一个行注释被称为 H1注释行。它应当是对本函数功能的总结。这一行的重要性在于,通过lookfor命令它能被搜索到并显示出来。从 H1 注释行到第一个空行或第一个可执行性语句可以通过 help 命令或帮助窗口搜索到。

输入参数列表是名字的列表,这些名字代表从调用者到函数的值。这些名字被称作形参。当函数被调用时,它们只是从调用者得来实际变量的占位符而已。相似地,输出参数列表也形参组成,当函数结束运行时,这些形参是返回到调用者的值的占位符。

在一个表达式中,调用一个函数需要用到实参列表。在命令窗口直接(或在脚本文件中,另一个函数中)键入函数的名字就可以调用这个函数了。当调用一个函数时,第一个实参的值用在第一个形参的位置,而且其余的形参和实参都一一对应。

5.2 在MATLAB中传递变量:按值传递机制

maltab 程序与它们函数之间的交互用是按值传递机制。当一个函数调用发生时, MATLAB将会复制实参生成一个副本,然后把它们传递给函数。这次复制是非常重要的,因为它意味着虽然函数修改了输入参数,但它并没有影响到调用者的原值。这个特性防止了因函数修改变量而导致的意想不到的严重错误。

实际上, MATLAB 用了两种方法,它先对函数的每一个参数进行分析,确定函数的那些参数进行了修改。如果函数没有修改这个参数,它将不会对此参数进行复制,而是简单地指向程序外面的变量,如果函数修改了这个参数,那么这个复制就会被执行)。示例:

5.3 选择性参数

许多的 MATLAB 函数都支持选择性输入参数和输出参数。例如,我们调用 plot 函数,输入参数既可以少到 2 个,也可以多到 7 个参数。从另一方面说,函数 max 既支持一个输出参数,也支持两个输出参数。如果只有一个输出参数, max 将会返回函数的最大值。如果有两个输出参数将会返回数组的最大值和最大值所在的位置。 在 MATLAB 中有八种专门的函数用于获取关于选择性参数的信息和用于报告这些参数的错误,这里介绍6个。

image-20240914121456537

函数 nargin 和 nargout 只用在用户自定义函数中。当他们被调用时,这些函数将会分别返回实际输入、输出参数的个数。如果一个函数在被调用时含有过多或过少的参数,函数nargchk 将会产生一个包含标准错误的字符串。此函数的语法如下:

message = nargchk(min_args, max_args, num_args);

其中 min_args 是指参数的最小个数, max_args 是指参数的最大个数, num_args 是指参数的实际个数。如果参数的个数不在允许的范围,将会产生一个标准的错误信息。如果参数的个数在允许的范围之内,那么这个函数将返回一个空字符。

函数 error 是用于显示标准的错误信息和用于中止导致错误信息的自定义函数的一种标准方式。这个函数的语法是 error(‘msg’), 其中 msg 是一个包含错误信息的字符串。当 error函数执行,它将会中止当前函数,并返回到键盘输入状态,在命令窗中显示出错误信息。如果这个信息字符中为空, error 函数将什么也不做,当前函数继续执行。 函数 error 与函数nargchk 配合,当有错误发生时, error 将产生一个信息字符串,当没有错误时, error 将产生一个空字符。

数 warning 是显示警告的函数名及所在行的信息,并继续执行当前函数。此函数的语法为 warning(‘msg’),其中 msg 是指含有警告信息的字符串。当执行 waring 函数时,它将在命令窗口显示警告信息,列出警告的函数名及所在行的信息。如果信息子符串为空, warning将什么也不做。同时,当前函数将继续执行。

当一个函数被调用时, inputname 函数将会返回实参的名字。 inputname 函数的语法为

name = inputname(argno);

其中 argno 是参数的序号。如果这个参数是一个变量,那么返回将只是变量名。如果参数是一个表达式,那么这个函数将会返回空字符。例如考虑下面的函数

function myfun(x, y, z)
name = inputname(2);
disp(['The second argument is named ' name]);
>> dog='dog';
>> cat='cat';
>> my_fun(dog,cat)
The second argument is named cat
>> my_fun(dog,cat+1)
The second argument is named 

5.4 用全局内存分享数据

全局内存是指内存的一种特殊类型,它能够被所有的工作区访问。如果一个变量在函数中被声明全局变量,那么它将占用的是全局内存,而不是本地工作区。如果相同的变量在另一个函数中被声明为全局变量,那么这个变量所占有内存区域就是第一个函数中的相同变量。声明有全局变量的脚本文件或函数将有办法访问相同的值,所以全局变量为函数之间分享数据提供了一个方法。 全局变量的声明要用到 global 主语句,基本形式如下:

global var1 var2 var3 ...

每一个全局变量在函数第一次使用之前必须声明如果在本地工作区中已经被创建,那么声明为再次声明全局变量将会产生错误。为了避免这种错误,在函数中的初始注释行之后和第一个可执行性语句之前声明全局变量。

5.5 在函数两次调用之间本地数据的存储

持久内存(persistent memory)是内存的一种类型, 在函数上一次调用之后, 这一步调用之前, 本地变量被保存在持久内存, 值不变。持久变量应用语句声明。 它的形式如下:

persistent var1 var2 var3 ...

5.6 函数的函数(function functions)

函数的函数(function functions)是指函数的输入参数中含有其他的函数,传递给函数的函数的变量名一般情况应用于这个函数执行的过程中。例如, MATLAB 中有一个函数的函数叫做 fzero。 这个函数用于找到传递给它的函数值为 0 时的自变量。例如,语句 fzero(‘cos’, (0, pi)), 它能确定 cos 函数在区间[0, π]中何时为 0。语句 fzero(‘exp(x)-2’, [0 1])在区间[0, 1]中何时为 0。当这些语句被执行时,将产生如下的结果:

>> fzero('cos',[0 pi])

ans =

    1.5708

>> fzero('exp(x)-2',[0 1])

ans =

    0.6931

常见函数的函数如下:

image-20240914162601127

5.7 子函数和私有函数

在一个单个的文件中我们可以创建多个函数。如果超过 1 个的函数出现在一个文件中,那么最上面的那个函数为普通函数,下面的函数称为子函数或中间函数。子函数看起来和普通函数一样,但是只能被同一文件中的函数调用。示例:

function [avg, med] = mystats(u)
%MYSTATS Find mean and median with internal functions.
% Function MYSTATS calculates the average and median
% of a data set using subfunctions.
    n = length(u);
    avg = mean(u, n);
    med = median (u, n);
    function a = mean(v, n)
    % Subfunction to calculate average.
    a = sum(v) / n;
    function m = median(v, n)
    % Subfunction to calculate median
    w = sort(v);
    if rem(n, 2) ==1
    m = w((n+1)/2);
    else
    m = (w(n/2) + w(n/2 + 1))/2;
end

5.8 总结

image-20240916111527774 image-20240916111541419

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

问题:WINCC 7.5 结构变量只能是内部变量吗?

问题:WINCC 7.5 结构变量只能是内部变量吗? 答案:不是的呢,你创建结构的时候可以选择外部变量的 如图:工控人加入PLC工业自动化精英社群 #WINCC 7.5##变量##结构##西门子工业支持中心#

css五种定位总结

在 CSS 中,定位(Positioning)主要有五种模式,每种模式的行为和特点不同,以下是 static、relative、absolute、fixed 和 sticky 五种定位方式的对比总结: 1. static(默认定位) 特性…

基于SpringBoot+Vue+MySQL的在线招投标系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今商业环境中,招投标活动是企业获取项目、资源及合作伙伴的重要途径。然而,传统招投标过程往往繁琐复杂,涉及众多文件交换、信息审核与沟通环节,不仅效率低下,还易…

【强化学习系列】Gym库使用——创建自己的强化学习环境2:拆解官方标准模型源码/规范自定义类+打包自定义环境

目录 一、 官方标准环境的获取与理解 二、根据官方环境源码修改自定义 1.初始化__init__() 2.重置环境 reset() 三、打包环境 1.注册与创建自定义环境 2.环境规范化 在本文的早些时候,曾尝试按照自己的想法搭建自定义的基于gym强化学习环境。 【强化学习系列】Gy…

什么是自然语言处理

自然语言处理(Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究的是如何实现人与计算机之间使用自然语言进行有效通信的各种理论和方法。以下是关于自然语言处理的详细解释: 一、定义与概述 定义&…

字符编码发展史2 — ISO-8859-N

2.2. 第二个阶段 本地化 2.2.1. ANSI2.2.2. ISO/IEC 8859-N 2.2.2.1. 什么是ISO/IEC 8859-N?2.2.2.2. ISO 8859-1的编码表 上一篇《字符编码发展史1 — ASCII和EASCII》我们讲解了字符编码的起源ASCII和EASCII。本篇我们将继续讲解字符编码的第二个发展阶段中的ISO 8859-N。…

西门子200SMART全面讲解

200 SMART 全面讲解工控人加入PLC工业自动化精英社群 工控人加入PLC工业自动化精英社群

如何打造出强悍的谷歌搜索关键词优化方案揭密

搭建一个成功的关键词优化规划是促进网站在谷歌搜索引擎中取得更强曝光和流量重要。本文将为你揭露七个秘笈,帮助自己打造出强悍的谷歌搜索关键词优化方案。1.目标制定在进行优化关键词以前,必须明确自己的目标。你希望用谷歌搜索引擎获得更多浏览量和访…

C++速通LeetCode简单第5题-回文链表

解法1,堆栈O(n)简单法: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListN…

一款屏幕录制和视频剪辑软件Camtasia 2024

Camtasia 2024是一款屏幕录制和视频剪辑软件,软件提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场、视频播放功能、视屏白板等功能,支持在任何颜色模式下轻松地记录屏幕动作,有需要的朋友快来下载吧! Camtasia 2…

1.pytest基础知识(默认的测试用例的规则以及基础应用)

一、pytest单元测试框架 1)什么是单元测试框架 单元测试是指再软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。 2)单元测试框架 java:junit和testing python:un…

电脑怎么禁用软件?5个方法速成,小白必入!

电脑禁用软件的方法多种多样,以下是五种简单易行的方法. 适合不同需求的用户,特别是电脑小白。 1. 使用任务管理器禁用启动项 操作步骤:按下“Ctrl Shift Esc”组合键,打开任务管理器。 切换到“启动”选项卡,找到…

计算机毕业设计 家电销售展示平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

【活动预告】平陆县2024年“我有拿手戏”群众文艺大展演

庆祝中华人民共和国成立75周年 7天10场演出3场展览 文化给您精彩 “礼赞新中国逐梦新时代” 【活动预告】 平陆县“庆祝中华人民共和国成立75周年”文艺晚会暨“我有拿手戏”群众文艺大展演 7天10场演出3场展览给您精彩 01 平陆县2024年“庆祝中华人民共和国成立75周年”…

小阿轩yx-案例:Prometheus监控kubernetes环境构建

小阿轩yx-案例:Prometheus监控kubernetes环境构建 前言 传统架构中比较流行的监控工具有 Zabbix、Nagios 等,这些监控工具对于 Kubernetes 这类云平台的监控不是很友好,特别是当 Kubernetes 集群中有了成千上万的容器后更是如此 基于 kube…

662. 二叉树最大宽度 BFS 力扣

662. 二叉树最大宽度 已解答 中等 相关标签 相关企业 给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长…

【工具变量】数字乡村试点区县DID(2000-2023)

数据简介:数字乡村试点政策是中国政府为了推动乡村数字化转型、促进乡村振兴而实施的一项重要战略。根据2020年7月18日中国政府网发布的《关于开展国家数字乡村试点工作的通知》,试点工作的目标是到2021年底,试点地区数字乡村建设取得明显成效…

自动泊车系统中的YOLOv8 pose关键点车位线检测

自动泊车系统中的YOLOv8关键点车位线检测技术解析 引言 随着智能驾驶技术的快速发展,自动泊车功能成为了现代汽车的重要组成部分。它不仅能够提高驾驶的安全性,还能在一定程度上解决城市停车难的问题。在自动泊车系统中,准确识别停车位的位置…

微信 SDK、NCF 、CO2NET、Senparc.AI 近期重大更新,欢迎解锁

◾️更新基础库,包括缓存、APM、CO2NET 核心模块等全面升级; ◾️更新支付接口调用过程中的 SM(国密)和 RSA 判断方式; ◾️更新微信 SDK 接口 Senparc.Weixin SDK ✍️v2024.9.10 更新基础库,包括缓…

解决nginx代理SSE接口的响应没有流式返回

目录 现象原来的nginx配置解决 现象 前后端分离的项目,前端访问被nginx反向代理的后端SSE接口,预期是流式返回,但经常是很久不响应,一响应全部结果一下子都返回了。查看后端项目的日志,响应其实是流式产生的。推测是n…