MATLAB学习文档(十七)

目录

第9章:函数

9.1 使用 function 关键字来创建函数

9.1.1 函数的例子和功能

简单输出函数

计算两个数的和与差

MATLAB内置函数调用

函数调用的特殊情况与灵活性

输入参数的灵活性

输出值的灵活性

查看内置函数源代码

type 函数名(如type rgb2gray)

type 函数名.m(如type rgb2gray.m)

使用编辑器打开对应的.m文件

内置函数的优势

9.1.2 函数的创建和运行

使用function关键字创建函数的语法

创建、保存和调用第一个自定义函数

创建步骤

示例

调用方法

形式参数和实际参数(形参和实参)

形式参数(形参)

实际参数(实参)

重要区别

函数工作的本质(基础和函数工作区)

基础工作区(Base Workspace)

函数工作区(Function Workspace)

工作区特点

使用断点调试功能揭示函数的工作过程

断点调试步骤

使用调试工具栏按钮控制执行流程

调试示例

在自定义函数中调用另一个自定义函数

return关键字:将控制权交还给调用脚本或函数

使用场景

示例

使用global关键字声明全局变量

语法

使用规则

示例

使用persistent关键字声明持久变量

语法

特点

示例

常见错误场景

函数名与文件名不匹配

函数路径问题

输入输出参数数量不匹配

变量作用域混淆

函数递归调用导致栈溢出

使用dbstop if error进行错误调试

基本用法

调试流程

示例

9.1.3 函数的高级用法

函数高级用法总结表

实时函数

局部函数

示例

嵌套函数

示例

可变数量的输入参数或输出值

nargin和nargout

Varargin

Varargout

narginchk和nargoutchk

arguments代码块

递归函数

示例(计算阶乘)


第9章:函数

9.1 使用 function 关键字来创建函数

在数学中,函数是一种将输入值映射到输出值的关系;

在计算机中,函数是一段可重复使用的代码块,用于执行特定任务并返回结果。

函数的主要作用是提高代码的模块化程度、减少重复代码、增强程序的可读性和可维护性。

9.1.1 函数的例子和功能

函数类别

函数名

功能描述

数学运算

abs(z)

求复数z的模,或字符串转ASCII

数学运算

factorial(n)

计算n的阶乘

数学运算

nchoosek(n,k)

计算组合数C(n,k)

逻辑判断

all(A)

若向量A的所有元素非零则结果为1

方程求解

solve

求解方程,得到全部符号解

方程求解

vpasolve

求解方程的数值近似解

方程求解

fsolve

求解非线性方程组

方程求解

fzero

求解一维函数的零点

方程求解

roots

求解多项式的根

简单输出函数
function hello()disp('Hello, MATLAB!');end

可以直接调用:hello()

计算两个数的和与差
function [sum, diff] = calculate(a, b)sum = a + b;diff = a - b;end

调用方式:[s, d] = calculate(10, 5)

MATLAB内置函数调用

MATLAB提供了丰富的内置函数,可以直接调用使用。

例如:

  • abs(z): 求复数z的模,也可将字符串转化为ASCII值
  • all(A): 若向量A的所有元素非零则结果为1
  • nchoosek(n,k): 求组合数C(n,k)
  • factorial(n): 求n的阶乘
函数调用的特殊情况与灵活性
输入参数的灵活性
  1. 可以定义具有默认值的参数
  2. 可以使用varargin处理可变数量的输入参数
  3. 可以根据输入参数的类型和数量执行不同的操作
输出值的灵活性
  1. 函数可以有多个输出值,如[sum, diff] = calculate(a, b)
  2. 如果调用函数时不指定输出变量,结果将存储在默认变量ans中
  3. 可以使用varargout处理可变数量的输出参数
查看内置函数源代码
type 函数名(如type rgb2gray)
type 函数名.m(如type rgb2gray.m)
使用编辑器打开对应的.m文件
内置函数的优势
  1. 经过优化,执行效率高
  2. 代码经过严格测试,可靠性高
  3. 提供了丰富的功能,覆盖科学计算的各个方面
  4. 与MATLAB环境无缝集成,使用方便

