MATLAB 程序设计

2023-11-05


前言

今天,主要学习一下使用matlab编写程序,也就是M文件。 matlab的工作台可以实现很多功能语句的编写,但是呢,只能够单条执行一条语句,为了实现一个个模块化的功能,就需要我们想编写其他语言程序一样去编写matlab程序代码,即M文件

一、M文件操作介绍

首先呢,什么是M文件?其实他就是用MATLAB语言编写的程序,他可以大致分为脚本文件和函数文件

脚本文件(Script) :也称命令式M文件,就是命令(或语句)的简单叠加(不存在输入参数和输出参数的问题)。可在命令窗口直接输入文件名运行。当运行脚本文件时,MATLAB就会自动按顺序执行文件中的语句(或命令),这样就可以避免在命令窗口运行许多命令的麻烦和重复性工作,也便于修改

函数文件(Function):用来定义函数,主要解决参数传递和函数调用问题,它的第一条语句以function语句为引导

M文件的创建与打开

1.建立新的M文件

为建立新的M文件,启动M文件编辑器的方法有三种:

1)菜单方式。从Matlab主窗口中选择File->New->M-file命令,出现M文件编辑器窗口。

2)命令方式:在命令窗口输入edit命令。

3)命令按钮方式:单击Matlab主窗口工具栏上的New Script 命令按钮(或者New 命令按钮)

2. 打开已有的M文件

打开已有的M文件有多种方法:

1)在当前目录窗口选中要打开的M文件,双击鼠标左键打开(或点右键,在右键菜单中选择打开、运行或者其它)

2)命令按钮方式:单击Matlab主窗口工具栏上的Open file命令按钮。

3)命令方式:在命令窗口输入命令
edit 文件名

打开已有的文件后,即可对其进行编辑、运行、调试、保存等。

3. 脚本文件的运行:

在该M文件的窗口中点Run按钮,或者在命令窗口中输入该M文件名(test1),就会执行该命令文件,即顺序执行该命令文件中的语句(或命令)

二、输入输出语句

1 输入函数-input

调用格式为:
A = input(提示信息,选项);

其中提示信息为一个字符串,用于提示用户输入什么样的数据
如果在input函数调用时采用 ’ s ’ 选项,则允许用户输入一个字符串

2. 输出函数-display和disp

调用格式为:
disp( 变量或者表达式) 或
display(变量或者表达式)

注意:用disp函数显示矩阵时将不显示矩阵的名字,而且其格式更紧密,且不留任何没有意义的空行

3. 格式化输出函数-fprintf

fprintf函数的使用类似于C语言中printf的功能,其调用格式,输出控制大抵相同

4. pause命令

格式:

pause %暂停程序的执行,等待用户按任意键后再继续运行
pause(n) %等待n秒后继续运行
说明:只要当pause的开关状态处于on时,以上命令才起作用。 pause on %表示其后的pause命令起作用
pause off %表示其后的pause命令不起作用
pause query %查询当前pause命令的状态

三、程序选择结构

1.if 语句

在MATLAB中,if语句有3种格式。

  1. 单分支if语句
> 语句格式为:
>      if  条件表达式
>          语句组
>      end

当条件表达式的值为真(非零)时,则执行if和end之间的语句组;
否则,(不执行if和end之间的语句组),直接执行if语句的后继语句(end后面的语句)

  1. 双分支if语句
语句格式为:
    if  条件表达式
         语句组1
    else
         语句组2
    end

当条件表达式非零时,执行语句组1;否则执行语句组2
语句组1或语句组2执行后,再执行if语句的后继语句(end后面的语句)

  1. 多分支if语句
语句格式为:
if  条件1
        语句组1
elseif  条件2
        语句组2
       ……
elseif  条件n
         语句组n
else
         语句组n+1
end

[例]输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应数的平方,若为其他字符则原样输出

代码如下:

c=input('请输入一个字符','s');
if c>='A' & c<='Z'
    disp(lower(c));
elseif c>='a'& c<='z'
    disp(upper(c));
elseif c>='0'& c<='9'
    disp(str2num(c)^2);
else
    disp(c);
end

2.switch-case结构

switch语句根据表达式的取值不同,分别执行不同的语句

语句格式为:
switch  表达式
    case  表达式1
        语句块1
    case  表达式2
        语句块2
        ……
    case  表达式n
        语句块n
    otherwise
        语句块n+1
    end

switch子句后面的表达式应为一个标量或一个字符串
case子句后面的表达式不仅可以为一个标量或一个字符串,而且还可以是一个将多个值(标量或字符串)用大括号括起来的单元数组。
如果case子句后面的表达式为一个单元数组,则表达式的值等于该单元数组中的某个元素时,执行相应的语句组。

