当前位置: 首页 > news >正文

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

今天我们继续学习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。

相关文章:

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

今天我们继续学习Matlab中函数相关知识。 API的查询和调用 help 命令是最基本的查询方法,可查询所有目录、指定目录、命令、函数。 我们直接点击帮助菜单即可查询所需的API函数。 lookfor 关键字用于搜索相关的命令和函数。 如,我们输入lookfor inpu…...

2024.7.30 搜索插入位置(二分法)

题解 二分法 left和right标记二分区间 ans标记n&#xff0c;因为存在大于所有数的可能。 var searchInsert function(nums, target) {const n nums.length;let left 0, right n - 1, ans n;while (left < right) {//计算中位数let mid ((right - left) >> 1)…...

Socket通信(C++)

文章目录 什么是SocketSocket通信过程C Socket通信APIint socket(int domain, int type, int protocol);int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);struct sockaddrstruct sockaddr_unstruct sockaddr_in / struct sockaddr_in6 int connect(int …...

小白学大模型:LLaMA-Factory 介绍与使用

最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友…...

java算法day26

java算法day26 207 课程表208 实现Trie(前缀树) 207 课程表 这题对应的知识是图论里的拓扑排序的知识。从题意就可以感受出来了。题目说如果要学习某课程&#xff0c;那么就需要先完成某课程。 这里我描述比较复杂的情况&#xff1a;课程与课程之间也有可能是多对一的场景或者…...

docker笔记7-dockerfile

docker笔记7-dockerfile 一、dockerfile介绍二、dockerfile指令三、构建自己的镜像 一、dockerfile介绍 Dockerfile是用来构建Docker镜像的构建文件&#xff0c;是由一系列命令和参数构成的脚本。 以下是常用的 Dockerfile 关键字的完整列表和说明&#xff1a; 二、docker…...

Spring-cloud Alibaba组件--Dubbo

远程调用技术 RestFul风格 基于HTTP协议实现&#xff0c;而HTTP是一种网络传输协议&#xff0c;基于TCP&#xff0c;规定了数据传输的格式。 RPC协议 Remote Produce Call 远程过程调用&#xff0c;类似的还有 RMI &#xff08; remote method invoke&#xff09;。自定义数…...

右值引用--C++11

左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们 之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 什么是左值&#xff1f;什么是左值引用&#xff1f;…...

这样做外贸报价表,客户看了才想下单

报价&#xff0c;是外贸业务中最重要的一步&#xff0c;作为外贸人&#xff0c;不会做报价表可不行。有人说&#xff0c;直接在邮件里回复价格不就好了&#xff1f;是的&#xff0c;产品简单的可以这么做&#xff0c;但你也不能忽视报价表的价值&#xff0c;一份完美的价格表对…...

Swift学习入门,新手小白看过来

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…...

【Ant Design Pro】快速上手

初始化 初始化脚手架&#xff1a;快速开始 官方默认使用 umi4&#xff0c;这里文档还没有及时更新&#xff08;不能像文档一样选择 umi 的版本&#xff09;&#xff0c;之后我选择 simple。 然后安装依赖。 在 package.json 中&#xff1a; "start": "cross-e…...

Hive3:Hive初体验

1、创建表 CREATE TABLE test(id INT, name STRING, gender STRING);2、新增数据 INSERT INTO test VALUES(1, 王力红, 男); INSERT INTO test VALUES(2, 钉钉盯, 女); INSERT INTO test VALUES(3, 咔咔咔, 女);3、查询数据 简单查询 select * from test;带聚合函数的查询 …...

blender顶点乱飞的问题解决

初学blender&#xff0c;编辑模式下移动某些顶点&#xff0c;不管是移动还是滑动都会出现定点乱飞的问题&#xff0c;后来才发现是开了吸附工具的原因&#xff01;&#xff01;&#xff01;&#xff01; 像下面这样&#xff0c;其实我只是在Z轴上移动&#xff0c;但是就跑的很…...

Elasticsearch(ES) 集群脑裂

脑裂问题(split-brain problem)是指一个分布式系统中&#xff0c;当网络分裂&#xff08;network partition&#xff09;发生时&#xff0c;导致系统内部的两个或多个节点相互独立地认为自己仍然与其他节点连接&#xff0c;每个节点组都试图执行操作&#xff0c;这可能会导致数…...

spark 3.0.0源码环境搭建

环境 Spark版本&#xff1a;3.0.0 java版本&#xff1a;1.8 scala版本&#xff1a;2.12.19 Maven版本&#xff1a;3.8.1 编译spark 将spark-3.0.0的源码导入到idea中 执行mvn clean package -Phive -Phive-thriftserver -Pyarn -DskipTests 执行sparksql示例类SparkSQLExam…...

3.3、matlab彩色图和灰度图的二值化算法汇总

1、彩色图和灰度图的二值化算法汇总原理及流程 彩色图和灰度图的二值化算法的原理都是将图像中的像素值转化为二值(0或1),以便对图像进行简化或者特定的图像处理操作。下面分别介绍彩色图和灰度图的二值化算法的原理及流程: 1)彩色图的二值化算法原理及流程 (1)原理:…...

新手必看:Elasticsearch 入门全指南

Elasticsearch 入门介绍 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;广泛应用于处理大规模数据和实时搜索需求。它基于 Apache Lucene 构建&#xff0c;具备高可扩展性和分布式特性&#xff0c;能够快速、可靠地存储、搜索和分析大量数据。本文将介绍 Elasti…...

【Linux】TCP全解析:构建可靠的网络通信桥梁

