一、认识MATLAB
1. MATLAB概述
(1)在欧美各高等学校, Matlab成为线性代数、自动控制理论、数字信号处理、时间序列分析、动态系统仿真、图像处理等诸多课程的基本教学工具,成为本科生、硕士生和博士生的必须掌握的基本技能。
(2)在设计研究单位和工业部门, Matlab已被广泛地用于研究和解决各种具体的工程问题。
(3)可以预见,Matlab将在我国科学研究和工程应用中发挥越来越大的作用。
2. MATLAB特点
功能强大
-
数值运算优势
-
符号运算优势
-
强大的2D、3D数据可视化功能
许多具有算法自适应能力的功能函数
-
MATLAB以数组为基本计算单元
-
具有大量的算法优化功能函数
-
编程易、效率高
语言简单、内涵丰富
-
语言及书写形式非常接近于常规数学书写形式
-
完备的帮助系统,易学易用
MATLAB主页面
3. 命令窗口的使用
MATLAB命令窗口
“>>”与光标的闪烁一起说明系统就绪,等待输入;
在命令行窗口【Enter】键提交命令执行;
计算2+[(13-7)×8]÷23
MATLAB所用的运算符如(加减乘除等)是各种计算程序中常见的;
计算结果中的“ans”是英文“answer”的缩写,是MATLAB预定义的变量;
4. 创建M文件
当简短的几行代码无法完成任务时,需要建立M脚本,将所有代码放在一个脚本文件里,按顺序执行。
点击新建,选择新建一个脚本还是新建一个函数,脚本文件可以直接执行,函数文件需要在脚本文件或者是命令行窗口调用之后才可使用。
新建的函数文件带有默认的返回变量、形参及函数名,按需要修改,在函数体内编辑代码即可。
5. 目录和文件管理
当前文件夹包含了工作目录下的详细文件列表,可以选择运行M文件,装载mat数据和编辑文件等功能。运行时,鼠标右键点击打开即可。
更改当前工作目录时,点击右侧下拉箭头,重新选择即可。
在Matlab中,所有文件都通过一组严谨的目录文件夹结构进行管理,在进行文件、函数和数据搜索时,Matlab会按照既定的搜索路径进行搜索。检查的次序大致为:首先检查搜索的内容是否为变量;如果不是变量,那么检查是否为内置函数;如果不是内置函数,那么检查当前工作目录下是否有M文件形式的搜索目标,如果没有,将在其他设定的搜索路径中搜索。
6. 搜索路径管理
如果用户有多个文件需要和Matlab进行信息交互,或者说经常需要进行数据交换,可以将这些文件放到Matlab的搜索路径上,保证做这些文件可以在搜索路径上被调用。如果某个目录需要运行产生的数据和文件,需要将该目录设为当前工作目录。如果用户需要修改搜索路径,可以在命令行窗口输入pathtool命令。
用户可以单击“添加文件夹”,将新的路径加入到搜索路径中,如果需要搜索的路径还包含子文件夹,则单击“添加并包含子文件夹”。
如果需要对已经加入到搜索路径中的文件夹搜索顺序进行调整,可以选择“移至顶端”、“上移”、“下移”、“移至底端”四个按钮来移动文件夹的位置。
二、MATLAB基础知识
1. MATLAB简单计算
在没有定义变量名称时,数据暂存在ans中。定义变量之后,变量意义明显,计算过程一目了然。
利用Matlab可以很容易地实现函数曲线的计算和绘制。
2. 基本运算符号
Matlab进行数学处理时的优先级顺序和通常进行数学处理的优先级顺序一致。指数优先;乘、除次之;括号改变优先级,表达式从左到右依次运算。
3. 数值、变量及表达式
数值记述:
MATLAB的数只采用习惯的十进制表示,可以带小数点和负号,缺省了双精度浮点型数据。
例如:3 -10 0.001 1.3e10 1.1343e-6
变量命名规则:
1、变量名、函数名对字母区分大小写;
2、变量名可以包含英文字母、下划线和数字,但必须以英文字母开头;
3、变量名最多可以包含63个字符。
MATLAB预定义变量:
4. 数组
(1)数组生成
一维数组
1、 直接输入法:通过空格、逗号和分号来分隔数组元素,在数组中输入任意元素,生成一维数组。
2、步长生成法:x = a : step :b
3、等间距线型生成法:x =linspace(a,b,n),在a到b区间内生成n个采样点数据。
二维数组
1、 直接输入法,同行之间元素用逗号或空格分隔,不同行之间用分号分隔。
2、 调用内置函数,如zeros,ones,rand等。
3、低维数组转换,通过reshape,cat等函数将低维数组转换成高维数组。
(2)数组寻访
a=[1 2 3;4 5 6;7 8 9];
a(2,3) a(2,:) a(:,1)
a(1,1:2) a(2,1:end-1) a(1,:)=[] a([1,3],[2,3])
排序函数:
[As,idx] = sort(A)
[As_r,idx_r] = sortrows(A)
子数组搜索
[i,j] = find(A>0.5)
k = find(A>0.5,1)
最大最小值搜索
[mx,rx] = max(A)
[mn,rx] = min(A)
三、编程基础
1. 流程控制
(1)for循环结构
for循环结构中,需要设定一定的循环条件,Matlab根据设定的循环次数执行循环体内的命令。
for x = array
commands
end
其中,x是循环变量,array是条件数组,commands是要执行的循环代码。循环体的执行次数由array决定。
%for循环结构示例
for n = 10 : -1 : 1
x(n) = sin(n * pi / 5);
end
x
array = ceil(rand(1,10) * 10);
for n = array
x(n) = sin(n * pi / 5);
end
x
(2)while循环结构
while循环结构对循环体进行无限次的循环运算,直到循环体满足循环结束条件,或达到一定的循环次数后终止。
while expression
commands
end
其中,expression是条件表达式,一般情况下,expression的计算结果是一个标量,但也可以是一个数组表达式。当标量结果为true时,循环体一直被执行下去;当expression的结果是一个数组时,只有当数组中所有元素均为true时,循环体才会被执行。
%while循环结构示例
%求浮点数eps的精度
EPS = 1;
num = 0;
while (EPS + 1 ) > 1
EPS = EPS / 2;
num = num + 1;
end
num
EPS = EPS * 2
(3) if判断结构
if判断结构
根据某一给定的条件,来进行判断以执行不同的命令。
if-else-end判断结构
处理判断条件为true或false时,分别执行不同的命令行。
if expression
commands
end
if expression
commands1
else
commands2
end
当expression包含多条子逻辑表达式时,Matlab采用“避绕式”计算各表达式,例如(expression1 | expression2),当计算expression1为false才会计算expression2.
%if判断结构示例
%求一元二次方程a*x^2 + b*x +c = 0的根
a = 2; b = 3; c = 5;
delta = b^2 - 4*a*c;
if delta > 0
x1 = (-b+sqrt(delta))/(2*a)
x2 = (-b-sqrt(delta))/(2*a)
elseif delta == 0
x1 = (-b+sqrt(delta))/(2*a)
else
real_a = -b/(2*a);
imag_b = sqrt(abs(delta)) / (2*a);
x1 = real_a - imag_b*i
x2 = real_a + imag_b*i
end
2. 控制命令
在编写Matlab的M文件时,常常用到各种流程控制结构,这些流程结构执行过程中,常常需要提前终止循环、跳出子程序等操作,需要使用控制语句来实现,这里主要介绍常用的continue和break语句。
continue命令主要用在循环语句中,提前结束循环体的本次操作,将continue直接放在循环控制体内,以配合if判断语句使用。
break命令和continue命令一样都用在循环结构中,当执行break命令时,程序跳出循环结构,转移到循环之外的下一条语句。
continue命令使程序跳转到循环的end语句处,结束一次循环,而break命令使程序跳出break所在的循环体。
%continue break控制语句示例
%计算浮点数eps的精度
EPS = 1;
for n = 1:1000
EPS = EPS / 2;
if (1 + EPS ) >1
continue
end
EPS = EPS * 2;
break;
end
EPS
3. 程序向量化概念
向量化处理时Matlab的一个特殊概念,程序向量化是指用向量化语句来代替循环结构,因为向量化处理,数据是提前分配好内存的,所以运行速度要快很多。
程序向量化举例
计算某个数组每个元素的平方,采用向量化和循环结构两种方法实现。
%循环结构
for i = 1:100
s1(i) = i^2;
end
%向量化处理
s2 = [1:100].^2;
%循环结构
tic
num_max = 1000000;
for i = 1:num_max
s1(i) = i^2;
end
toc
%向量化处理
tic
s2 = [1:num_max].^2;
toc
4. 逻辑数组和向量化
Matlab除了基本的数值数据类型和字符串之外,逻辑数据也是一种数据类型。逻辑数据可以通过关系和逻辑表达式来创建,也可以通过logical命令来创建逻辑数组。
逻辑数组在向量化的过程中,有非常重要的作用,我们可以通过使用逻辑数组来完成向量化的过程。
%循环结构
tic
num_max = 1000000;
for i = 1:num_max
if i < 500000
s1(i) = i^2;
else
s1(i) = i;
end
end
toc
%向量化处理
tic
a = 1:num_max;
s2 = a(a<500000).^2;
toc