[例] 通过键盘输入百分制成绩,输出对应的等级(A: 90-100, B: 80-89, C:70-79,D:60~69, E: <60)

n=input('n=');
if n<0 | n>100
    error(‘输入有误!);
else
    i=floor(n/10);
    switch i
  case  {9,10}
      display(‘A’)
  case 8
      display(‘B’)
  case 7
      display(‘C’)
  case 6
      display(‘D’)
  otherwise
      display(‘E’)
  end  %switch
end  % if

3.try-catch结构

格式为:
try   
    语句组1
catch
    语句组2
end

执行时,首先试探性地执行语句组1。
如果在执行语句组1的过程中出错,则将错误信息赋给Matlab预定义变量lasterr后转去执行语句组2(如果执行语句组2时也出错,将终止程序的执行)

[例]矩阵乘法运算要求两矩阵的维数相容,否则会出错。创建一个命令文件,先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。

代码如下:

A=input('请输入A矩阵:')
B=input('请输入B矩阵:')
lasterr('');                 %清除原有的错误信息
try
   C=A*B;
catch
   C=A.*B;
end
C
disp(lasterr)             %显示出错原因

四、程序循环结构

1.for语句

%for 语句的一般格式:
for 循环变量 = 数组
    循环体语句
end

数组为向量或矩阵。执行时依次将数组的各列赋值给循环变量,然后执行循环体语句,直至各列元素处理完毕

%数组元素求和
A=input('A=')
sumA=0;
for x=A
    sumA=sumA+x;
end
 sumA

for语句最常用的形式:

格式:
for  循环变量=初值:增量:终值
    循环体语句
end

[例] 一个整数各位数字的立方和等于这个数本身,则称该数为水仙花数。输出全部三位的水仙花数。

for m=100:999
    m1=fix(m/100);      %求m的百位数
    r1=rem(m,100);       %m的后两位
    m2=fix(r1/10);        %m的十位数
    m3=rem(r1,10);        %m的个位数
    if m1^3+m2^3+m3^3==m
        display(m)
    end
end

2.while语句

while语句的一般格式为:
    while  条件表达式
         循环体语句
    end

若条件表达式为真(非零),则执行循环体语句,否则,跳出循环。每次执行循环体语句后,重新判断条件表达式是否为真(如果为真,则继续执行循环体语句,否则跳出循环)。重复以上过程,直至条件表达式为假(零)时,跳出循环

3.break和continue命令

在执行循环体语句时,当执行到break 命令时,也跳出for循环或while 循环(注意:只跳出break所在的一层循环)

