MATLAB基础:函数与函数控制语句

ops/2024/9/23 9:35:41/

今天我们继续学习Matlab中函数相关知识。

API的查询和调用

help 命令是最基本的查询方法,可查询所有目录、指定目录、命令、函数。

我们直接点击帮助菜单即可查询所需的API函数。

lookfor 关键字用于搜索相关的命令和函数。

如,我们输入lookfor input,MATLAB就会显示所有关于input的API函数

type M 文件名用于显示文件代码。

如果想显示以.m扩展名结尾的就要加通配符

type *.m

which M 文件名用于显示指定文件的路径。

返回一个路径

demo 用于演示matlab功能。

如图,我们可以获取各种演示代码来解决实际问题

数据的输入和输出

input函数

输入函数

A=input('提示文字',数据类型);

str = input('请输入一段文字: ', 's');

 's' 表示用户输入的是字符串。如果没有 's',MATLAB 默认期望用户输入的是数字或数组。

disp函数
disp(X)
  • X 可以是一个字符串、数字、数组、结构体或单元数组。
  • disp 函数会自动添加一个换行符,因此不需要在字符串末尾添加 \n 来换行。
  • 如果 disp 用于显示一个变量,它不会显示变量名,只显示变量的值。
  • 与 fprintf 函数不同,disp 不会允许格式化输出。如果你需要更精细地控制输出格式,应该使用 fprintf

流程控制语句

分支语句包括

if(条件式),语句;
end;if(条件式1),语句1;
elseif(条件式2),语句2;…;
else,语句;
end;switch(分支变量)
case(值1),语句1;
case(值2),语句2;…;
otherwise 语句;
end

循环语句包括

for 循环变量=初值:增量:终值,
语句;
end;while(条件式),
语句;
end。

其他语句包括

pause,暂停执行,直到用户按任意键继续

pause(seconds),暂停执行几秒后继续

break,跳出当前循环

return,结束函数执行并返回一个值

error,error函数用于终止当前函数的执行并返回到调用函数,或者如果error在脚本中使用,则终止脚本的执行。使用error时,可以提供一个错误消息来描述发生了什么问题。

error('This is an error message');

脚本文件与函数文件

主要区别有:

  1. M脚本文档没有参数传递功能;函数文件具有参数传递功能。
  2. M脚本文档中的变量是全局的,在命令窗口也可用;函数文件中的变量是局部的。

脚本文件相当于一段写好的代码可以随时调用,省去了很多麻烦

在调用脚本文件时,直接在命令窗口中输入文件名即可

函数文件则相当于一个函数,调用时需要传参

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

例:

函数定义

function area = calculateCircleArea(radius)% calculateCircleArea 计算圆的面积% 输入参数:%   radius - 圆的半径% 输出参数:%   area - 圆的面积% 声明PI常量PI = 3.141592653589793;% 计算面积area = PI * radius^2;
end

函数调用

​​[输出参数] = 函数文件名(输入参数1, 输入参数2, ..., 输入参数N)S=calculateCircleArea(23)

注意:MATLAB调用函数文件时只认函数文件名,不认函数名,所以要保持函数文件名与函数名的统一以防止调用失败

函数句柄与匿名函数

函数句柄

用@作为取地址符将函数作为值赋给变量

首先,我们定义一个简单的函数

function result = square(x)result = x^2;
end

接下来,我们可以使用 @ 符号来创建一个指向 square 函数的句柄:

% 创建函数句柄
fHandle = @square;

现在 fHandle 是一个指向 square 函数的句柄。我们可以使用这个句柄来调用函数,并传入参数:

% 使用函数句柄调用函数
num = 5;
squaredNum = fHandle(num);  % 这将计算 5 的平方
disp(squaredNum);  % 显示结果

使用函数句柄的好处是,它可以像变量一样传递,使得函数调用更加灵活。例如,你可以将函数句柄传递给其他函数,或者存储在一个数组中,稍后调用。

feval函数
feval(fun, arg1, arg2, ..., argN)

其中fun是要调用的函数的名称(字符串或函数句柄),arg1, arg2, ..., argN是传递给该函数的参数。

