0%

MATLAB 基础

MATLAB 是 MATrix LABoratory 的缩写,它将计算、可视化和编程功能集成在非常便于使用的环境中,是一个交互式的以矩阵计算为基础的科学和工程计算软件。其特点如下:

  • 编程效率高 用它编程犹如在纸上书写公式,编程时间和程序量大大减少。
  • 计算功能强 其数据对象为不必指定维数的矩阵和数组,矩阵和向量计算功能特别强。
  • 使用简便 其语言灵活方便,将编译、连接、执行融为一体。
  • 易于扩充 用户根据需要建立的文件可以和库函数一样被调用,提高了效率、扩充了计算功能

此外 Matlab 还有很方便的绘图功能。

简单的数学运算

1
2
3
4
5
6
>> 4+6+2 % 键入回车, 下同
ans=
12
>> 4*25+6*52+2*99
ans=
610

注:

  1. 未指明建立变量时名为 ans 的变量自动建立 (作为结果的默认变量名)
  2. 在大多情况下 Matlab 不会理会空格的存在。
1
2
3
4
5
6
7
8
9
10
11
12
>> a=4;
>> b=6;
>> c=2; % 语句后加分号则语句被执行后不显示结果。
>> item=a+b+c
item=
12
>> cost=a*25+b*52+c*99
cost=
610
>> average=cost/item
average=
50.837

在 Matlab 中基本的数学运算符号: + - * 右除/ 左除\ ^

在 Matlab 中不管多少层括号,统一用小括号 ()

复数:Matlab 在处理复数时 ij 均表示虚数单位

1
2
3
4
5
>> c1=1-2i
>> c2=1-2j
>> c3=6*sin(.5)*i
>> c3r=real(c3) % 获取c3的实部
>> c3i=imag(c3) % 获取c3的虚部

一个“=”表赋值 两个“==”表“等于”关系

为了核对某个变量的值只需要在提示符后输入这个变量名。可以用 whowhos 来查看内存中 (工作区中) 现有的变量名列表。为了重新输入原来输入过的命令可以用键盘的上、下键。

矩阵 数组 函数

矩阵的输入和运算

输入方法:

  1. 直接输入每个元素,用逗号或空格及分号隔开
  2. 由语句或函数生成
  3. 在 m- 文件中生成

矩阵的直接输入举例

1
2
3
4
>> A=[1 2 3;4 5 6]    % [表矩阵输入的开始,]表矩阵输入的结束
A =
1 2 3
4 5 6

元素的引用

1
>> a=A(2,1)    % 表示A的第二行第一列的元素

注:若不指定变量名 Matlab 自动生成一个 ans 变量(answer)

1
2
3
4
5
>> A(3,4)=1
A =
1 2 3 0
4 5 6 0
0 0 0 1

原来 A 没有 3 行 4 列,Matlab 自动增加行、列,对未指明的元素赋初值为 0.

函数生成矩阵

1
2
3
4
>> w=zeros(2,3)    % (2×3元素全为0矩阵)
>> u=ones(3) % (3×3元素全为1矩阵)
>> v=eye(3,4) % (3×4对角线为1矩阵)
>> x=rand(1,3) % (1×3 (0,1)均匀分布矩阵)

矩阵的裁剪与拼接

从一个矩阵取出若干行 (列) 构成新矩阵称为裁剪。: 是一个非常重要的裁剪工具

1
2
3
4
5
>> A(3,:)           % A的第三行, “:”表示“所有”
>> A(:,2) % A的第二列
>> B=A(1:2,:) % A的第一、二行, “:”表示“到”
>> C=A(:,2:4) % A的第二列到第四列
>> D=A(2:3,2:2:4) % A的第2、3行, 第2、4列

(2:2:4 表从第 2 到第 4,步长 2 (步长也可以为负))

1
2
>> A(1:2:3,4:-1:2)  % A的第1、3行, 第4、3、2列
>> D(:,1)=[ ] % 删除D的第一列

若无等矩规律,最一般的状况:设 $A$ 为一四阶方阵选取任意子矩阵:
A([1,2,4],[1,3,4]) 选取的行数构成一行向量,选取的列数构成一行向量二者用逗号分隔。