9.1.2 函数的创建和运行

知识点

语法/方法

说明

示例

函数定义

function [输出] = 函数名(输入)

使用function关键字定义函数

function area = circleArea(r)

函数调用

变量 = 函数名(参数)

调用已定义的函数

a = circleArea(5);

形参和实参

-

形参是函数定义中的参数,实参是调用时传入的值

function area = circleArea(radius)radius是形参,circleArea(5)5是实参

断点设置

点击行号左侧或使用dbstop

在代码中设置断点进行调试

dbstop in circleArea at 3

return语句

return

提前终止函数执行

if x < 0; return; end

全局变量

global 变量名

声明可在多个函数间共享的变量

global counter;

持久变量

persistent 变量名

声明在函数调用间保持值的变量

persistent callCount;

错误调试

dbstop if error

在错误发生时自动进入调试模式

dbstop if error

使用function关键字创建函数的语法
function [输出参数1, 输出参数2, ...] = 函数名(输入参数1, 输入参数2, ...)% 函数说明注释% 函数体% 执行特定任务的代码end
创建、保存和调用第一个自定义函数
创建步骤
  1. 在MATLAB编辑器中新建一个.m文件
  2. 使用function关键字定义函数
  3. 将文件保存为与函数名相同的名称(例如函数名为myFunction,则文件应保存为myFunction.m)
示例

创建一个计算圆面积的函数

function area = circleArea(radius)% 计算圆的面积% 输入:radius - 圆的半径% 输出:area - 圆的面积area = pi * radius^2;end
调用方法
% 在命令窗口或其他脚本中调用r = 5;a = circleArea(r);  % a将得到圆的面积disp(['半径为', num2str(r), '的圆的面积是:', num2str(a)]);
形式参数和实际参数(形参和实参)
形式参数(形参)

函数定义中使用的参数,如上面例子中的radius

实际参数(实参)

调用函数时传入的实际值,如上面例子中的r

重要区别
  1. 形参只在函数内部有效,是函数的局部变量
  2. 实参是调用函数时提供的具体值或变量
  3. 函数调用时,实参的值会传递给对应的形参
函数工作的本质(基础和函数工作区)
基础工作区(Base Workspace)

MATLAB命令行和脚本所在的工作区

函数工作区(Function Workspace)

每个函数独立的工作区

工作区特点
  1. 函数工作区与基础工作区是隔离的
  2. 函数内部定义的变量只在函数内部有效
  3. 函数不能直接访问其他工作区的变量(除非使用global或persistent关键字)
  4. 函数调用结束后,其工作区中的变量会被销毁
使用断点调试功能揭示函数的工作过程
断点调试步骤
  1. 在MATLAB编辑器中,点击代码行号左侧设置断点(红色圆点)
  2. 运行函数
  3. 程序执行到断点处会暂停
使用调试工具栏按钮控制执行流程
  1. Continue:继续执行到下一个断点或程序结束
  2. Step:单步执行(进入函数)
  3. Step In:进入函数内部
  4. Step Out:跳出当前函数
调试示例
function [sum, product] = calculate(a, b)% 设置断点在这一行sum = a + b;      % 断点1product = a * b;  % 断点2end

通过断点可以观察变量值的变化,理解函数执行过程。

在自定义函数中调用另一个自定义函数
function result = computeStatistics(data)% 主函数:计算数据的统计信息% 调用其他自定义函数avg = calculateAverage(data);med = calculateMedian(data);result = struct('average', avg, 'median', med);endfunction avg = calculateAverage(data)% 计算平均值avg = sum(data) / length(data);endfunction med = calculateMedian(data)% 计算中位数sortedData = sort(data);n = length(sortedData);if mod(n, 2) == 0med = (sortedData(n/2) + sortedData(n/2 + 1)) / 2;elsemed = sortedData((n + 1) / 2);endend
return关键字:将控制权交还给调用脚本或函数

