百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

MATLAB快速入门官方说明——25.脚本和函数

bigegpt 2024-10-12 05:52 6 浏览

脚本和函数

概述

MATLAB? 产品提供了一个强大的编程语言和交互式计算环境。您可以使用此语言在 MATLAB 命令行中一次输入一个命令,也可以向某个文件写入一系列命令,按照执行任何 MATLAB 函数的相同方式来执行这些命令。使用 MATLAB 编辑器或任何其他文件编辑器可以创建您自己的函数文件。按照调用任何其他 MATLAB 函数或命令的相同方式来调用这些函数。

两种程序文件:

  • 脚本,不接受输入参数或返回输出参数。它们处理工作区中的数据。

  • 函数,可接受输入参数,并返回输出参数。内部变量是函数的局部变量。

如果您是新 MATLAB 程序员,您只需在当前文件夹中创建您希望尝试的程序文件。当您创建的文件越来越多时,您可能希望将这些文件组织到其他文件夹和个人工具箱,以便将其添加到您的 MATLAB 搜索路径中。

如果您复制多个函数名称,MATLAB 会执行在搜索路径中显示的第一个函数。

要查看程序文件(例如,myfunction.m)的内容,请使用

type myfunction

脚本

当调用脚本时,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
r
bar(r)

键入语句

magicrank

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

函数

函数是可接受输入参数并返回输出参数的文件。文件名和函数名称应当相同。函数处理其自己的工作区中的变量,此工作区不同于您在 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 以及第一行中的变量(即 rAtol)均为函数的局部变量;他们不同于 MATLAB 工作区中的任何变量。

本示例演示了 MATLAB 函数不同于其他编程语言函数的一个方面,即可变数目的参数。可以采用多种不同方法使用 rank 函数:

rank(A)
r = rank(A)
r = rank(A,1.e-6)

许多函数都按此方式运行。如果未提供输出参数,结果会存储在 ans 中。如果未提供第二个输入参数,此函数会运用默认值进行计算。函数体中提供了两个名为 narginnargout 的数量,用于告知与函数的每次特定使用相关的输入和输出参数的数目。rank 函数使用 nargin,而不需要使用 nargout

函数类型

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

匿名函数

匿名函数是一种简单形式的 MATLAB 函数,该函数在一个 MATLAB 语句中定义。它包含一个 MATLAB 表达式和任意数目的输入和输出参数。您可以直接在 MATLAB 命令行中定义匿名函数,也可以在函数或脚本中定义匿名函数。这样,您可以快速创建简单函数,而不必每次为函数创建文件。

根据表达式创建匿名函数的语法为

f = @(arglist)expression

下面的语句创建一个求某个数字的平方的匿名函数。当调用此函数时,MATLAB 会将您传入的值赋值给变量 x,然后在方程 x.^2中使用 x

sqr = @(x) x.^2;

要执行上面定义的 sqr 函数,请键入

a = sqr(5)
a =
25

主函数和子函数

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

函数部分中显示的 rank 函数就是一个主函数的示例。

私有函数

私有函数是一种主函数。其特有的特征是:仅对一组有限的其他函数可见。如果您希望限制对某个函数的访问,或者当您选择不公开某个函数的实现时,此种函数非常有用。

私有函数位于带专有名称 private 的子文件夹中。它们是仅可在母文件夹中可见的函数。例如,假定文件夹 newmath 位于 MATLAB 搜索路径中。newmath 的名为 private 子文件夹可包含只能供 newmath 中的函数调用的特定函数。

由于私有函数在父文件夹外部不可见,因此可以使用与其他文件夹中的函数相同的名称。如果您希望创建您自己的特定函数的版本,并在其他文件夹中保留原始函数,此功能非常有用。由于 MATLAB 在标准函数之前搜索私有函数,因此在查找名为 test.m的非私有文件之前,它将查找名为 test.m 的私有函数。

嵌套函数

您可以在函数体中定义其他函数。这些函数称为外部函数中的嵌套函数。嵌套函数包含任何其他函数的任何或所有组成部分。在本示例中,函数 B 嵌套在函数 A 中:

function x = A(p1, p2)
...
B(p2)
function y = B(p3)
...
end
...
end

与其他函数一样,嵌套函数具有其自己的工作区,可用于存储函数所使用的变量。但是,它还可以访问其嵌套在的所有函数的工作区。因此,举例来说,主函数赋值的变量可以由嵌套在主函数中的任意级别的函数读取或被覆盖。类似地,嵌套函数中赋值的变量可以由包含该函数的任何函数读取或被覆盖。

全局变量

如果您想要多个函数共享一个变量副本,只需在所有函数中将此变量声明为 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 并获取新解,而不必编辑任何文件。

命令与函数语法

您可以编写接受字符参数的 MATLAB 函数,而不必使用括号和引号。也就是说,MATLAB 将

foo a b c

解释为

foo('a','b','c')

但是,当使用不带引号的命令格式时,MATLAB 无法返回输出参数。例如,

legend apples oranges

使用 applesoranges 作为标签在绘图上创建图例。如果您想要 legend 命令返回其输出参数,必须使用带引号的格式:

[legh,objh] = legend('apples','oranges');

此外,如果其中任一参数不是字符向量,必须使用带引号的格式。

小心

虽然不带引号的命令语法非常方便,但在某些情况下可能会出现使用不当的情形,而 MATLAB 并不会产生错误信息。

在代码中构造字符参数

带引号的函数格式可用于在代码中构造字符参数。下面的示例处理多个数据文件,即 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

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...