将几个矩阵拼接在一起时只需要注意:左右拼接时行数要相同,上下拼接时列数要相同。

矩阵的运算

+ - / * ^ \\为左除, /为右除,说明如下:

设定 $A$ 为可逆矩阵,$Ax=b$ 的解是 $A$ 左除 $b$,即 x=A\b
$xA=c$ 的解 $x$ 是 $A$ 右除 $c$ 即 x=c/A.

特别注意:.** 的区别 .* 为对应位置元素运算,* 为矩阵意义的运算.

.^^.//.\\ 类似

rref(B) 所做工作:将 $B$ 化为行阶梯型最简形

$B=[A,b]$ 经过初等变换 $[A^{-1} A, A^{-1} b]$ 变成 $[E,x]$.

数组及其运算

一行或一列的矩阵是向量或数组。

数组的输入 :linspace (注意用法的区别)

1
2
3
4
5
6
7
>> a=1:5       % 默认公差为1
a=
1 2 3 4 5
>> b=1:2:7 % 与 b=1:2:8 效果相同 (公差可以为负)
>>c=6:-3:-6 % (从6到-6公差为-3的等差数组) 格式:a:dt:b
>>b=[0:2:8,ones(1,3)] % 数组与行向量拼接
>>linspace(0,1,9)

linspace(a,b,n) 生成从a到b共n个数值的等差数组,公差 (b-a)/(n-1),公差为 1 时不必给出。

例:4 等分 $\pi$ 的数组

1
2
3
>>x=0:pi/4:pi
% 或者
>>x=linspace(0,pi,5)

数组的运算: + - .* .^ .\ ./
数组的运算是对应位置元素的运算

语句 变量 表达式

语句形式:变量=表达式

若 “变量=” 省略,名为 ans 的变量自动被建立。表达式后用回车,则在工作区显示结果,如果表达式后用分号 ; 结束,则 Matlab 会计算,但不显示结果。一行中可以写几个语句,它们之间用逗号或分号隔开。

变量

Matlab 有它自己的一套变量命名规则

  1. 变量名区分大小写 Cost cost CoST 不同
  2. 变量名最多包含 31 个字符,其后的字符被忽略
  3. 变量名必须以一个字母开始,其后可以是限定条件内的任意数量的字母、数字、下划线,不允许出现标点符号。

错误范例:2a _abc

Matlab 关键字不能用作变量名 保留字列表:

for end if while function return elseif case

otherwise switch continue else try catch

global persistent break

用户如果把这些保留字用作了变量名,Matlab 将会给出一条错误信息,但是用户可以将这些保留字中的某个字母改成大写,这样就可以用与这些保留字类似的词作变量名了。但是“不推荐”。

变量命名

变量名称应该表示其含义或用途。

1
z = x * y

对于程序阅读者来说,下面的表示更好

1
wage = hourlyRate * nHours

例子参考 MATLAB Style Guidelines 2.0

Matlab 的特殊变量

ans 用作结果的默认变量名
beep 嘟嘟声
pi 圆周率
eps 浮点相对误差限 (22204×10-16)
Inf 无穷大,比如 1/0
NaN 不定值 比如 0/0
ij 虚数单位
realmin realmax bitmax 最大正整数

字符串为由单引号括起来的字符集合,可以像向量一样进行裁剪和拼接。

函数

标量函数 (函数名均为小写)

三角函数:
sin(弧度) cos tan cot sec csc asin acos atan acot

asec acsc sinh cosh tanh asinh acosh atanh

其他基本函数:
sqrt exp(x) log (表数学上 $ln$ 函数), log10 (表数学上 $lg$ 函数)

abs round floor (表达 $[x]$) ceil (表示 $[x]+1$) fix (向 0 方向取整)

sign real imag angle 获取辐角 conj rat

以上这些函数本质上是作用于标量的,当它们作用于矩阵或数组时是作用于矩阵或数组的每一个元素。举例:

1
2
>> x=(0:0.2:1).*pi;   % x是有6个元素的行向量
>> y=sin(x) % y也为6个元素的行向量

