MATLAB程序设计

article/2025/8/19 18:11:10

文章目录

  • 1 程序基础
  • 2 数据类型和运算
    • 2.1 常量和变量
    • 2.2 数值数据
    • 2.3 字符数据
    • 2.4 逻辑数据类型
    • 2.5 日期和时间
    • 2.6 单元数组和结构体
  • 3 数组与矩阵
    • 3.1创建数组
    • 3.2 数组运算
    • 3.3 数组处理函数
      • 3.3.1 `zero/ones`函数
      • 3.3.2 `size/length`函数
      • 3.3.3 `max/min`函数
      • 3.3.4 `isempty`函数
      • 3.3.5 `unique`函数
      • 3.3.6 `cell`函数
    • 3.4 矩阵及其运算
    • 3.5 特殊矩阵
    • 3.6 稀疏矩阵及函数
  • 4 控制语句
    • 4.1 `for`循环语句
    • 4.2 `while`循环语句
    • 4.3 `if-else-end`语句
    • 4.4 `switch-case`语句
    • 4.5 `try-catch`语句
  • 5 M函数
    • `feval`函数
  • 6 程序调试
  • 7 MATLAB编程技巧
  • 参考文献

1 程序基础

程序设计是MATLAB进行科学计算的基础。MATLAB 程序是合法的MATLAB语句的集合,MATLAB语句包括MATLAB内部的功能和用户自己编码写的命令。

在程序执行过程的任何时候按下快捷 Ctrl+C(即同时按下Ctrl键和C键),就中断了MATLAB 的运算过程。

2 数据类型和运算

MATLAB基本数据类型包括常量、变量、数值、字符、结构体和单元数据类型。

2.1 常量和变量

MATLAB变量命名规则:区分大小写、最多识别到31个字符、必须以字母开始、不允许出现标点符号(很多标点符号在MATLAB中有特殊意义)、关键保留字不能作为变量名(如for、end、if等)、尽量不要与常量名重复。

变量命名规则

在这里插入图片描述

恢复常量原来特定值的途径:重新启动MATLAB系统,对被覆盖的值执行clear命令。

>> eps
ans = 2.2204e-16
>> eps = 1
eps = 1
>> eps
eps = 1
>> clear eps
>> eps
ans = 2.2204e-16
>>

2.2 数值数据

MATLAB 系统对数值型数据提供以下几种基本数学运算:加法(+)、减法(-)、乘法(*)、除法(/或者\)、乘方(^)。

几乎在所有的情况下,MATLAB中的数值都是用双精度来表示的,这些双精度数在MATLAB系统内部是用二进制来表示的。

MATLAB也用双精度浮点数来表示整数。在这种表示方式下,所有的整数都能被精确表示。整数所能表示的上下限分别为 f l i n t m a x flintmax flintmax − f l i n t m a x -flintmax flintmax

可以在提示符下输入相应的format命令来指定数值显示格式。

2.3 字符数据

MATLAB系统不仅提供了强大的数值处理能力,还拥有丰富的字符串处理功能。一个字符串就是用单引号括起来的简单文本。

为了看见一个字符串的底层ASCII表示,用户只需对这个字符串进行某项数学运算或者用函数double,函数char执行与double相反的操作。

>> s = 'Hello, world!'
s = Hello, world!
>> asi = double(s)
asi =72   101   108   108   111    44    32   119   111   114   108   100    33>> char(asi)
ans = Hello, world!
>>

MATLAB语言也提供了丰富的字符串处理函数,函数disp允许显示一个字符串而不用输出这个字符串变量的变量名。

在很多情况下,需要把一个数值型结果转换成一个字符串,或者把一个字符串转换成数值型数据。MATLAB提供了函数int2strnum2strmat2strsprintffprintf,可把数值型结果转换成字符串。

2.4 逻辑数据类型

MATLAB把所有的非 0 0 0 数值当作true,而把 0 0 0 当作false。所有关系和逻辑表达式,如果是真,就返回逻辑数组 1 1 1;如果为假,就返回逻辑数组 0 0 0

在MATLAB中,算术运算符的优先级最高,关系运算符优先级次之,逻辑运算符优先级最低。

2.5 日期和时间

通常,对于带有时间的数字都涉及将时间转换成日期数字格式,对时间执行标准数学运算,然后将结果数字再转换成简明的日期格式。

2.6 单元数组和结构体

单元数组是以元素为单元的MATLAB数组,在单元数组的每个单元都可以包含任何的MATLAB数据类型,包括数值型数据、字符串、其他单元数组及结构。