return关键字用于提前终止函数执行,并将控制权返回给调用者。

使用场景
  • 满足特定条件时提前退出函数
  • 错误处理
示例
function result = checkPositive(num)% 检查数字是否为正数if num <= 0disp('输入不是正数');result = [];return;  % 提前退出函数endresult = num;disp(['输入是正数: ', num2str(num)]);end
使用global关键字声明全局变量

全局变量可以在多个函数和基础工作区之间共享。

语法

global 变量名1 变量名2 ...

使用规则
  1. 在每个需要访问全局变量的函数中,都必须使用global关键字声明
  2. 全局变量在程序运行期间一直存在
  3. 应谨慎使用全局变量,以免造成代码混乱
示例
function setGlobalValue(value)global globalVar;  % 声明全局变量globalVar = value;endfunction displayGlobalValue()global globalVar;  % 声明全局变量disp(['全局变量的值是: ', num2str(globalVar)]);end% 在命令窗口中setGlobalValue(42);displayGlobalValue();  % 显示: 全局变量的值是: 42
使用persistent关键字声明持久变量

持久变量类似于其他编程语言中的静态变量,它们在函数调用之间保持其值。

语法

persistent 变量名1 变量名2 ...

特点
  1. 持久变量只在声明它的函数内部可见
  2. 函数调用结束后,持久变量的值不会被清除
  3. 当MATLAB会话结束或清除函数时,持久变量才会被清除
  4. 持久变量只在第一次调用函数时初始化
示例
function counter = callCounter()persistent count;  % 声明持久变量% 第一次调用时初始化if isempty(count)count = 0;endcount = count + 1;counter = count;disp(['函数已调用次数: ', num2str(counter)]);end% 在命令窗口中多次调用callCounter();  % 显示: 函数已调用次数: 1callCounter();  % 显示: 函数已调用次数: 2callCounter();  % 显示: 函数已调用次数: 3
常见错误场景
函数名与文件名不匹配

错误:函数名为calculateArea,但文件保存为area.m

解决:确保文件名与函数名完全一致

函数路径问题

错误:函数文件不在MATLAB的搜索路径中

解决:使用addpath添加路径或将文件放在当前工作目录

输入输出参数数量不匹配

错误:函数定义需要2个输出参数,但调用时只提供1个

解决:检查函数定义和调用语句

变量作用域混淆

错误:试图在函数外部访问函数内部变量

解决:使用适当的参数传递或全局变量

函数递归调用导致栈溢出

错误:无限递归调用

解决:确保递归有终止条件

使用dbstop if error进行错误调试

dbstop if error是MATLAB中强大的调试工具,它可以在发生错误时自动暂停程序执行,进入调试模式。

基本用法
dbstop if error  % 在任何错误发生时停止dbstop if caught error  % 在被try-catch捕获的错误处停止dbstop if warning  % 在警告发生时停止dbstop if naninf  % 在NaN或Inf值产生时停止dbstop if error -identifier 特定错误ID  % 只在特定错误发生时停止
调试流程
  1. 在命令窗口输入dbstop if error
  2. 运行可能导致错误的代码
  3. 当错误发生时,MATLAB会自动暂停并进入调试模式
  4. 检查变量值,分析错误原因
  5. 使用调试命令逐步执行代码
  6. 找到并修复错误后,使用dbclear all清除所有断点
示例
% 假设有以下函数function result = divideNumbers(a, b)result = a / b;end% 在命令窗口中dbstop if error  % 设置错误断点divideNumbers(10, 0);  % 这将导致除以零错误,程序会自动暂停

当错误发生时,可以检查K>>提示符下的变量值,理解错误原因。

9.1.3 函数的高级用法

函数高级用法总结表

功能类型

说明

语法示例

特点

实时函数

用于实时数据分析的函数

