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

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

API的查询和调用

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

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

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

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

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

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

Matlab 复制代码
type *.m

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

返回一个路径

demo 用于演示matlab功能。

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

数据的输入和输出

input函数

输入函数

Matlab 复制代码
A=input('提示文字',数据类型);

Matlab 复制代码
str = input('请输入一段文字: ', 's');

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

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

流程控制语句

分支语句包括

Matlab 复制代码
if(条件式),
    语句;
end;

if(条件式1),
    语句1;
elseif(条件式2),
    语句2;...;
else,
    语句;
end;

switch(分支变量)
case(值1),
    语句1;
case(值2),
    语句2;
    ...;
otherwise 
    语句;
end

循环语句包括

Matlab 复制代码
for 循环变量=初值:增量:终值,
语句;
end;

while(条件式),
语句;
end。

其他语句包括

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

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

break,跳出当前循环

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

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

Matlab 复制代码
error('This is an error message');

脚本文件与函数文件

主要区别有:

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

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

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

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

Matlab 复制代码
function [输出参数列表] = 函数名(输入参数列表)

例:

函数定义

Matlab 复制代码
function area = calculateCircleArea(radius)
    % calculateCircleArea 计算圆的面积
    % 输入参数:
    %   radius - 圆的半径
    % 输出参数:
    %   area - 圆的面积

    % 声明PI常量
    PI = 3.141592653589793;

    % 计算面积
    area = PI * radius^2;
end

函数调用

Matlab 复制代码
​​[输出参数] = 函数文件名(输入参数1, 输入参数2, ..., 输入参数N)

S=calculateCircleArea(23)

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

函数句柄与匿名函数

函数句柄

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

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

Matlab 复制代码
function result = square(x)
    result = x^2;
end

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

Matlab 复制代码
% 创建函数句柄
fHandle = @square;

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

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

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

feval函数
Matlab 复制代码
feval(fun, arg1, arg2, ..., argN)

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

用处:

使用字符串调用函数

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

使用函数句柄调用函数

Matlab 复制代码
​% 创建函数句柄
fHandle = @sin;

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

注意事项

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

使用str2func替代feval

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

Matlab 复制代码
​% 将字符串转换为函数句柄
fHandle = str2func('sin');

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

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

eval函数

基本语法

Matlab 复制代码
eval(expression)

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

示例

执行表达式

Matlab 复制代码
% 定义一个字符串,其中包含 MATLAB 表达式
str = 'a = 5; b = 10;';

% 使用 eval 执行字符串中的表达式
eval(str);

% 显示结果
disp(['a = ', num2str(a)]);
disp(['b = ', num2str(b)]);

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

调用函数

Matlab 复制代码
% 定义一个字符串,其中包含对函数的调用
str = 'disp(''Hello, World!'')';

% 使用 eval 执行字符串中的函数调用
eval(str);

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

注意事项

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

匿名函数

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

基本语法

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

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

Matlab 复制代码
add = @(x, y) x + y;
result = add(3, 4);  % 计算 3 和 4 的和
disp(result);  % 显示结果:7
arrayfuncellfun 函数

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

基本语法

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

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

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

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

函数重载

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

基于参数数量重载

1、重写函数

Matlab 复制代码
function result = myfunc(a)
    result = a^2;
end

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

2、使用nargin与nargout

nargin:记录调用函数时输入变量个数;

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

示例:

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

根据参数类型重载

Matlab 复制代码
function result = myfunc(a)
    if ischar(a)
        result = 'String: ' + a;
    elseif isnumeric(a)
        result = a^2;
    else
        error('Unsupported type');
    end
end

注意事项

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

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

相关推荐
天呐草莓1 小时前
热传导方程
算法·matlab
hoiii1872 小时前
基于MATLAB实现无监督数据建模
开发语言·matlab
kaikaile19953 小时前
使用纯MATLAB M函数实现的无刷直流电机控制系统仿真
开发语言·matlab
崇山峻岭之间3 小时前
Matlab学习记录09
开发语言·学习·matlab
Dargon28815 小时前
实例讲解Simulink的MATLAB Function模块
开发语言·matlab·simulink·mbd软件开发
崇山峻岭之间20 小时前
Matlab学习记录05
开发语言·学习·matlab
t1987512820 小时前
计算力学中经典四阶常微分方程的MATLAB求解方法
开发语言·matlab
tyatyatya1 天前
MATLAB三维绘图教程:plot3/mesh/surf/contour函数详解与实例
开发语言·matlab
chao1898441 天前
基于MATLAB实现NSGA-II算法
开发语言·算法·matlab
Matlab光学1 天前
MATLAB仿真:离轴干涉法实现光学全息加密与解密
开发语言·matlab