用处:

使用字符串调用函数

% 调用 'sin' 函数
result = feval('sin', pi/2);
disp(result);  % 显示结果,应该是 1

使用函数句柄调用函数

​% 创建函数句柄
fHandle = @sin;% 使用 feval 和函数句柄调用函数
result = feval(fHandle, pi/2);
disp(result);  % 显示结果,应该是 1

注意事项

  • 当函数名称是字符串时,feval非常有用。如果你已经有了函数的句柄,直接调用通常更简单,例如result = fHandle(pi/2);
  • 在MATLAB的新版本中,feval已经不推荐使用,推荐的做法是直接使用函数句柄或者使用str2func将字符串转换为函数句柄,然后进行调用。

使用str2func替代feval

如果你有一个函数的名称作为字符串,并且想要调用这个函数,可以使用str2func来将字符串转换为函数句柄,然后直接调用该函数:

​% 将字符串转换为函数句柄
fHandle = str2func('sin');% 使用函数句柄调用函数
result = fHandle(pi/2);
disp(result);  % 显示结果,应该是 1​

这种用法比使用feval更符合现代MATLAB的编码风格。

eval函数

 基本语法

eval(expression)

其中 expression 是一个包含 MATLAB 表达式、语句或函数调用的字符串。

示例

执行表达式

% 定义一个字符串,其中包含 MATLAB 表达式
str = 'a = 5; b = 10;';% 使用 eval 执行字符串中的表达式
eval(str);% 显示结果
disp(['a = ', num2str(a)]);
disp(['b = ', num2str(b)]);

在上面的示例中,eval 会执行字符串 str 中的语句,从而定义了变量 a 和 b

调用函数

% 定义一个字符串,其中包含对函数的调用
str = 'disp(''Hello, World!'')';% 使用 eval 执行字符串中的函数调用
eval(str);

在这个例子中,eval 执行了字符串 str 中的 disp 函数调用,输出了 “Hello, World!”。

注意事项

  • eval 应该谨慎使用,因为它会执行字符串中的任何代码,包括可能有害的代码。
  • 使用 eval 可能会影响代码的性能,因为它需要解析和执行字符串中的代码。
  • 在可能的情况下,使用函数句柄、匿名函数或其他编程结构来避免 eval 是更好的做法。

匿名函数 

匿名函数是MATLAB中一种创建简单函数的便捷方式,无需为其编写单独的函数文件。匿名函数可以定义在一个变量中,并且通常在单个表达式中使用。它们非常适合快速定义简单的操作或作为回调函数传递给其他函数。

基本语法

functionVariable = @(inputVariables) expression
  • functionVariable:存储匿名函数的变量名。
  • @:匿名函数的创建运算符。
  • inputVariables:匿名函数的输入参数,可以是单个变量或多个变量。
  • expression:使用输入参数计算的结果表达式。

创建一个计算两个数之和的匿名函数:

add = @(x, y) x + y;
result = add(3, 4);  % 计算 3 和 4 的和
disp(result);  % 显示结果:7
 arrayfun 与 cellfun 函数

在MATLAB中,arrayfun 是一个非常有用的函数,它经常与匿名函数结合使用,允许你对数组中的每个元素应用一个函数,并返回结果数组。这对于需要对数组中的每个元素执行相同操作的情况非常有用。

基本语法

​B = arrayfun(func, A)
  • B:输出数组,其中包含对输入数组 A 中每个元素应用函数 func 后的结果。
  • func:一个函数句柄,它定义了要对输入数组 A 中每个元素执行的操作。
  • A:输入数组,可以是数值数组、元胞数组或结构体数组。

下面的例子使用 arrayfun 来计算一个数值数组中每个元素的平方:

A = 1:5;  % 创建一个行向量
B = arrayfun(@(x) x.^2, A);  % 对每个元素求平方
disp(B);  % 显示结果

cellfun函数与arrayfun函数类似,只不过处理值、返回值为一个元胞数组。

函数重载