单元数组函数

单元数组函数
MATLAB为定义结构体变量提供了函数struct,其调用格式如下:

结构体变量名=struct(属性名1,属性值1,属性名2,属性值2,……)

使用该函数可以定义结构体变量的各个属性,并相应地赋以属性值。

结构体函数

在这里插入图片描述

3 数组与矩阵

数组与矩阵是MATLAB语言的核心,MATLAB中几乎一切运算都是以对数组和矩阵的操作作为基础的。

3.1创建数组

在这里插入图片描述

3.2 数组运算

标量与数组的运算是将数组中的每一个元素与标量进行相应的运算,标量与数组的运算遵循与标量表达式中相同的计算优先级运算的先后顺序。只有当两个数组的维数相同时,才能在数组元素对元素之间进行加、减、乘、除运算。

./.\都是用斜线斜上方的数组去除以斜线斜下方的数组;.^可以进行数组元素之间的指数运算;数组的模可以通过norm(x)函数求解;维数相同的数组的点积运算可以通过 d o t ( x , y ) dot(x,y) dot(x,y) 求得,等价于 s u m ( x . ∗ y ) sum(x.^*y) sum(x.y);数组的叉积运算要求参与运算的数组必须是维数为 3 3 3 的,叉积运算可以通过 c r o s s ( x , y ) cross(x,y) cross(x,y) 函数来求得。

3.3 数组处理函数

3.3.1 zero/ones函数

clear
clc
%测试 zeros、ones
A=zeros(3,4);
B=ones(3,4);

3.3.2 size/length函数

clear
clc
%测试 zeros、ones、size、length
A=zeros(3,4);
B=ones(3,4);
[C,D]=size(A);
E=[5 3 2 4];
F=length(E);

3.3.3 max/min函数

clear
clc
%测试 max、min、isempty
E=[5 3 2 4];
[maxValue,maxIndex]=max(E);
[minValue,minIndex]=min(E);

3.3.4 isempty函数

clear
clc
%测试 isempty
X=[1,2;3,4];
Y=isempty(X);

3.3.5 unique函数

clear
clc
%测试unique
A=[9 9 8 7 6 7 6 8 1 1 0];
[B,C]=unique(A);

3.3.6 cell函数

clear
clc
%测试cell
A1=[1,2,3];
A2=[4,5,6,7];
A3=[8,9,10,11,12];
A=cell(3,1);
A{1,1}=A1;
A{2,1}=A2;
A{3,1}=A3;

3.4 矩阵及其运算

矩阵是一类特殊的数组。矩阵与标量的运算是要完成矩阵的每一个元素与该标量的运算。矩阵的乘方要求矩阵为方阵。矩阵与矩阵之间的加减法运算要求参与运算的矩阵的维数完全相同,这些运算完成对参与运算的矩阵的相应元素相加减。

两个矩阵的乘法要求它们的维数相容,也就是说,第一个矩阵的列数等于第二个矩阵的行数,只有这样才能进行乘法运算。此外,MATLAB还有kronecker乘法运算,有kron()完成。
在这里插入图片描述
矩阵的除法运算有左除和右除两种,左除 A A A \ B B B= A − 1 B A^{-1}B A1B A A A 为方阵且可逆;右除 A / B = A B − 1 A/B=AB^{-1} A/B=AB1 B B B为方阵且可逆。

矩阵运算的点运算与数组的点运算是一样的,即两个矩阵之间的点运算就是这两个矩阵对应元素的直接运算,可以看出矩阵之间的点运算要求这两个矩阵的维数完全相同。

3.5 特殊矩阵

MATLAB系统提供了许多特殊矩阵,它们有些有着广泛的用途,有些在数学上有特殊的性质,在数据初始化过程中应用广泛。

在这里插入图片描述

3.6 稀疏矩阵及函数

一般来说,当矩阵维数比较大而矩阵元素中非零元素很少时,就应该采用稀疏矩阵。

稀疏矩阵的存储需要使用三个一维数组,第一个数组用于存储非零元素的值,第二个数组用于存储非零元素在矩阵中的行下标,第三个数组则用于存储稀疏矩阵中每一列的第一个非零元素在第一个数组中的偏移量,而对于复数元素的稀疏矩阵,则还需要一个数组用来存储非零元素的虚部。

稀疏矩阵的存储方式决定了对满矩阵采用稀疏矩阵的方式存储会占据更多的空间。

