matlab使用教程(10)—脚本和函数

news2024/10/5 17:18:50

1.概述

        MATLAB 提供了一个强大的编程语言和交互式计算环境。您可以使用此语言在 MATLAB 命令行中一次输入一个命令,也可以向某个文件写入一系列命令,按照执行任何 MATLAB 函数的相同方式来执行这些命令。使用 MATLAB 编辑器或任何其他文件编辑器可以创建您自己的函数文件。按照调用任何其他MATLAB 函数或命令的相同方式来调用这些函数。
        两种程序文件:
        • 脚本,不接受输入参数或返回输出参数。它们处理工作区中的数据。
        • 函数,可接受输入参数,并返回输出参数。内部变量是函数的局部变量。
        如果您是新 MATLAB 程序员,您只需在当前文件夹中创建您希望尝试的程序文件。当您创建的文件越来越多时,您可能希望将这些文件组织到其他文件夹和个人工具箱,以便将其添加到您的 MATLAB 搜索路径中。
        如果您复制多个函数名称,MATLAB 会执行在搜索路径中显示的第一个函数。要查看程序文件(例如, myfunction.m )的内容,请使用
type myfunction

2.脚本

        当调用脚本时,MATLAB 仅执行在文件中找到的命令。脚本可以处理工作区中的现有数据,也可以创建要在其中运行脚本的新数据。尽管脚本不会返回输出参数,其创建的任何变量都会保留在工作区中,以便在后续计算中使用。此外,脚本可以使用 plot 等函数生成图形输出。
例如,创建一个名为 magicrank.m 的文件,该文件包含下列 MATLAB 命令:
% Investigate the rank of magic squares
r = zeros(1,32);
for n = 3:32
r(n) = rank(magic(n));
end
bar(r)

        键入语句 magicrank,使 MATLAB 执行命令、计算前 30 个幻方矩阵的秩,并绘制结果的条形图。执行完文件之后,变量 nr将保留在工作区中。

3.函数

        函数是可接受输入参数并返回输出参数的文件。文件名和函数名称应当相同。函数处理其自己的工作区中的变量,此工作区不同于您在 MATLAB 命令提示符下访问的工作区。rank 提供了一个很好的示例。文件 rank.m 位于文件夹toolbox/matlab/matfun 您可以使用以下命令查看文件
type rank

下面列出了此文件:

function r = rank(A,tol)
% RANK Matrix rank.
% RANK(A) provides an estimate of the number of linearly
% independent rows or columns of a matrix A.
% RANK(A,tol) is the number of singular values of A
% that are larger than tol.
% RANK(A) uses the default tol = max(size(A)) * norm(A) * eps.
s = svd(A)
if nargin==1
tol = max(size(A)') * max(s) * eps;
end
r = sum(s > tol);
        函数的第一行以关键字 function 开头。它提供函数名称和参数顺序。本示例中具有两个输入参数和一个输出参数。第一个空行或可执行代码行前面的后续几个行是提供帮助文本的注释行。当键入以下命令时,会输出这些行
help rank
        帮助文本的第一行是 H1 行,当对文件夹使用 lookfor 命令或请求 help 时,MATLAB 会显示此行。文件的其余部分是用于定义函数的可执行 MATLAB 代码。函数体中引入的变量 s 以及第一行中的变量(即r A tol )均为函数的局部变量;他们不同于 MATLAB 工作区中的任何变量。
本示例演示了 MATLAB 函数不同于其他编程语言函数的一个方面,即可变数目的参数。可以采用多种不同方法使用 rank 函数:
rank(A)
r = rank(A)
r = rank(A,1.e-6)
        许多函数都按此方式运行。如果未提供输出参数,结果会存储在 ans 中。如果未提供第二个输入参数,此函数会运用默认值进行计算。函数体中提供了两个名为 nargin nargout 的数量,用于告知与函数的每次特定使用相关的输入和输出参数的数目。 rank 函数使用 nargin ,而不需要使用 nargout

4.函数类型

        MATLAB 提供了多种不同函数用于编程。

4.1匿名函数

        匿名函数是一种简单形式的 MATLAB 函数,该函数在一个 MATLAB 语句中定义。它包含一个 MATLAB表达式和任意数目的输入和输出参数。您可以直接在 MATLAB 命令行中定义匿名函数,也可以在函数或脚本中定义匿名函数。这样,您可以快速创建简单函数,而不必每次为函数创建文件。根据表达式创建匿名函数的语法为
f = @(arglist)expression
        下面的语句创建一个求某个数字的平方的匿名函数。当调用此函数时,MATLAB 会将您传入的值赋值给变量 x ,然后在方程 x.^2 中使用 x
sqr = @(x) x.^2;
        要执行 sqr 函数,请键入
a = sqr(5)
a =
25

4.2主函数和局部函数

        任何非匿名函数必须在文件中定义。每个此类函数文件都包含一个必需的主函数(最先显示)和任意数目的局部函数(位于主函数后面)。主函数的作用域比局部函数更广。因此,主函数可以从定义这些函数的文件外(例如,从 MATLAB 命令行或从其他文件的函数中)调用,而局部函数则没有此功能。局部函数仅对其自己的文件中的主函数和其他局部函数可见。

4.3私有函数

        私有函数是一种主函数。其特有的特征是:仅对一组有限的其他函数可见。如果您希望限制对某个函数的访问,或者当您选择不公开某个函数的实现时,此种函数非常有用。私有函数位于带专有名称 private 的子文件夹中。它们是仅可在母文件夹中可见的函数。例如,假定文件夹 newmath 位于 MATLAB 搜索路径中。 newmath 的名为 private 子文件夹可包含只能供 newmath
中的函数调用的特定函数。
        由于私有函数在父文件夹外部不可见,因此可以使用与其他文件夹中的函数相同的名称。如果您希望创建您自己的特定函数的版本,并在其他文件夹中保留原始函数,此功能非常有用。由于 MATLAB 在标准函数之前搜索私有函数,因此在查找名为 test.m 的非私有文件之前,它将查找名为 test.m 的私有函数。

4.4嵌套函数

        您可以在函数体中定义其他函数。这些函数称为外部函数中的嵌套函数。嵌套函数包含任何其他函数的任何或所有组成部分。在本示例中,函数 B 嵌套在函数 A 中:
function x = A(p1, p2)
...
B(p2)
function y = B(p3)
...
end
...
end
        与其他函数一样,嵌套函数具有其自己的工作区,可用于存储函数所使用的变量。但是,它还可以访问其嵌套在的所有函数的工作区。因此,举例来说,主函数赋值的变量可以由嵌套在主函数中的任意级别的函数读取或覆盖。类似地,嵌套函数中赋值的变量可以由包含该函数的任何函数读取或被覆盖。

5全局变量

        如果您想要多个函数共享一个变量副本,只需在所有函数中将此变量声明为 global。如果您想要基础工作区访问此变量,请在命令行中执行相同操作。全局声明必须在函数中实际使用变量之前进行。全局变量名称使用大写字母有助于将其与其他变量区分开来,但这不是必需的。例如,在名为 falling.m 的文件创建一个新函数:
function h = falling(t)
global GRAVITY
h = 1/2*GRAVITY*t.^2;
        然后,以交互方式输入语句
global GRAVITY
GRAVITY = 32;
y = falling((0:.1:5)');
        通过上述两条全局语句,可以在函数内使用在命令提示符下赋值给 GRAVITY 的值。然后,您可以按交互方式修改 GRAVITY 并获取新解,而不必编辑任何文件。

6命令与函数语法

        您可以编写接受字符参数的 MATLAB 函数,而不必使用括号和引号。也就是说,MATLAB 将
foo a b c解释为foo('a','b','c')
        但是,当使用不带引号的命令格式时,MATLAB 无法返回输出参数。例如,
legend apples oranges
        使用 apples oranges 作为标签在绘图上创建图例。如果您想要 legend 命令返回其输出参数,必须使用带引号的格式:
[legh,objh] = legend('apples','oranges');
        此外,如果其中任一参数不是字符向量,必须使用带引号的格式。小心 虽然不带引号的命令语法非常方便,但在某些情况下可能会出现使用不当的情形,而 MATLAB 并不会产生错误信息。

6.1在代码中构造字符参数

        带引号的函数格式可用于在代码中构造字符参数。下面的示例处理多个数据文件,即 August1.datAugust2.dat 等。它使用函数 int2str ,该函数将整数转换为字符以便生成文件名:
for d = 1:31
s = ['August' int2str(d) '.dat'];
load(s)
% Code to process the contents of the d-th file
end

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

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

相关文章

Swintransformer模型的优化

SwinTransformer模型优化 文章目录 SwinTransformer模型优化1.SwinTransformer概述2.性能瓶颈分析3.模型优化3.1.transpose消除3.2.更好的layergroup3.1.1.SliceOp3.1.2.SqueezeOp3.1.3.weight切分 4.优化效果 1.SwinTransformer概述 自从Transformer在NLP任务上取得突破性的进…

HikariDataSource类的作用和使用

HikariDataSource是一个Java数据库连接池的实现,它属于HikariCP连接池库。连接池是一个用于管理数据库连接的工具,它可以帮助优化数据库连接的创建和销毁过程,提高数据库操作的性能和效率。 HikariDataSource类的作用是创建和管理数据库连接…

为什么要选择文件传输软件?有哪些最佳高速文件传输软件?

是否经历过这样的场景,正在努力地完成工作任务,但是由于制作的数据无法及时传送给合作伙伴,工作流程被打断了?这听起来很令人沮丧,对吧?可是,这种情况在现实中并不罕见。 因此,需要…

微服务与Nacos概述

微服务概述 软件架构的演变:单体架构、垂直应用架构、流式计算架构 SOA、微服务架构和服务网格。 微服务是一种软件开发架构,它将一个大型应用程序拆分为一系列小型、独立的服务。每个服务都可以独立开发、部署和扩展,并通过轻量级的通信机…

C++ 派生类成员的标识与访问——虚基类及其派生类构造函数

虚基类的使用非常方便,简单,这是由于程序中所有类使用的都是自动生成的默认构造函数。如果虚基类声明有非默认的(即带参的)构造函数,并且没有声明默认形式的构造函数。这时,在整个继承关系中,直…

1 swagger简单案例

1.1 加入依赖 <!--swagger图形化接口--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency><dependency><groupId>io.spri…

通过Idea部署Tomcat服务器(详细图文教学)

1.在idea中创建项目 有maven构建工具就创建maven&#xff0c;没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意&#xff1a;创建web项目后我们需要配置tomcat才能运行&#xff0c;下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

·[K8S:使用calico网络插件]:解决集群节点NotReady问题

文章目录 一&#xff1a;安装calico&#xff1a;1.1&#xff1a;weget安装Colico网络通信插件&#xff1a;1.2&#xff1a;修改calico.yaml网卡相关配置&#xff1a;1.2.1&#xff1a;查看本机ip 网卡相关信息&#xff1a;1.2.2&#xff1a;修改calico.yaml网卡interface相关信…

TEC半导体热电冷却技术在高速电主轴热变形补偿中的应用

摘要&#xff1a;电主轴Z向热变形是影响高速数控机床加工精度的主要因素&#xff0c;目前常用的补偿技术是流体介质形式的液冷和风冷&#xff0c;也出现了基于帕尔贴原理的TEC半导体冷却技术。目前TEC冷却技术在电主轴热变形补偿中存在的主要问题是无法对主轴热变形量进行直接调…

LeetCode 热题 100 JavaScript--142. 环形链表 II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数…

【Redis】项目使用redis做缓存除了击穿穿透雪崩我们还要考虑哪些?

文章目录 前言高并发写高并发读总结 前言 相信大家在项目中都是用过redis&#xff0c;比如用来做一个分布式缓存来提高程序的性能。 当使用到了redis来做缓存&#xff0c;那么我们就必须要考虑几个问题&#xff0c;除了缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩&…

【Linux命令详解 | cat命令】用于显示或连接文件

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 显示文件内容2. 创建文件3. 连接文件4. 显示行号5. 压缩空行6. 显示特殊字符7. 显示行号和特殊字符8. 从标准输入读取9. 显示文件开头或结尾10. 备份文件11. 显示文件内容至多屏幕大小12. 转义正则表达式13. 显示…

集成学习:机器学习模型如何“博采众长”

前置概念 偏差 指模型的预测值与真实值之间的差异&#xff0c;它反映了模型的拟合能力。 方差 指模型在不同的训练集上产生的预测结果的差异&#xff0c;它反映了模型的稳定性。 方差和偏差对预测结果所造成的影响 在机器学习中&#xff0c;我们通常希望模型的偏差和方差都…

ffmpeg源码编译成功,但是引用生成的静态库(.a)报错,报错位置在xxx_list.c,报错信息为某变量未定义

背景&#xff1a;本文是对上一个文章的补充&#xff0c;在源码编译之前&#xff0c;项目是有完整的ffmpeg编译脚本的&#xff0c;只不过新增了断点调试ffmpeg&#xff0c;所以产生的上面的文章&#xff0c;也就是说&#xff0c;我在用make编译成功后&#xff0c;再去做的源码编…

快速上手React:从概述到组件与事件处理

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

3.4 网络安全管理设备

数据参考&#xff1a;CISP官方 目录 IDS (入侵检测系统)网络安全审计漏洞扫描系统VPN&#xff08;虚拟专网&#xff09;堡垒主机安全管理平台 一、IDS (入侵检测系统) 入侵检测系统&#xff08;IDS&#xff09;是一种网络安全设备&#xff0c;用于监测和检测网络中的入侵行…

OLTP和OLAP的区别以及使用场景

1、什么是OLTP&#xff1f; 全称OnLine Transaction Processing&#xff0c;联机事务处理系统&#xff0c;就是对数据的增删改查等操作 存储的是业务数据&#xff0c;来记录某类业务事件的发生&#xff0c;比如下单、支付、注册等 典型代表有Mysql、Oracle等数据库&#xff…

微服务 云原生:基于 Gogs + Drone 进行项目 CI/CD

传统构建部署 以一个简单的前后端项目来说&#xff0c;分别编写前后端的 Dockerfile 文件并构建镜像&#xff0c;然后编写 docker-compose.yml 构建部署&#xff0c;启动运行。 一个简单的例子&#xff1a; 前端&#xff1a; 项目名&#xff1a;kubemanagement-web技术栈&am…

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块10

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…