function output = realTimeFunction(input)

可实时处理数据并即时输出结果

局部函数

同一文件中的辅助函数

function output = localFunction(input)

只能被同一文件中的其他函数调用

嵌套函数

定义在函数内部的函数

function parentFunction
  function nestedFunction
  end
end

可访问父函数工作区中的变量

可变输入参数

接受任意数量输入的函数

function output = varArgFunction(varargin)

使用varargin收集所有输入参数

可变输出参数

返回任意数量输出的函数

function varargout = varOutFunction(input)

使用varargout返回多个输出

参数验证

验证和限制函数参数

arguments
  x (1,1) double {mustBePositive}
end

R2019b起支持,可设置参数类型、大小和约束

递归函数

调用自身的函数

function result = fact(n)
  if n==1, result=1;
  else, result=n*fact(n-1);
  end

需要明确的停止条件

实时函数

实时函数是MATLAB中用于实现实时数据分析的工具,能够在程序运行过程中不断接收输入数据并即时输出结果,非常适用于需要实时更新的应用场景,如数据采集、信号处理等。

实时函数的创建与普通函数类似,但具有实时数据处理能力,可以在实时脚本中使用,提供动态更新的可视化效果。

局部函数

在MATLAB中,一个函数文件可以包含多个函数,其中第一个函数称为主函数,其他函数称为局部函数。

主函数可以被外部调用,而局部函数只能被同一文件中的其他函数调用,无法直接被外部调用。

示例
function mainFunction()% 主函数result = localFunction(5);disp(result);endfunction output = localFunction(input)% 局部函数output = input * 2;end
嵌套函数

嵌套函数是完全包含在父函数内部的函数,可以出现在函数体内的任何位置,以function声明,以end结束。

嵌套函数可以访问父函数工作区中的变量,这是它与局部函数的主要区别。

示例
function parentFunctionx = 10;function nestedFunction% 可以访问父函数的变量xdisp(['x的值是: ', num2str(x)]);endnestedFunction();end
可变数量的输入参数或输出值
nargin和nargout

用于获取函数输入和输出参数的数目

Varargin

可变长度输入参数列表,允许函数接受任意数量的输入参数

Varargout

可变长度的输出参数列表,允许函数返回任意数量的输出值

narginchk和nargoutchk

用于验证输入和输出参数数目

示例

function varargout = flexibleFunction(varargin)% 输入参数数量numInputs = nargin;disp(['输入参数数量: ', num2str(numInputs)]);% 处理输入参数for i = 1:numInputsdisp(['第', num2str(i), '个参数: ', num2str(varargin{i})]);end% 根据输入参数数量决定输出参数数量if nargout == 0% 无输出return;elseif nargout == 1% 单个输出varargout{1} = sum(cell2mat(varargin));else% 多个输出for i = 1:nargoutif i <= numInputsvarargout{i} = varargin{i} * 2;elsevarargout{i} = 0;endendendend
arguments代码块

参数声明或验证

自R2019b版本起,MATLAB引入了arguments代码块,用于函数参数的声明和验证。arguments对象表示函数的实参集合,仅在函数体内可见,并可以直接访问。

示例

function validatedFunction(x, y)argumentsx (1,1) double {mustBePositive, mustBeInteger} = 10;y (1,:) string = "default";end% 函数体disp(['x的值: ', num2str(x)]);disp(['y的值: ', y]);end
递归函数

递归是指在函数体内调用自身的编程技术。

在MATLAB中,递归函数的定义与其他编程语言类似,需要明确定义停止条件,否则可能导致无限递归和栈溢出。

示例(计算阶乘)
function result = factorial(n)% 停止条件if n == 0 || n == 1result = 1;else% 递归调用result = n * factorial(n-1);endend

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

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

相关文章

C++ QT, 改进这个类FrozenColumnHeader。当内容太长时,显示不全,需要鼠标悬浮显示。