如果在循环体语句中遇到continue 语句,则停止执行剩余的循环体语句,转到下一次循环的开始执行(对于for语句,则给循环体变量赋下个值,对于while语句,则重新进行条件判断,然后再执行循环体语句或退出循环)
`

4.return

return命令是终止当前命令的执行,并且立即返回到上一级调用函数或等待键盘输入命令,可以用来提前结束程序运行

5.keyboard

在MATLAB中,将keyboard命令放置到M文件中将使得程序暂停执行,等待键盘命令。通过提示符K来显示一种特殊状态,只有当用户使用return命令结束输入后控制权才交给程序。在M文件中,对程序的调试和在程序运行中修改变量都会很方便

6.error与warning命令

error('message')  %显示出错信息message,终止程序
errordlg('errorstring','dlgname')   %显示出错信息的对话框,对话框的标题为dlgname
warning('message')  %显示程序出错信息,程序继续运行

五、函数

函数文件的格式

%函数文件由function语句引导,其一般格式为:
function  输出形参表 = 函数名(输入形参表)
 注释说明部分(每行均以%开始)
 函数体语句
(return)

关于函数文件格式的几点说明:
(1)函数说明行:位于函数文件的首行,以function开头。当有多个输出参数时,应该将这些输出参数放在方括号内,并且,输出参数间用逗号或空格隔开。输入形参之间必须以逗号分隔,放在圆括号内(可以0个输入或输出)
(2) 注释说明部分。
 注释说明一般包括三部分内容:
 ① H1注释行:紧随函数说明行之后以%开头的第一注释行(一般包括大写的函数文件名和函数功能的简要描述,供lookfor查询用)。
 ② help text:第一注释行及之后的连续的以%开头的注释行构成整个帮助文本,供help命令查询用。(一般包括函数的功能、使用格式、输入输出参数的说明等)
 ③编写、修改记录:编写者、日期、修改者、日期等,通常和帮助文本区间隔一个空行,每行均以%开头,一般用作软件档案管理。
(3) 函数体:由Matlab的命令或语句组成,对输入进行变换或处理,得到输出。
(4)关于return语句。执行到该语句就结束函数的执行,程序流程转至调用该函数的位置。通常,在函数文件中也可不使用return语句,这时在被调函数执行完成后自动返回。
(5)关于函数文件名:函数文件名必须以字母开始,后跟字母、数字或下划线。通常,函数文件名由函数名加扩展名’.m’组成。函数文件名也可以与函数名不相同。当两者不同时,MATLAB将忽略函数名而确认函数文件名,因此调用时使用函数文件名。

函数的调用格式

函数调用的一般格式为:
[输出实参表] = 函数名(输入实参表)

当没有输出实参时, 简化为:
函数名(输入实参表) 

注意:函数对输入形参变量的一切操作和修改如果不依靠输出形参变量传出的话,将不影响主调函数工作空间和基本工作空间中该变量的值

全局变量与局部变量

声明某个变量为全局变量的格式为: global 变量名
声明某些变量为局部变量的格式为:persistent 变量名

获取输入输出参数信息

nargin (在函数体内使用)调用函数时实际输入参数的个数
nargout (在函数体内使用)调用函数时实际输出变量的个数
inputname(n) (在函数体内使用)给出调用函数时第n个实际参数的变量名。
MSG=nargchk(LOW,HIGH,N) 检查N是否在LOW和HIGH之间,如果是,则返回[],否则,返回一个合适的错误信息字符串。
varargin和varargout 可以用来实现任意有限个输入参数和输出参数的函数。

注意:在一个函数文件中,可以定义多个函数。其中,第一个函数是主函数,可以在命令窗口或其它M文件中调用它;其它函数均被视为子函数。子函数只能为主函数或同一文件中的其它子函数所调用

函数句柄对象

函数句柄的创建格式:
1)  FUNHANDLE = @函数名
2)  FUNHANDLE =  @(参数)函数表达式

函数句柄的调用:
1)和函数的调用一样
即:[输出参数列表]=函数句柄(输入参数列表)
2)通过函数feval调用,格式为:
[输出参数列表]= feval(函数句柄,输入参数列表)

例如:
f=@sin, f([0 pi/6]) 或者feval(f, [0 pi/6])

g=@(x)exp(-x)+4*x.^3+3*x.^2;

h=@(x,y,z)(x^2+y^2+z^2), 
h0=h(1,1,2)  或者 feval(h,1,1,2)

总结

MATLAB程序设计和其他的语言是类似的,想要掌握程序的编写还需要多打代码多做题,在程序的不断调试,不断修正中会吸取经验,锻炼能力。今天的博客就写到这里吧,明天见

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB 程序设计 的相关文章

  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • MATLAB 滚动图

    我有一个脑电图数据库 我想绘制它 数据库是一个19 1000 134的矩阵 其中 19 是通道数 在第一种方法中 我只使用一个渠道 1000 个样本大小 采样率为 500 Hz 时为 1000 个点 即 2 秒数据 134 epochs的数
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这
  • MATLAB 中的多个捕获组

    我有一个包含数字或字母的字符串a 可能紧随其后的是r or l 在 MATLAB 中 以下正则表达式返回为 gt gt regexp 10r 0 9 a l r match ans 10r 我希望10 and r分开 因为我有两个捕获组 有
  • 使用mat2cell将MxN的矩阵划分为1xN大小的M矩阵

    我有一个大小为 MxN 的矩阵 比方说 1867x3 1867 行和 3 列 我想将其分成 1867 个大小为 1x3 的单元格 我使用了mat2cell X 1 1866 这里X是矩阵 1867x3 结果给出了两个单元格 一个单元格的大小
  • 如何找到在matlab中重复的矩阵的每一行的索引?

    我想找到矩阵中所有有重复项的行的索引 例如 A 1 2 3 4 1 2 3 4 2 3 4 5 1 2 3 4 6 5 4 3 要返回的向量将是 1 2 4 很多类似的问题建议使用unique函数 我已经尝试过 但我能得到的最接近我想要的功
  • 如何在 Matlab 中对数组应用低通或高通滤波器?

    有没有一种简单的方法可以将低通或高通滤波器应用于 MATLAB 中的数组 我对 MATLAB 的强大功能 或数学的复杂性 有点不知所措 需要一个简单的函数或一些指导 因为我无法从文档或网络搜索中找到答案 看着那 这filter http w
  • Matlab:如何更改矩阵的存储方式?从 1x1x3 到 1x3?

    我目前有 val 1 0 7216 val 2 0 7216 val 3 0 7216 但我想要 0 7216 0 716 0 721 我可以做什么样的操作来做到这一点 The reshape函数将在这里解决问题 Arrange the e
  • 使用符号求解器仅求解某些变量

    我正在尝试在 MATLAB 中求解包含 3 个变量和 5 个常量的方程组 是否可以使用solve求解三个变量 同时保持常量为符号而不用数值替换它们 当您使用SOLVE http www mathworks com access helpde
  • 如何使用 MATLAB 的 substruct 函数创建表示使用“end”的引用的结构?

    我想使用substruct http www mathworks com help matlab ref substruct html函数创建一个结构体以供使用subsref 目的是使用索引字符串subsref而不是通常的 符号 因为我正在
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • 如何更改Plotyy第二轴的颜色和字体大小?

    我使用 MATLAB 的plotyy 函数绘制了两条曲线 AX H1 H2 plotyy voltage span amplitude voltage span Ca SR The problem is that I cannot chan
  • MATLAB 中的霍夫变换

    有谁知道如何使用霍夫变换来检测二值图像中最强的线 A zeros 7 7 A 6 10 18 24 36 38 41 1 使用 rho theta 格式 其中 theta 以 45 为步长 从 45 到 90 以及如何在 MATLAB 中显
  • 从开始/结束索引列表创建向量化数组

    我有一个两列矩阵M包含一堆间隔的开始 结束索引 startInd EndInd 1 3 6 10 12 12 15 16 如何生成所有区间索引的向量 v 1 2 3 6 7 8 9 10 12 15 16 我正在使用循环执行上述操作 但我想
  • 对数据进行分布拟合 - MATLAB

    我正在尝试对从显微镜图像中收集的一些数据进行分布 我们知道 152 左右的峰值是由于泊松过程造成的 我想将分布拟合到图像中心的大密度 同时忽略高强度数据 我知道如何将正态分布拟合到数据 红色曲线 但它不能很好地捕获右侧的重尾 尽管泊松分布应
  • MATLAB 类的 Description 和DetailedDescription 属性

    内置 MATLAB 类具有 Description 和 DetailedDescription 属性的值 gt gt handle ans meta class handle Package meta Properties Name han
  • 从动态 Java 类路径导入 Java 类时出现 Matlab 编译器 MCC 错误

    我怎样才能得到mcc识别来自用户提供的 Java 库的导入 还是简单地忽略无法解析的导入 我有一个使用 Matlab 编译器构建的 Matlab 代码库 但构建正在中断 因为mcc遇到的时候会报错importMatlab 动态类路径上的 J
  • 如何知道Matlab中系统命令执行过程中经过的时间?

    我有一个运行系统脚本的 Matlab 代码 该脚本可能会因命令运行而停止 我想知道是否有一种方法可以让程序知道它是否花费了很长时间并执行其他操作 这是代码 tic status cmdout system iperfcmd The prog
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 加到 100 的随机数:Matlab

    我将人口数量分成不同的矩阵 现在想使用随机数测试我的代码 快速提问 谢谢你们提前的帮助 如果我使用 100 rand 9 1 使这 9 个数字相加等于 100 的最佳方法是什么 我想要 9 个 0 到 100 之间的随机数 加起来为 100

随机推荐

  • 巧解高并发之福利抽奖

    随着互联网的发展 高并发问题几乎是每个企业都会面临的问题 而目前解决高并发最受欢迎的便是微服务 通过类似于增加服务器数量而达到一种 人多力量大的 效果 但是 类似方法均需要技术及资本的支持 而当现有技术和资本不达标时 一切都是空谈 那么当技
  • mysql 数据多表join

    0 索引 JOIN语句的执行顺序 INNER LEFT RIGHT FULL JOIN的区别 ON和WHERE的区别 1 概述 一个完整的SQL语句中会被拆分成多个子句 子句的执行过程中会产生虚拟表 vt 但是结果只返回最后一张虚拟表 从这
  • 在cmd/bat脚本中获取当前脚本文件所在目录

    Q 在Win7 Win10中以管理员身份运行在cmd bat脚本时 如何获取当前脚本文件所在目录 当我们在Win7 Win10中使用鼠标右键的 以管理员身份运行 以管理员身份运行cmd bat脚本时 系统默认进入的目录是C Windows
  • 【Burp Suite】配置FireFox火狐浏览器burpsuite https抓包

    配置FireFox火狐浏览器burpsuite https抓包 配置火狐浏览器代理 Firefox配置证书 FireFox再配置代理 抓包 成功
  • centos7 安装mysql8.0

    1 官方文档 http dev mysql com doc mysql yum repo quick guide en 2 下载 Mysql yum包 http dev mysql com downloads repo yum 或者直接 w
  • VMware虚拟机安装+Ubuntu下载+VMware虚拟机配置运行

    一 安装虚拟机VMware 1 下载地址 下载 VMware Workstation Pro CN 2 进入官网 点击Window 16 Pro for Windows即可立即下载 3 下载好后 如图所示 4 运行exe文件 进入VMwar
  • Klipper seria.c 文件代码分析

    一 前言 Klipper 底层硬件的串口模块程序写的是否正确是决定下位机与上位机能否正常通信的前提 如果这个文件的驱动没写好 那上位机控制下位机就无从谈起 更无法通过上位机去验证下位机程序的正确性 本篇博文将详细解析 Klipper src
  • ORA-00933: SQL命令未正确结束 解决办法

    1 报错内容 Cause java sql SQLSyntaxErrorException ORA 00933 SQL 命令未正确结束 bad SQL grammar nested exception is java sql SQLSynt
  • SpringBoot原理解析(超详细)

    SpringBoot原理解析 1 SpringBootApplication原理解析 首先 我们直接追踪 SpringBootApplication的源码 Target ElementType TYPE Retention Retentio
  • JMeter获取数据库数据作为接口参数

    1 既然是操作数据库肯定具备需要对数据库的配置 2 在接口测试的过程中有OA需要进行账号切换 因此在这里利用sql直接查询数据 3 且看配置 variables names设置为A C 那么如下变量会被设置为 A 2 总行数 A 1 第1列
  • python爬取微信公众号文章

    爬取微信公众号文章 获取微信公众号的url 获取每一篇文章的url 选择一个公众号进入 选择一个目录进入后点复制链接 然后去浏览器打开 按F12打开检查的模式 在Console中输入 x 标签路径 找到子文章的目录xpath 然后分离出每篇
  • UDP实现点对点聊天-C语言

    UDP实现点对点聊天 服务器端 操作步骤 1 编译 gcc UDPSt c lws2 32 o UDPSt exe 2 运行 UDPSt include
  • 2021年蓝桥杯c++b组解析(个人)

    随着蓝桥杯不断地推进 期间也要多加练习才能有所收获 对于这份去年的试卷 个人感觉有些难度 具体体现在数字大 状态方程难想 对于后四题编程都有所难度 本人也只能通过40 60 的样例 下面针对下面10个题进行系统讲解 部分代码与思路源于网上
  • 苹果M1芯片上运行Stable Diffusion(文字作画)

    1 源码下载 git clone b apple silicon mps support https github com bfirsh stable diffusion git cd stable diffusion 2 修改gitee国
  • 聚观早报

    今日要闻 谷歌发布全球最大视觉语言模型 马斯克预计Twitter下季度现金流转正 王兴投资王慧文ChatGPT项目 美国拟明年 11 月开展载人绕月飞行 慧与科技宣布收购Athonet 谷歌发布全球最大视觉语言模型 近日 来自谷歌和德国柏林
  • Python学生信息管理系统【GUI界面版 + 期末报告书 + 功能实现讲解】

    课程设计说明 GUI 使用的是Python自带的 tkinter 模块 无需配置 Python自带的模块直接导包使用即可 包含了增删改查 保存文件 满足 90 大学生期末课程设计需求 运行时在main py文件右键运行即可 完整文件关注私聊
  • 进程间通信--管道通信

    进程间通信 在两个进程之间 每个进程各自有不同的用户地址空间 任何一个进程的全局变量在另一个进程中都看不到 比如 在父进程中的全局变量 如果在子进程中去改变这个全局变量 则子进程中被改变的这个值不会去影响父进程 因为子进程中的所有数据都是通
  • Visual Studio 2022 常用快捷键,记录一下别忘记~

    Visual Studio 2022 常用快捷键 记录一下别忘记 Ctrl E C 注释代码 Ctrl E U 取消注释代码 Ctrl E D 格式化全部代码 Ctrl Shift A 新建类 Ctrl R G 删除无效Using Ctrl
  • RestTemplate的详解

    引言 在SpringCloud微服务中 通过引入 ribbon实现了服务消费者的客户端负载均衡功能 在这个过程中使用了一个非常有用的对象 RestTemplate 该对象会使用 Ribbon 的自动化配置 同时通过配置 LoadBalanc
  • MATLAB 程序设计

    文章目录 前言 一 M文件操作介绍 M文件的创建与打开 1 建立新的M文件 2 打开已有的 文件 3 脚本文件的运行 二 输入输出语句 1 输入函数 input 2 输出函数 display和disp 3 格式化输出函数 fprintf 4