另一个计算函数值的命令是 feval(F,x),F 是表示函数名的字符串。如:

1
2
>> x=(0:0.2:1).*pi;    
>> y=feval(‘sin',x) 可以得到与上面一样的结果。

向量函数

此类函数作用于行向量或列向量时才有意义,称为向量函数,这些函数作用于矩阵时,其结果为一个行向量,行向量的每个元素是函数作用于矩阵的相应列向量的结果。常用的有:

max min sum length mean median prod 连乘 sort 排序

具体用法 [y,z]=sort(x)

矩阵函数

Matlab中处理矩阵的函数大体分为两大类:构造矩阵的函数与进行矩阵计算的函数。对前者常用的有:

zeros (0 阵) ones (1 阵) eye (单位阵) rand (随机阵)

randn diag 提取或者生成对角阵 triu tril

对后者常用的有:
size (阶数) det (行列式) rank (秩) inv (矩阵求逆) eig (特征值) trace (迹) norm (范数) cond (条件数)

lu (LU分解) orth (正交规范化) rref(A) 将A化成行阶梯形的最简形式,其中单位阵是极大线性无关组,其他列向量的坐标值为其对应列向量由该无关组表示的系数

命令和窗口环境

数据显示格式

Matlab 在显示数据结果时遵循如下原则:如果数据是整数则显示整数,如果数据是一个实数,缺省情况下显示小数点后4位数字。用户可以在 ?File 菜单下 Preference 菜单项或在命令窗口提示符下键入相应的 format 命令来指定其他数据格式

1
2
3
4
5
6
7
8
Matlab命令               pi效果                说明
format short 3.1416 缺省 ,小数点后4位
format long 3.14159265358979 15位数字
format short e 3.1416e+000 小数点后4位+指数
format long e 3.141592653589793e+000 15位数字+指数
format bank 3.14 短紧缩格式
format + + (+)(-)(0)
format rat 355/113 有理数近似

注意:format 只提供选择不同的显示格式,Matlab并没有改变数字的内部存储格式,仅是显示改变了而已。所有的计算仍然是用双精度计算的。

Matlab工作区

它是用来接受 Matla b命令的内存区域

  1. 显示: who whos disp() 显示变量的内容
  2. 清除:clear clear A clear C* (清除所有以C打头的变量)
  3. 储存:save 用法: save 文件名 变量名
  4. 调出:load 用法: load 文件名
  5. 记录:diary 用法: diary filename diary off 停止记录
  6. 搜索: Matlab文件所在的所有目录的列表被称为 Matlab 的搜索路径 Matlabpath

在Matlab启动时它将默认的搜索路径定义为它存储其文件的所有目录。修改方法是用路径浏览器 File->Set path项,更改的目的是将用户自己的包含 Matlab 文件的目录加入到搜索路径中。

MATLAB 程序控制结构

M 文件

分类:

脚本文件 (Script File)
函数文件 (Function File)

区别:

  • 脚本文件没有输入,没有返回;
  • 脚本文件可以对工作空间的变量操作,结果返回工作空间,而函数文件中的变量为局部变量,函数执行完毕,变量被清除;
  • 脚本文件可以直接运行,函数文件见需要调用的形式运行 (除了特殊的函数文件外)。

顺序结构

按照代码顺序执行,即顺序结构,受控于代码前后位置;
使用于顺序结构中的简单输入和输出 (命令交互):

数据输入 (input 函数)

1
>> A=input(‘输入一个参数')

数据显示 (disp 函数)

1
>> disp(A)

程序暂停 (pause 函数)
->>pause(3)暂停 3 秒

分支结构

分支结构,又称为选择结构,包括 if 分支,switch 分支和 try 分支。

1、if 分支语句:

1
2
3
4
5
if 条件
语句组 1
else
语句组 2
end

2、switch 分支语句

1
2
3
4
5
6
7
8
9
10
11
switch 表达式
case 表达式 1
语句组 1
case 表达式 2
语句组 2

case 表达式 n
语句组 n
otherwise
语句组 m
end

3、try 分支语句

在经典的程序设计语言中未出现,这是一种试探性的分支语句,也就是如果这条语句执行有错误,则不执行,或者执行其他的语句,提高了程序的容错性能。

1
2
3
4
5
try
语句组 1
catch
语句组 2
end

循环结构

按照给定条件,重复执行某些语句,包括 for 循环和 while 循环。

1、for 循环语句

1
2
3
for 循环变量=表达式 1:表达式 2:表达式 3  % 可以采用矩阵的形式
循环体
end

注意循环变量自动增加,在循环体内对循环变量的赋值操作会带来不可预料的程序执行。

2、while 循环语句

1
2
3
while 条件
循环体(break 命令可跳出)
end

循环可以嵌套,但是在 MATLAB 中,循环的执行效率很低,因此应该尽量避免使用循环,更要避免使用两重以上的循环。

怎样避免使用循环和提高循环效率?

  • 有些可以通过 MATLAB 的矢量化语言,通过矩阵或者向量操作完成;
  • 有些可以通过 MATLAB 提供的一些特殊操作工具箱函数完成;
  • 预分配的使用,会大大增加循环效率。

函数文件

1、基本结构:

1
2
3
function [输出形参]=函数名([输入形参]
[注释说明]
函数体

关于函数文件名:通常和函数名一致,如果不一致,那么忽略函数名,调用时使用函数文件名。

注释部分:注释部分可以提供 help 以及 lookfor 命令的查找功能,例如:

1
2
3
4
5
6
7
8
9
10
11
function y = add_fun(a,b)
% ADD_FUN 完成变量 a 和 b 的相加
% 输入: a 加数 1
% b 加数 2
% 输出: y 为两个参数相加之和
%
% $Author:Name
% $Date: 2020.08
% Version: V1.0

y = a + b

对命令行进行注释快捷方式 Ctrl+R,解除注释 Ctrl+T

2、函数参数的可调识别函数

可以完成传递参数的可调功能,类似于高级语言中的函数重载和多态。

  • nargin 返回传递给该函数调用的输入参数的数目,仅可在函数体内使用;
  • nargout 返回该函数调用中指定的输出参数的数目;
  • varargin 可变长度输入参数列表;c=varargin{1}
  • varargout 可变长度输出参数列表;

前两者为输入输出参数个数,后面两个可以代表未知的输入输出变量。
error(nargchk(2,4,nargin)) 检测 nargin 的范围在 2 到 4,如果超出则报错。

3、全局变量
使用 global 声明,可以提供不同的 M 文件访问同一个变量。
不同的函数之间访问同一个变量,可以通过返回参数来设置,或者使用全局变量。

4、程序调试
断点和单步;
根据错误提示,初步确定错误内容;

图形功能

plot 函数

基本用法:plot(x,y)
一般要求:xy 为相同尺度的向量。

特殊用法:

  1. x 为向量,y 为矩阵,其中一维与 x 长度相同,则绘制多条不同色彩的曲线;
  2. xy 为同维的矩阵,以对应列绘制不同色彩的曲线;
  3. plot 有一个参数,若 x 为实数向量,则绘制折线图,若 x 为复数向量,则以实部和虚部为横坐标绘图;
  4. 多个输入参数;
  5. 曲线选项。
1
plot(x,y1,'k:',x,y2,'b-')

示例:

1
2
>> y=[0  0.58  0.70  0.95  0.83  0.25];
>> plot(y)

此时生成的是以序号1, 2, …, 6 为横坐标、数组 y 的数值为纵坐标的折线。

示例:

1
2
3
4
>> x=linspace(0,2*pi,30);
>> y=sin(x);
>> plot(x,y)
>> title('sine wave')

matlab-basic-plotex.png

也可以在同一幅图上绘制多条曲线或直线

1
2
3
>> z=cos(x); plot(x,y,x,z)
%或
>> w=[y;z]; plot(x,w) % 二者效果相同。

用户也可以用 hold on 命令在一个已经存在的图形上添加新的图形,当用户输入hold on 命令后,在用户输入新的 plot 函数时,Matlab 不会将现有的坐标轴删除,如果新数据超出了当前坐标轴的限定范围,Matlab 就将坐标轴重新刻度。输入 hold off 命令就将当前图形窗口释放,用以绘制新的图形。

示例:

1
2
3
4
5
6
7
8
>> x=linspace(0,2*pi,30);  y=sin(x);  z=cos(x);
>> plot(x,y)
>> hold on
>> is hold % return 1 (true) if hold is on
ans=
1
>> plot(x,z,'m')
>> hold off

线型、颜色

用户可以通过在 plot 函数的每一组数据组对后添加第三个参数,声明用户自己的颜色、标记和线型。这个参数(可选)是一个字符串,放在单引号中。plot(x,y,‘s')

具体参数含义:

b 蓝色 g 绿色 r红色 c 青色 m 洋红 y 黄色 k 黑色 w 白色

.o 圆圈 + 加号 * 星号 s 方形 d 菱形 v ^ < > 三角形 (开口不同)

- 实线 : 点线 -. 点划线 -- 虚线 p 五角星 h 六角星

matlab-basic-plotpa.png

网格与标记

1
2
3
4
5
6
7
>> grid on   % 将格栅线添加到当前图形中
>> grid off % 取消格栅线
>> grid % 切换格栅线状态
>> box off % 去掉边框
>> xlabel(‘内容') % 横坐标添加标记
>> ylabel(‘内容') % 纵坐标添加标记
>> title(‘内容') % 图形上方添加标记

用户可以用 text 函数在用户图形的任何指定位置给图形添加一个标签或者其他文本字符串。语法为:text(x,y,'string'),其中 (x,y) 标明了以图形坐标轴的单位表示的文本字符串左边界的位置。更方便的是用鼠标确定字符串的位置,函数为 gtext(‘string')

坐标轴控制

1
2
3
4
5
6
7
8
axis equal  % 矩形的坐标轴
axis square % 正方形的坐标轴
axis auto % 自动坐标轴显示
axis off % 关闭坐标轴
axis on % 打开坐标轴
axis([xmin xmax ymin ymax]) % 设置坐标轴的显示范围
xlim([xmin xmax]) % 设置 x 坐标的显示范围
ylim([ymin ymax]) % 设置 x 坐标的显示范围

多幅图形

一个图形窗口可以包含多套坐标轴系。命令 subplot(m,n,p) 将当前窗口分成一个维数为 $m\times n$ 的绘图区域数组并将第 p 个绘图区域选定为当前绘图区域,编号规则为从最上边一行开始从左往右,然后第二行从左往右,一直到最后一行进行编号。

1
2
3
4
5
>> x=linspace(0,2*pi,30);  y=sin(x);  z=cos(x);
>> a=2.*sin(x).*cos(x); v=sin(x)./(cos(x)+eps);
>> subplot(2,2,1),plot(x,y), axis([0,2*pi,-1,1]), title(‘sin(x)')
>> subplot(2,2,2),plot(x,z), axis([0,2*pi,-1,1]), title(‘cos(x)')
>> subplot(2,2,3),plot(x,a),......

基本底层绘图函数

1、line 对象和 line 函数

示例:h = line([-pi:0.01:pi],sin([-pi:0.01:pi]))
产生 line 对象,h 为 line 对象的句柄

line 对象的修饰:
Color 属性;
LineWidth 属性;
LineStyle 属性;
Marker 属性;
MarkerSize 属性;
plot 绘制的图形也是 line 对象,可以通过 line 对象的修饰方法后期修饰。

1
2
3
h = line('XDate',[-pi:0.1:pi],'YDate',sin([-pi:0.1:pi]),...
'LineWidth',1,'LineStyle',':','Color','r')
set(h,'LineWidth',2,'Marker','p','MarkerSize','3')

2、底层标注

text 对象和 text 函数

常用修饰:
Color 属性;
String 属性;修改标注的内容
FontSize 属性;
Rotation 属性;

3、底层坐标轴的控制

axes 对象和 axes 函数

修饰:
Box 属性;
GridLineStyle 属性;网格线型
Position 属性;
Units 属性;可以设置单位为归一化 normalized,便于图形缩放
XLabel、YLabel 和 ZLabel 属性;
Xlim、Ylim 和 Zlim 属性;