文章目录 前言1. TCP 协议概述2. TCP报头结构3. 如何理解封装和解包呢&#xff1f;4. TCP的可靠性机制4.1 TCP的确认应答机制4.2 超时重传机制 5. TCP链接管理机制5.1 经典面试题&#xff1a;为什么建立连接是三次握手&#xff1f;5.2 经典面试题&#xff1a;为什么要进行四次挥…...

图像处理 -- ISP中的3DNR与2DNR区别及实现原理

ISP中的3DNR与2DNR区别及实现原理 2DNR&#xff08;2D Noise Reduction&#xff09; 2DNR的原理&#xff1a; 2DNR主要针对单帧图像进行降噪处理。它利用空间域内的像素值&#xff0c;采用空间滤波的方法来减少噪声。常用的方法包括均值滤波、中值滤波和高斯滤波等。这些方法…...

硬盘分区读不出来的解决之道:从自救到专业恢复

在日常的计算机使用过程中&#xff0c;硬盘分区读不出来的问题常常令人头疼不已。这一问题不仅阻碍了用户对数据的正常访问&#xff0c;还可能预示着数据安全的潜在威胁。硬盘分区读不出来&#xff0c;通常是由于分区表损坏、文件系统错误、物理扇区损坏、驱动程序冲突或硬件连…...

Agent 语音交互如何更稳、更快?一次高并发消息链路优化实践

作者&#xff1a;雀贤、文婷、复礼、稚柳 随着大语言模型&#xff08;LLM&#xff09;、语音识别&#xff08;ASR&#xff09;、语音合成&#xff08;TTS&#xff09;等能力逐步成熟&#xff0c;AI Agent 开始从文本交互走向语音交互&#xff0c;典型场景包括 AI 教师、AI 情感…...

DHCP实验1

一、实验拓扑二、实验需求 1.PC1和PC2使用路由器模拟2.PC1和R1的g0/0口连接到SW的vlan10&#xff1b;PC2和R1的g0/1口连接到SW的vlan203.R1在vlan10的IP地址为192.168.1.1/24&#xff0c;vlan20的IP地址为192.168.2.1/244.在R1上配置DHCP服务&#xff0c;分别为2个网段分配IP地…...

Anything V5图像生成效果实测:高清画质与丰富风格展示

Anything V5图像生成效果实测&#xff1a;高清画质与丰富风格展示 1. 引言&#xff1a;惊艳的二次元创作体验 1.1 模型核心能力概述 Anything V5作为Stable Diffusion生态中的明星模型&#xff0c;专为动漫风格图像生成优化。经过大规模高质量二次元数据训练&#xff0c;它能…...

douyin-downloader:抖音视频批量下载解决方案

douyin-downloader&#xff1a;抖音视频批量下载解决方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代&#xff0c;视频资源的高效管理已成为内容创作者、教育工作者和社交媒体运营者…...

电力电子器件全解析:从二极管到IGBT,手把手教你掌握王兆安教材核心考点

电力电子器件深度解析&#xff1a;从基础原理到高效复习策略 电力电子技术作为现代自动化与能源转换的核心学科&#xff0c;其器件特性与应用的掌握程度直接影响着工程师解决实际问题的能力。对于华南理工大学自动化专业的学生而言&#xff0c;王兆安教授的《电力电子技术》教材…...

校园网免认证上网?手把手教你用UDP53端口搭建自己的“网络后门”(附服务器配置)

校园网络优化&#xff1a;UDP53端口的高效应用实践 校园网络作为师生日常学习生活的重要基础设施&#xff0c;其稳定性和访问效率直接影响着教学科研活动的开展。本文将深入探讨一种基于UDP53端口的网络优化方案&#xff0c;帮助技术爱好者理解并实现更流畅的网络体验。 1. 校园…...

从电源到复位:深入拆解STM32最小系统每个电路模块的设计考量与选型避坑

从电源到复位&#xff1a;深入拆解STM32最小系统每个电路模块的设计考量与选型避坑 在嵌入式系统开发中&#xff0c;STM32系列微控制器因其出色的性能和丰富的外设资源而广受欢迎。然而&#xff0c;即使是看似简单的STM32最小系统设计&#xff0c;也蕴含着大量值得深入探讨的工…...

RWKV7-1.5B-G1A入门实战:手把手教你写文案、做总结、玩对话

RWKV7-1.5B-G1A入门实战&#xff1a;手把手教你写文案、做总结、玩对话 1. 认识RWKV7-1.5B-G1A RWKV7-1.5B-G1A是一个基于RWKV-7架构的多语言文本生成模型&#xff0c;特别适合处理基础问答、文案续写、简短总结和轻量中文对话任务。这个1.5B参数的模型在保持良好生成质量的同…...

Linux服务器运维:5个最容易被忽略的故障排查技巧(附实战命令)

Linux服务器运维&#xff1a;5个最容易被忽略的故障排查技巧&#xff08;附实战命令&#xff09; 在Linux服务器运维的日常工作中&#xff0c;有些故障排查点往往被工程师们忽视&#xff0c;直到问题爆发才追悔莫及。本文将揭示五个最容易被忽略但至关重要的排查技巧&#xff…...

屠龙刀法35--使用SQL查询器批量生成insert语句

很多网友认为SQL查询器的语句不都是人工输入或者从外面粘贴进去的吗&#xff1f;用查询器批量生成Insert语句感觉有点魔幻哦。的确听起来不太科学&#xff0c;但是对于DBCS来说这个功能的确非常好用。下面我们就举例一步步告诉大家&#xff0c;如何使用这个功能。 第一步&…...