在MATLAB中,函数重载是通过编写多个同名函数,每个函数处理不同的情况来实现的。这种方式使得代码更加灵活,可以根据不同的输入情况执行不同的操作。

基于参数数量重载

1、重写函数

function result = myfunc(a)result = a^2;
endfunction result = myfunc(a, b)result = a^2 + b^2;
end

2、使用nargin与nargout

nargin:记录调用函数时输入变量个数;
nargout:记录调用函数时输出变量的个数。

示例:

function [f1, f2] = exam_arg(a, b, c)if nargin == 1f1 = a;elseif nargin == 2f1 = (a + b)/2;elseif nargin == 3f1 = (a + b + c)/3;endif nargout == 0error('没有输出参数。');elseif nargout == 2f2 = '计算平均值';end
end

根据参数类型重载

function result = myfunc(a)if ischar(a)result = 'String: ' + a;elseif isnumeric(a)result = a^2;elseerror('Unsupported type');end
end

注意事项 

  • MATLAB中的函数重载不是传统意义上的重载,因为它不支持基于参数类型的重载,而是通过参数数量和varargin(可变数量输入参数)来实现类似的功能。
  • 当调用一个函数时,MATLAB会根据提供的参数数量和类型来选择最合适的函数实现。
  • 使用isa函数或class函数可以在函数内部检查参数的类型。
  • 如果没有找到匹配的函数实现,MATLAB将抛出一个错误。

今天就学习到这里,我们明天继续学习MATLAB。


http://www.ppmy.cn/ops/86627.html

相关文章

MATLAB R2017a 安装与破解 ​编辑

转载自 https://www.cnblogs.com/chaofn/p/8323852.html 第一步: 到我的百度网盘下载MatlAB2017a的原安装程序和破解补丁: 链接:百度网盘 请输入提取码 提取密码: d59m 第二步: 下载的两个iso文件:R2…

DHCP笔记

DHCP---动态主机配置协议 作用:为终端动态提供IP地址,子网掩码,网关,DNS网址等信息 具体流程 报文抓包 在DHCP服务器分配iP地址之间会进行广播发送arp报文,接收IP地址的设备也会发送,防止其他设备已经使用…

《数据结构与算法之美》学习笔记三之链表

前言:先回顾一下本系列上一篇文章的大致内容 二叉树 1、二叉树的分类:满二叉树(所有节点都是满满的)、完全二叉树(只有最后一层不满,且最后一层节点都在左边)、二叉搜索树(有顺序)、平衡二叉树(左右子树高度差不超过1或者一棵空树) 2、二叉树…

“八股文”:程序员的福音还是梦魇?

——一场关于面试题的“代码战争” 在程序员的世界里,“八股文”这个词儿可谓是“如雷贯耳”。不,咱们可不是说古代科举考试中的那种八股文,而是指程序员面试中的那些固定套路的题目。如今,各大中小企业在招聘程序员时&#xff0…

137.只出现一次的数字Ⅱ

1.题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1: 输入:nums …

Linux服务器单个大文件上传内存限制修改

/etc/apache2/apache2.conf 添加: <Directory /var/www/html> LimitRequestBody 0 </Directory> /etc/php/7.4/apache2/php.ini 修改: upload_max_filesize 1000G post_max_size 1000G max_execution_time 0 max_input_time 0 memory_limit -1 验证修…

从0开始学习c++01-软件下载和安装

哈喽大家好&#xff0c;我们又见面了&#xff0c;今天我来带大家一起来安装自已喜欢的编辑软件&#xff0c;但是如果你就想用txt来写那就当我没说。 我推荐大家使用dev-c或者vscode&#xff0c;因为他空间小功能却不小&#xff0c;dev-c可以直接在网上搜索下载&#xff0c;点我…

090、Python 写Excel文件及一些操作(使用xlwt库)

要写Excel文件&#xff0c;我们需要使用第三方库。 xlwt库是一个常用的写Excel的第三方库&#xff0c;它同时支持.xls和.xlsx。 要使用第三方库&#xff0c;首选需安装&#xff1a; pip install xlwt xlutils安装完成后&#xff0c;我们就可以引入库来进行相关操作了。 使用…