头文件 frozencolumnheader.h&#xff1a;cpp#ifndef FROZENCOLUMNHEADER_H #define FROZENCOLUMNHEADER_H#include <QHeaderView> #include <QTableView> #include <QPainter> #include <QMouseEvent> #include <QStyleOptionHeader> #include …

SQL-约束

在 SQL 中&#xff0c;约束&#xff08;Constraint&#xff09;是用于限制表中数据的规则&#xff0c;目的是保证数据的完整性、一致性和有效性。常见的约束类型包括&#xff1a;主键约束、外键约束、非空约束、唯一约束、检查约束、默认值约束等。下面结合你提供的代码&#x…

kafka如何保证消息不被重复消费

首先kafka事务没办法做到这一点&#xff0c;事务只能保证以下几点&#xff1a;producer发送多条消息&#xff0c;要么同时成功&#xff0c;要么同时失败&#xff1b;在没有提交事务之前&#xff0c;消息对消费者不可见&#xff0c;事务失败需要程序员自己调用kafka的 abort 回滚…

[性能分析与优化]伪共享问题(perf + cpp)

伪共享问题的主要来源有两件事每次cache读入一个数据时实际上读入整个数据行多个线程可能会读入相同的数据行由于cache写回内存时也是按照数据行进行写入的&#xff0c;导致了写回内存时并不能做到真正的共享&#xff0c;而是需要等待。解决方案有两种将需要并行计算的数据使用…

【Uni-App+SSM 宠物项目实战】Day14:商家服务列表

一、前言 欢迎回到mypet项目实战!📋 今天我们实现商家服务管理核心功能——商家服务列表展示与上拉加载更多。商家成功注册并通过审核后,可发布宠物服务项目(如洗澡、美容、医疗等),用户通过服务列表浏览并预约。 本次实现的核心是**“分页加载”**技术:后端使用MyBa…

DNS服务管理

一、概述 概念 Domain Name Service&#xff0c;一套分布式的域名服务系统&#xff0c;即有多个DNS服务器遍布于世界。每个DNS服务器上存放着大量的机器域名和IP地址的映射&#xff0c;并且是动态更新。众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。 …

自定义类型:结构体、联合与枚举(2)

目录 前言 一、 联合体类型的声明 介绍&#xff1a; 注意&#xff1a; 二、 联合体的特点 介绍&#xff1a; 代码举例&#xff1a; 三、联合体⼤⼩的计算 介绍&#xff1a; 联合体大小的计算规则 1. 基础规则 1. 确定最大成员大小 2. 计算对齐模数的最小公倍数 3…

Oceanbase下使用TPC-H模式生成数据

1.下载tpc-h http://www.tpc.org/ 点击下载始终弹出这个画面&#xff0c;尝试了多种方法无效&#xff0c;最后选择科学上网工具&#xff0c;才正常下载。 通过网盘分享的文件&#xff1a;TPC-H-Toolv3.zip 链接: https://pan.baidu.com/s/14CXrp7v_7XkPtXfFLkziBQ?pwdqf5t 提…

LeetCode 面试经典 150_哈希表_单词规律(41_290_C++_简单)

LeetCode 面试经典 150_哈希表_单词规律&#xff08;41_290_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;哈希表&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;哈希表&a…

librespeed c++ 上传下载带宽测试 排坑全流程

在搭建 LibreSpeed 测速服务并实现基于 curl/API 的上传下载测试时&#xff0c;遇到 Nginx 配置冲突、PHP 权限异常等问题。本文将梳理从环境搭建到功能验证的全流程&#xff0c;针对 “curl 上传报 404/405”“PHP-FPM 权限拒绝”等典型问题&#xff0c;提供可复现的解决方案。…

重读生成概率模型1----基础概念

1 KL 散度 KL 散度的作为是描述两个分布的差异的&#xff0c;首先是度量一个分布&#xff0c;用熵来度量。 1.1 熵 在介绍熵之间&#xff0c;首先要度量单个事件的信息量 I(x)−logP(x)I(x)-logP(x)I(x)−logP(x) 整体的信息量 H(P)Ex P[−logP(x)]−∑P(x)logP(x) \begin{alig…

