MATLAB 快速入门 2023《信号与系统实验》 sd04031260-0 (1) 桌面基础知识 使用 MATLAB 时,可发出创建变量和调用函数的命令。例如,通过在命令行中 键入以下语句来创建名为 a 的变量: Here! MATLAB 将变量 a 添加到工作区,并在命令行窗口中显示结果。 a = 1 (标有灰色背景的语句为需要在命令行中输入的代码) a = 1 创建更多变量。 b = 2 b = 2 c = a + b c = 3 d = cos(a) d = 0.5403 如果未指定输出变量,MATLAB 将使用变量 ans(answer 的缩略形式) 来存储计算结果。 sin(a) ans = 0.8415 如果语句以分号结束,MATLAB 会执行计算,但不在命令行窗口中显示输 出。 e = a*b; (2) 矩阵和数组 数组创建 要创建每行包含四个元素的数组,使用逗号 , 或空格分隔各元素。 a = [1 2 3 4] a = 1 2 3 4 这种数组为行向量。 要创建包含多行的矩阵,使用分号 ; 分隔各行。 a = [1 2 3; 4 5 6; 7 8 10] a = 1 4 7 2 5 8 3 6 10 创建矩阵的另一种方法是使用 ones、zeros 或 rand 等函数。例如,创 建一个由零组成的 5×1 列向量。 z = zeros(5,1) z = 0 0 0 0 0 矩阵和数组运算 MATLAB 允许使用单一的算术运算符或函数来处理矩阵中的所有值。 a + 10 ans = 11 14 17 12 15 18 13 16 20 sin(a) ans = 0.8415 -0.7568 0.6570 0.9093 -0.9589 0.9894 0.1411 -0.2794 -0.5440 要转置矩阵,请使用单引号 ('): a' ans = 1 2 3 4 5 6 7 8 10 可以使用 * 运算符执行标准矩阵乘法,这将计算行与列之间的内积。例 如,确认矩阵乘以其逆矩阵可返回单位矩阵: p = a*inv(a) p = 1.0000 0 0 0 1.0000 0 -0.0000 0 1.0000 请注意,p 不是整数值矩阵。MATLAB 将数字存储为浮点值,算术运算可 以区分实际值与其浮点表示之间的细微差别。使用 format 命令可以显 示更多小数位数: format long p = a*inv(a) p = 1.000000000000000 0 -0.000000000000000 0 0 1.000000000000000 0 0 0.999999999999998 使用以下命令将显示内容重置为更短格式 format short format 仅影响数字显示,而不影响 MATLAB 对数字的计算或保存方式。 要执行元素级乘法(对应元素相乘,而非矩阵乘法),请使用 .* 运算 符: p = a.*a p = 1 16 49 4 25 64 9 36 100 乘法、除法和幂的矩阵运算符分别具有执行元素级运算的对应数组运算 符。例如,计算 a 的各个元素的三次方: a.^3 ans = 1 64 343 8 125 512 27 216 1000 串联 串联是连接数组以便形成更大数组的过程。实际上,第一个数组是通过将其各 个元素串联起来而构成的。成对的方括号 [] 即为串联运算符。 A = [a,a] A = 1 4 7 2 5 8 3 6 10 1 4 7 2 5 8 3 6 10 使用逗号将彼此相邻的数组串联起来称为水平串联。每个数组必须具有相同的 行数。同样,如果各数组具有相同的列数,则可以使用分号垂直串联。 A = [a; a] A = 1 4 7 1 4 7 2 5 8 2 5 8 3 6 10 3 6 10 复数 复数包含实部和虚部,虚数单位是 -1 的平方根。 sqrt为算术平方根 sqrt(-1) ans = 0.0000 + 1.0000i 要表示复数的虚部,请使用 i 或 j。 c = [3+4i, 4+3j; -i, 10j] c = 3.0000 + 4.0000i 0.0000 - 1.0000i 4.0000 + 3.0000i 0.0000 +10.0000i (3) 数组索引 MATLAB 中的每个变量都是一个可包含许多数字的数组。如果要访问数组的选定 元素,请使用索引。 以 4×4 幻方矩阵 A 为例: A = magic(4) A = 16 5 9 4 2 11 7 14 3 10 6 15 13 8 12 1 引用数组中的特定元素有两种方法。最常见的方法是指定行和列下标, 例如 A(4,2) ans = 14 另一种方法不太常用,但有时非常有用,即使用单一下标按顺序向下遍 历每一列: A(8) ans = 14 使用单一下标引用数组中特定元素的方法称为线性索引。 如果尝试在赋值语句右侧引用数组外部元素,MATLAB 会引发错误。 test = A(4,5) Index exceeds matrix dimensions. 但是,可在赋值语句左侧指定当前维外部的元素。数组大小会增大以便 容纳新元素。 A(4,5) = 17 A = 16 5 9 4 2 11 7 14 3 10 6 15 13 8 12 1 0 0 0 17 要引用多个数组元素,请使用冒号运算符,可指定一个格式为 start:end 的范围。例如,列出 A 前三行及第二列中的元素: A(1:3,2) ans = 2 11 7 单独的冒号(没有起始值或结束值)指定该维中的所有元素。例如,选 择 A 第三行中的所有列: A(3,:) ans = 9 7 6 12 0 此外,冒号运算符还允许使用较通用的格式 start:step:end 创建等距 向量值。 B = 0:10:100 B = 0 10 20 30 40 50 60 70 80 90 100 如果省略中间的步骤(如 start:end 中),MATLAB 会使用默认步长值 1。(大 家可以试一下) (4)工作区变量 工作区包含在 MATLAB 中创建或从数据文件或其他程序导入的变量。例如,下 列语句在工作区中创建变量 A 和 B。 A = magic(4); B = rand(3,5); 使用 whos 可以查看工作区的内容。 whos Name Size A B 4x4 3x5 Bytes 128 120 Class Attributes double double 此外,桌面上的“工作区”窗格也会显示变量(如果之前还建立了其它变量,那 么其它变量也会一起显示出来)。 退出 MATLAB 后,工作区变量不会保留。使用 save 命令保存数据以供 将来使用, save myfile.mat 通过保存,系统会使用 .mat 扩展名将工作区保存在当前工作文件夹中一个名 为 MAT 文件的压缩文件中。 要清除工作区中的所有变量,请使用 clear 命令。 使用 load 将 MAT 文件中的数据还原到工作区。 load myfile.mat (5)调用函数 MATLAB 提供了大量执行计算任务的函数。在执行相应计算时只要调用相应函数 即可,不必再独立编程。 • 要调用函数,例如 max,将输入参数括在圆括号中: A = [1 3 5]; max(A) ans = 5 如果存在多个输入参数,请使用逗号加以分隔,结果为 挑出两个矩阵相对应元素中的较大值: B = [10 6 4]; max(A,B) ans = 10 • 6 5 通过将函数赋值给变量,返回该函数的输出: maxA = max(A) maxA = 5 • 如果存在多个输出参数,请将其括在方括号中(逗号后的变量表示最大值的位置): [maxA,location] = max(A) maxA = 5 location = 3 • 将任何字符输入括在单引号中: disp('hello world') hello world • 要调用不需要任何输入且不会返回任何输出的函数,请只键入函数名 称: clc clc 函数清除命令行窗口。 附主要数学函数及特殊变量 clear/clf/clc 清除内存变量/清除图形/清除命令 行窗口 操作系统 数学函数 cd/pwd 更改目录/显示当前目录 copyfile 复制文件 save 保存变量到文件 load 载入文件中的数据 abs/angle 复数的模/辐角 acos/asin/atan 反余弦/反正弦/反正切 cos/sin/tan 余弦/正弦/正切 cosh/sinh/tanh 双曲余弦/双曲正弦/双曲正切 conj/imag/real 共轭复数/虚部/实部 exp/log/log10 指数函数/自然对数和以 10 为底的 对数 sign/power(x,y) y 符号函数/指数函数(x ),很多时候 用 x^y 或 x.^y 更方便 π pi 特殊变量 特殊运算 inf(或 Inf) 无穷大 nan(或 NaN) 非数错误 i 虚数单位 j ceil 大于函数参数的最小整数 floor 不超过函数参数的最大整数 fix 截尾取整 round 四舍五入取整 .* ./ .^ 相应元素的相乘 相除 乘方 对于非矩阵,推荐使用带有 . 的形 式 = == ~= > >= 赋值 等于 不等于 < <= 大于 大于或等于 小于 于 比较与逻辑 & && ~ | xor(a,b) || 与 非 或 a 和 b 异或 与 或 (不能用于矩阵) 小于或等 对于&&,只要前一个为 False,则不 计算后一个的逻辑值;对于||,只 要前一个为 True,则不计算后一个 的逻辑值。 any(a) a 中有元素非零则为真 all(a) a 中所有元素都非零则为真 (单引号)' .' 共轭转置 转置 inv 逆矩阵 \ 矩阵左除(若已知 Ax=y,则 x=A\y) .\ 数组左除 x=first:increment:last 行向量 x 由 first 到 last,步长为 increment x=linspace(first,last,n) 行向量 x 由 first 到 last 共 n 个元 素 数组操作 A=[x1;x2] 有两行 x1 和 x2 的矩阵 A ones(N,M) N⨯M 的全 1 数组 zeros(N,M) N⨯M 的全零数组 A(i,j) 矩阵 A 的第 i 行第 j 列元素 whos 显示工作空间(Work Space)中的所 有变量 微积分 化简 解方程 size(A) 显示 A 的行数和列数 length(x) 向量 x 的长度 diff 求微分 int 求积分 limit 求极限 taylor 求泰勒级数 symsum 级数求和 simplify 化简 expand 展开 factor 因式分解 solve 求代数方程 dsolve 求微分方程 fourier 傅里叶变换 变换 特殊函数 数字精度 特别说明 ifourier 傅里叶逆变换 laplace 拉普拉斯变换 ilaplace 拉普拉斯逆变换 dirac 狄拉克函数(δ) heaviside 单位阶跃函数 format short 小数点后显示 4 位(默认) format long 小数点后显示 15 位 format rational 以分数形式显示 diff int factor 要获得这些函数的帮助,在命令行 窗口输入 help sym/xxx (xxx 为函 数名),其它则用 help xxx (6) 二维图和三维图 • 线图 要创建二维线图,使用 plot 函数。例如,绘制从 0 到 2π 之间的正弦函数 值: x = 0:pi/100:2*pi; y = sin(x); plot(x,y) • 将两个含有同一自变量的函数同时画在一幅图中,使用 plot3 函数。例 如,绘制从 0 到 10π 之间的正弦和余弦函数值: t = 0:pi/50:10*pi; x = sin(t); y = cos(t); plot3(x,y,t) 思考:如果只需要画出 x 与 y 的函数关系需要如何编程? • 可以标记轴并添加标题。 xlabel('x') ylabel('sin(x)') title('Plot of the Sine Function') • 通过向 plot 函数添加第三个输入参数,可使用红色虚线绘制相同的变 量。 plot(x,y,'r--') 'r--' 为线条设定。每个设定可包含表示线条颜色、样式和标记的字符。标记 是在绘制的每个数据点上显示的符号,例如,+、o 或 *。例如,'g:*' 绘制使 用 * 标记的绿色点线。 附 plot 函数绘图类型 字符 类型 意义 b/g/r/c/m/y/k 颜色 蓝/绿/红/蓝绿/紫红/ 黄/黑 ./x/+/h/*/s/d/v/^/</>/p/o 点型 点/x/六角星/星号/方 形/菱形/下三角/上三 角/左三角/右三角/正 五边形/圆圈 -(或不写)/:/-./-- 实线/点线/点画线/虚 线 • 线型 请注意,为第一幅绘图定义的标题和标签不再被用于当前的图窗窗口 中。默认情况下,每次调用绘图函数、重置坐标区及其他元素以准备新 绘图时,MATLAB 都会清除图窗。 要将绘图添加到现有图窗中,请使用 hold on。在使用 hold off 或关闭窗口 之前,当前图窗窗口中会显示所有绘图。 x = 0:pi/100:2*pi; y = sin(x); plot(x,y) hold on y2 = cos(x); plot(x,y2,':') legend('sin','cos') hold off • 三维绘图 三维图通常显示一个由带两个变量的函数(即 z = f (x,y))定义的曲面图。 要计算 z,首先使用 meshgrid 在此函数的域中创建一组 (x,y) 点。 [X,Y] = meshgrid(-2:.2:2); Z = X .* exp(-X.^2 - Y.^2); 然后,创建曲面图。 surf(X,Y,Z) surf 函数及其伴随函数 mesh 以三维形式显示曲面图。surf 使用颜色显示曲 面图的连接线和面。mesh 生成仅以颜色标记连接定义点的线条的线框曲面图。 试一下看看它们有什么区别。 • 子图 使用 subplot 函数可以在同一窗口的不同子区域显示多个绘图。 subplot(m,n,p) 将图划分为 m×n 块,在第 p 块创建坐标系。例如,在图窗窗 口的 2×2 网格中创建四个绘图,分别展示 sin(t),cos(t),t0.5 和 sinh(t)。 t = 0:pi/10:2*pi; subplot(2,2,1); plot(t,sin(t)); title('sin(t)'); subplot(2,2,2); plot(t,cos(t)); title('cos(t)'); subplot(2,2,3); plot(t,sqrt(t)); title('t^0^.^5'); subplot(2,2,4); plot(t,sinh(t)); title('sinh(t)'); • 除了编程的方式外还可以采用交互方式来绘图,也就是直接在图中对线 宽、颜色、线型、坐标轴、标题等等进行添加或修改。例如,先创建一 幅二位线图: x = 0:pi/100:2*pi; y = sin(x); plot(x,y) 试着点击“插入”菜单,试着添加标题、坐标轴名称与图例等,并使用鼠 标改变坐标轴名称的所在位置(在名称上点一下然后拖动)。在坐标轴上双击, 改变坐标轴的刻度和标尺。点击“编辑-图窗属性”,然后在已添加的标题上双 击一下改变其字体和字号,在已添加的坐标轴名称上双击,改变坐标轴名称的 字体和字号。 练习:画一条正弦曲线,x 从 0 到 2π,步长为 π/10,并添加如下坐标轴名称和 标题,添加图例并将其命名为“data”,修改坐标轴刻度和标尺使其如下所示, 修改线型和粗细并添加标记(○)使其接近下面的图。(π 可通过输入\pi 获得) 注意:在本实验课中,所有的图均要求标注坐标轴名 称和单位(除非单位是 1),若同一张图中有不同的曲 线,需采用不同的线型或标记将其区分,并添加图例! 更多的希腊字母和特殊字符如下表所示: (7) 创建脚本 我们之前都是在命令行窗口中编写 MATLAB 语句的,这样做的一大缺点就是 我们必须在每写完一行后按下回车,如果我们需要修改之前语句中的内容,总 是不得不需要重新把代码输入一遍,效率非常低下。为了方便调试程序并保存 代码,需要创建脚本并在脚本中编写、修改和调试。 点击左上角的“新建脚本”,把任意代码,例如下面的,复制到“编辑器” 窗口中,并保存到合适的文件夹中(可以事先在个人文档中创建一个文件夹用以 保存),然后点击“运行”,查看结果。 x = 0:pi/100:2*pi; y = sin(x); plot(x,y) 试着故意写错代码中的某些地方,保存后再次运行,看看会发生什么?例 如,将代码写成: x = 0:pi/100:2*pi; y = si(x); plot(x,y) 命令行窗口中会显示: 未定义函数或变量 'si'。 出错 Kuaisurumen (line 2) y = si(x); 提示出错原因(Kuaisurumen 是该脚本的文件名,line2 提示第二行有错误)。 注意:在本实验课中,所有程序代码均要求在脚本中 进行编写! (8) 循环与条件语句 MATLAB 中最常用的是 for 循环语句,一般格式为 for 变量名=起始值:步长:终止值 语句 end 下面的例子中变量 v 以 0.1 为步长递增至 0.5,并显示出数值: for v = 0:0.1:0.5 disp(v) end 运行结果: 0 0.1000 0.2000 0.3000 0.4000 0.5000 条件语句的一般格式为: if 条件 语句(上述条件为 True)时执行 else 语句(上述条件为 False)时执行 end 例如,使用 break 终止循环: for v = 0:0.1:0.5 if v<0.3 disp(v) else break; end end 运行结果: 0 0.1000 0.2000 在这里 if else 语句用来对 disp(v)的执行加以限制,break 可以跳出整个循 环。而 continue 则只跳出本次循环,以后的循环依然能够运行,如下例: for v = 0:0.1:0.5 if v>0.3 disp(v) else continue; end end 运行结果: 0.3000 0.4000 0.5000 试一下若将上面的 continue 改成 break 会得到什么样结果。