在这里插入图片描述在这里插入图片描述
稀疏矩阵是使用函数sparse来创建的,函数sparse(A)用来将一个普通的完全矩阵转换成稀疏矩阵,函数full可以将该稀疏矩阵转换成普通的完全矩阵。

4 控制语句

MATLAB提供了 5 5 5 种流程控制结构:for循环结构、while循环结构、if-else-end结构、switch-case结构、try-catch模块。

4.1 for循环语句

for循环的总体结构如下:

for 循环控制变量=arraycommands
end

示例如下:

clear
clc
% 求1到10的和
T=0;
for i=1:10T=T+i;
end

4.2 while循环语句

while循环总体结构如下:

while 循环判断语句commands
end

whileend之间的commands,只要循环判断语句为true,就会一直被执行;当循环判断语句为false,就会退出循环体。示例如下:

clear
clc
% 求1到10的和
T=0;
i=1;
while i<=10T=T+i;i=i+1;
end

4.3 if-else-end语句

if-else-end总体结构如下所示:

if 逻辑判断语句1commands1
elseif 逻辑判断语句2commands2
elseif 逻辑判断语句3commands3
.
.
.
elsecommands
end

示例如下:

clear
clc
%已知A,求B
A=6;
if A>5B=1;
elseif A>0B=2;
elseB=3;
end

4.4 switch-case语句

switch-case总体结构如下所示:

switch 选择判断量case 选择判断值1commands1case 选择判断值2commands2...otherwisecommands
end

与其他程序设计语言的switch-case语句不同的是,当其中一个case语句后面的条件为true时,switch-case语句就不会对其后的case语句进行判断。即便有多条case判断语句为真,也只执行所遇到的第一条为真的语句。

4.5 try-catch语句

try-catch模块提供了用户控制的错误捕获机制。try-catch模块的一般表达形式如下:

trycommands1
catchcommands2
end

在这些语句中,commands1中的语句都要被执行,如果没有出现错误,程序就直接跳到end语句。但是,如果在执行commands1的语句时出现错误了,程序就立刻转到catch语句,然后执行表达式commands2

5 M函数

MATLAB提供的M文件有两类:脚本文件和函数文件。脚本文件没有输入/输出变量,函数文件是在同功能的脚本文件的基础上在文件代码的开始处多添加一行函数声明。

函数是MATLAB的基本功能,他们使得用户可以对一组有用的命令进行封装,然后可以一次次地调用。如果不想单独编写M文件来定义函数,可以定义一个直接插入的函数(MATLAB提供了函数inline来实现这个功能)。

feval函数

函数feval可以将一个函数的字符串名传递给一个函数进行计算。feval一般语法如下所示:

[y1,y2,...] = feval(function,x1,x2,...,xn)	% function 是一个函数的字符串名,该函数由M函数定义,x1,x2,...xn 是函数名为 function 的M函数的参数列表,不是字符型的。
[y1,y2,...] = feval(fhandle,x1,x2,...,xn)	% fhandle 是一个函数句柄,x1,x2,...xn 是函数名为 function 的M函数的参数列表,不是字符型的。

当在一个函数的名字字符串已知的情况下,函数str2func可以用来创建函数句柄;而函数func2str执行相反的工作,是将函数句柄转换成字符串。

函数句柄可以被函数feval调用,但不能被函数eval调用,前面介绍的直接插入函数命令inline创建的函数可以被函数feval调用。

另外,MATLAB也提供了函数isa来判断变量是否为函数句柄,函数isequal可以判断两函数句柄是否相同。与其他数据数型相同,使用函数save也可以将函数句柄保存为MATLAB 数据文件,而使用函数load则同样可以打开该数据文件。

6 程序调试

在MATLAB表达式中可能存在两种错误:语法错误(是 MATLAB 运行一个表达式或者一个函数时被编译进入内存时发现的)和运行错误(体现在执行结果不对,运行中出现异常)。

对于简单的问题,可以采用下述方法进行排查:

(1)将函数中被选定的行的分号去掉,这样运算的中间结果就能在命令窗口中输出来,从中可以发现这些问题。

(2)在程序中的适当位置添加一些语句,用来显示要查看的重要变量的值。

(3)在 M 文件中选定的位置添加keyboard 语句,以便将临时控制权交给键盘,等待用户输入。

(4)可以通过在M文件开头函数的定义语句之前添加注释号%把函数变成一个脚本M文件,这样在出现错误的时候就可以查询这个工作区。

(5)如果考虑的问题比较复杂,则可以用MATLAB 的Debug调试工具,使用help函数查看Debug调试工具的命令。