排查解决磁盘占用高问题(容器挂载的磁盘)

最近遇到磁盘占用高的告警&#xff0c;记录一下解决的思路。 首先是系统触发告警&#xff0c;通知我们某台机器磁盘占用高。&#xff08;或其他途径得知&#xff09; 通过XShell登录该机器。 执行df-h命令查看挂载占用情况找到真正占用高的挂载点挂载点/home目录占用高&#xf…

流体(1)

流体 Minecraft 中的流体(Fluid),也常被称为液体(Liquid),是一类能够自由流动、形成河流、瀑布或湖泊的特殊方块。它们的行为基于简化的流体力学,是游戏世界中动态环境的重要组成部分。 💧 流体是什么? 在 Minecraft 中,流体核心特点包括: 源方块与流动:每个流…

机器学习-卷积神经网络(CNN)

全连接层->卷积层 用有一个隐藏层的MLP训练ImageNet数据集&#xff08;300*300的图像&#xff0c;有1000个类别&#xff09;&#xff0c;要有10000个输出 会有10亿个可学习的参数&#xff0c;量太大 全连接&#xff1a;一个输出是根据所有输入加权得到在图片中识别物体&…

Ubuntu 磁盘扩容与扩容失败问题解决( df -h 与 GParted 显示空间不一致的问题 -LVM)

在管理 Linux 磁盘时&#xff0c;你是否遇到过这样的困惑&#xff1a;正常扩容之后&#xff0c;发现GParted 显示某个分区还有几十 GiB 可用&#xff0c;但 df -h 却提示该分区已接近满额&#xff1f;这种 “空间幻觉” 背后是系统存储管理的分层设计&#xff0c;本文将从原理到…

PyQt5中QLineEdit控件数值显示与小数位数控制

在PyQt5应用程序开发中&#xff0c;QLineEdit控件常用于显示和编辑文本内容。当需要用它来显示数值并控制小数位数时&#xff0c;开发者需要掌握一些特定的技巧。本文将深入探讨几种实现方法&#xff0c;每种方法都附带完整独立的代码示例。 数值格式化基础 在Python中&#xf…

LangChain使用方法以OpenAI 的聊天模型GPT-4o为例

以使用 OpenAI 的聊天模型&#xff08;如 GPT-4&#xff09;为例&#xff0c;从设置环境、初始化模型、调用模型到处理响应的各个方面进行介绍&#xff1a; 1. 环境设置 安装 langchain-openai 包。设置环境变量 OPENAI_API_KEY&#xff0c;用于认证&#xff08;以linux为例&am…

Oracle为数据大表创建索引方案

在日常业务中&#xff0c;避免不了为数据量大表补充创建索引的情况&#xff0c;如果快速、有效地创建索引成了一个至关重要的问题&#xff08;注意&#xff1a;虽然提供有ONLINE在线执行的方式&#xff0c;理想状态下不会阻塞DML操作&#xff0c;但ONLINE在开始、结束的两个时刻…

网站服务相关问题

目录 HTTP常见的状态码 http和https的区别以及使用的端口号 http处理请求的过程 https认证过程 正向代理和反向代理的区别 HTTP常见的状态码 HTTP&#xff08;超文本传输协议&#xff09;定义了一系列的状态码&#xff0c;用于表示客户端请求的处理结果。以下是一些常见的…

Go并发编程实战:深入理解Goroutine与Channel

Go并发编程实战&#xff1a;深入理解Goroutine与ChannelGo并发编程实战&#xff1a;深入理解Goroutine与Channel概述1. 为什么是Go的并发&#xff1f;从“线程”与“协程”说起2. Goroutine&#xff1a;如何使用&#xff1f;3. Channel&#xff1a;Goroutine间的安全通信创建与…