7 MATLAB编程技巧

MATLAB 语言是一种解释型语言,其执行速度不是很理想。为了提高执行速度,根据经验我们给出一些小技巧:

(1)尽量避免使用循环(如for循环和while循环),而选择使用矢量化。

(2)在必须使用循环的情况下,应该在外面的循环执行循环次数少的,而在里面的循环执行循环次数多的,这样也可以显著提高速度。

(3)在定义大型矩阵时,建议用MATLAB的内部函数如zeros()ones()预先确定维数,然后再进行其他操作。

(4)采用有效的算法可以提高程序的运行速度。

(5)考虑用其他语言,如CFORTRAN语言。按照Mex技术要求的格式编写相应部分的程序,然后编译连接,这样可以显著地加快运算速度。

参考文献

MATLAB从入门到实践(第2版)


http://chatgpt.dhexx.cn/article/IsSehFxy.shtml

相关文章

matlab-m脚本调用simulink无法运行的原因(本身设置了初始化函数

matlab-m脚本调用simulink无法运行的原因&#xff08;本身设置了初始化函数&#xff09; 最近从MATLAB中调用simulink模块老是不成功一直提示如下错误&#xff1a; 该错误的意思是&#xff0c;在运行PosControl这个模块之前&#xff0c;它本身还会运行自己设置的初始化函数In…

Isight与MATLAB联合仿真时出现:无法定位或初始化类(unsupported major minor version 52.0)

文章目录 一、报错页面二、解决方法三、仿真示例四、运行注意事项 一、报错页面 Isight 调用MATLAB的时候&#xff0c;MATLAB页面报错&#xff0c;出现如下页面&#xff1a; 二、解决方法 解决方法如下&#xff1a; 双击malab组件 1.选择options 2.Drive Matlab with Jav…

VS2019调用Matlab2019b生成的dll时初始化异常

VS2019调用matlab动态链接库遇到的问题 在Visual Studio中使用C调用Matlab程序VS与MATLAB版本选择VS与MATLAB混编的环境配置初始化异常的解决0xc0000005处理Debug错误&#xff1a;xsd_binder::MalformedDocumentError 在Visual Studio中使用C调用Matlab程序 我目前在写一个用V…

MATLAB一直显示“正忙”或“初始化”

解决方案 1 MATLAB 在启动时&#xff0c;一直停留在“正在初始化”的状态&#xff0c;有可能是因为 MATLAB 一直在找着本机的许可证。 有可能是设置了 LM_LICENSE_FILE 的环境变量。这个变量告诉 MATLAB 或者其他应用程序去哪里查找许可证文件。如果您有一个网络许可证&#xf…

C++和MATLAB混合编程——初始化mwArray失败解决方法!

首先&#xff0c;按这样设置&#xff0c; [填坑]VS2017与MATLAB2016b混合编程&#xff08;生成dll方式&#xff09;_清凉简装的博客-CSDN博客_matlab生成dllMATLAB 生成 dll 前的工作1、配置MATLAB环境控制面板->所有控制面板项->系统->高级系统设置->高级->环…

MATLAB打开后一直在初始化,或者初始化很慢问题

问题描述&#xff1a;遇到MATLAB启动较慢&#xff0c;进入主界面后&#xff0c;一直停留在“正在初始化”的状态。浪费很多时间。这种问题大多是因为MATLAB软件在启动时寻找本机的许可证或者是设置了 LM_LICENSE_FILE 的环境变量。这个变量告诉 MATLAB 或者其他应用程序去哪里查…

解决MATLAB一直初始化,加速MATLAB

之前&#xff0c;在做课设时&#xff0c;遇到MATLAB启动较慢&#xff0c;进入主界面后&#xff0c;一直停留在“正在初始化”的状态。浪费很多时间。逛了逛MATLAB中文社区&#xff0c;发现这种问题大多是因为MATLAB软件在启动时寻找本机的许可证或者是设置了 LM_LICENSE_FILE 的…

QT和matlab混合编程以及maltab程序化初始化失败

一. 内容简介 需要用QT调用matlab代码完成计算&#xff0c;并获取计算结果。 二. 软件环境 2.1QT 5.14.1 新版QT6.4,&#xff0c;6.5在线安装经常失败&#xff0c;而5.9版本又无法编译64位程序&#xff0c;所以就采用5.14.1这个用的比较多也比较稳定的一个版本。 QT编译器…

Matlab R2018a初始化问题

前几天装的MATLAB2018&#xff08;我装在C盘&#xff0c;用的是在线安装&#xff0c;自己下的License破解了&#xff09;&#xff0c;但是初始化问题一直没解决&#xff0c;下面显示我遇到的问题&#xff1a; 等4-5分钟才就绪&#xff0c;真的很浪费时间&#xff0c;然后百度别…

Matlab一直初始化进不去程序之一种解决办法

很多解决办法不行的时候你可以试试在设置里把区域改成中国 究其原因可能是因为破解版的是中国的&#xff0c;然后在联网使用matlab时IP认证不通过

matlab初始化界面卡住,Matlab初始化initializing极慢解决方法

Matlab初始化initializing极慢解决方法 Matlab升级以后&#xff0c;功能的确丰富了好多&#xff0c;有些函数也更加人性话了&#xff0c;好多bug也没有了。但是可恼的是&#xff0c;这个该死的家伙却一天比一天肥&#xff0c;MATLAB7.6a居然达到了3.76G&#xff0c;启动和打开…

12306购票辅助工具

前段时间在GitHub上看到一段刷票的脚步代码&#xff0c;下下来稍稍改了下加了个简陋的UI界面&#xff0c;另外把车站列表等信息弄成了csv文件&#xff0c;方便不改源码的情况下添加车站。 先上核心内容&#xff1a; try:if hasattr(print_func, __call__):print_func(开始刷票…

全网首发:12306抢票算法大曝光?(十张图搞定)

前言 相信大家都有过抢票、刷票的经验&#xff0c;每年年底&#xff0c;这都是一场盛宴。 然而&#xff0c;你有没有想过12306的抢票算法是怎么实现的呢&#xff1f; 没有吧&#xff0c;想过&#xff0c;还是没有头绪&#xff1f; 今天&#xff0c;我们就来曝光让人又爱又恨…

12306自动刷票下单-查票下单

前言 上篇写了12306登录&#xff0c;隔了快一个月了&#xff0c;才准备动手写下单篇&#xff0c;真的要非常感谢博客园的 Asimple朋友&#xff0c;如果不是看到你的留言&#xff0c;我几乎都忘了要写下篇了&#xff0c;这一点在简书上就不好&#xff0c;都没人看/(ㄒoㄒ)/~~&a…

python+selenium实现12306自动登录刷票抢票(自己做黄牛?!)

上一篇写了12306的自动登录破解验证图https://blog.csdn.net/weixin_38283159/article/details/86498159 这篇算是它的后续部分加上了简单的刷票和预订功能&#xff0c;毕竟登录一下没什么实际价值嘛 博主曾被黄牛挣过一百大洋至今还耿耿于怀&#xff0c;不清楚他们到达是如何抢…

转载--12306刷票记

转载自&#xff1a;http://www.360doc.com/content/13/0122/17/453497_261790962.shtml 我也记不清啥时候动了写bot刷票这个念头的。原因很简单&#xff0c;我一直认为作为一个以代码谋生的不合格程序员&#xff0c;只有把生产工具用好&#xff0c;才能增加自己存在的价值。 首…

12306自动刷票下单-查票下单(二)

前言 上篇写了12306登录&#xff0c;隔了快一个月了&#xff0c;才准备动手写下单篇&#xff0c;真的要非常感谢博客园的 Asimple朋友&#xff0c;如果不是看到你的留言&#xff0c;我几乎都忘了要写下篇了&#xff0c;这一点在简书上就不好&#xff0c;都没人看/(ㄒoㄒ)/~~&a…

快过年了,Python实现12306查票以及自动购票....

马上就要过年了&#xff0c;听说还有人买不到票&#xff1f; 不要慌&#xff0c;今天咱们来用Python做一个自动查票抢票的脚本&#xff0c;24小时抢票&#xff0c;谁抢的过你&#xff01; python实现12306自动抢票查票 准备工作爬虫思路 准备工作 环境 Python 3.8Pycharm 插…

12306智能刷票,订票

乐在分享 python版本支持 2.7.10 - 2.7.15 依赖库 依赖若快 若快注册地址&#xff1a;http://www.ruokuai.com/client/index?6726 推荐用若快&#xff0c;打码兔平台已经关闭项目依赖包 requirements.txt安装方法 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r…

12306自动刷票下单-下单

12306自动刷票下单-登录 12306自动刷票下单-查票预定 下单 进入下单界面了 https://kyfw.12306.cn/otn/confirmPassenger/initDc 还有一个请求https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs 仔细看一下返回值&#xff0c;是我们常用联系人的信息&…