MATLAB

更新时间:2024-05-14 07:00:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MATLAB(2)

MATLAB是用于计算的高性能语言。它在易于使用的环境中集成了计算,可视化以及编程,在该环境中问题与求解都用熟悉的数学符号来表达。 1 介绍MATLAB系统组成 1.1 MATLAB是什么(看MATLAB如何提供技术计算的解决方案, 常用的应用有哪些以及

MATLAB工具箱所提供的额外的专业应用的解决方案。) MTALB系统主要组成部分: ? 桌面工具和开发环境

这些工具便于使用MATLAB函数和文件,它们包括:MATLAB desktop、命令窗口、命令历史、编辑器和调试器、代码分析器和分析报告、帮助浏览器、工作空间 、文件、搜索路径。

? MATLAB数学函数库 基本函数和复杂函数 ? MATLAB 语言

MATLAB语言是一种高级矩阵/数组语言,它具有控制流语句、函数、数据结构、输入输出、面向对象编程的特征。 ? 绘图

? MATLAB 外部接口/API

1.2 MATLAB文档 (如何寻找使用每个MATLAB组成部分的指令以及如何找相应的帮

助。)

1.3 开始MATLAB、启动MATLAB

2 矩阵和数组 如何用MATLAB来产生矩阵完成对矩阵的数学运算

2.1 矩阵以及Magic Squares 输入矩阵、完成矩阵运算以及获取矩阵元素

? 矩阵的输入

? 输入明确的元素清单

每行的各元素间用空格或逗号隔开,行与行用分号隔开,用方括号括起所有元素。A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]神奇方块magic square。生成的矩阵存储在工作空间以备调用。 ? 从外部数据文件载入矩阵

? 用MATLAB内部函数产生矩阵 ? 用你自己编写的函数产生矩阵 ? 矩阵求和、转置(tranpose)、diag (神奇方块,沿任一行或列或两主对角线求元

素和,结果相同) ? 和------sum 按列求和

sum(A) ans =

34 34 34 34

没定义输出变量名时,系统默认的变量名ans ,answer的缩写。

? MATLAB比较喜欢对矩阵的列进行处理,所以求以上矩阵的行和办法是---两

次转置。 sum(A')'

ans = 34 34 34 34

? 主对角线求和,sum diag

sum(diag(A)) ans= 34

次对角线求和sum(diag(fliplr(A))) ans =

34

? 矩阵下标

? 双下标表示A(i,j) 代表矩阵A的第i行第j列的元素

第四列所以元素求和

A(1,4) + A(2,4) + A(3,4) + A(4,4)

? 单下标表示A(i)

A(8)=A(4,2)

? 冒号运算符,是最重要的MATLAB运算符,它以不同的形式出现 ? 元素间隔单位1

1:10= 1 2 3 4 5 6 7 8 9 10 ? 元素间隔非单位1

100:-7:50= 100 93 86 79 72 65 58 51 0:pi/4:pi= 0 0.7854 1.5708 2.3562 3.1416 ? 引用矩阵的列

A(1:k,j) 矩阵A第j列前k个元素 sum(A(1:4,4)) A(:,j) 矩阵A第j列前所有元素 A(:,4)= A(1:4,4) A(:,end) end引用最后一列或行 ? Magic 函数

? 产生矩阵用函数B=magic(4)

? 交换矩阵B的中间两列变成A A = B(:,[1 3 2 4])

2.1 表达式 (变量、数字、运算符、函数、表达式的操作)

? 变量

? MATLAB 不要求任何类型生明或维数声明。当MATLAB遇到新变量名声,

它会自动产生变量并分配合适的存储空间。如果变量已经存在,MATLAB就修改它的内容。

变量名由字母、数字和下划线组成,MATLAB区分大小写。A和a是不同的变量。 特定函数返回最长变量名包含的字符个数。 N = namelengthmax N =

63

? 数

? 10的幂用科学计算法6.02252e23

? 虚数用i或j 1i -3.14159j

? 所有的数都是以IEEE浮点标准定义的长型(long)来存储,浮点数的范围在

10-308到10+308 ? 运算符 + Addition - Subtraction * Multiplication / Division

\\ Left division (described in Matrices and Linear Algebra in the MATLAB documentation) ^ Power

’ 复共轭转置 (转置后还要求共轭)

.’ 转置(只转置,不求共轭)只有在对复矩阵进行操作时,这两个转置才有区别。 ( ) Specify evaluation orde ? 函数

? MATLAB包括许多标准的基本数学函数

help elfun 列出基本函数清单

? MATLAB包括许多标准的高级数学函数

help specfun

help elmat 列出矩阵函数

内置函数(built-in)看不到源代码,而其它函数可以甚至可修改函数代码 内置函数(sqrt sin)M文件编写的函数(gamma sinh) ? 特殊函数产生的常数(符号常数)

pi 3.14159265... i,j eps 浮点相对精度 realmin 最小浮点数 realmax 最大浮点数

Inf 无穷大 是由于除数为零或确定表达式的计算结果溢出超出了最大浮

点数realmax

NaN 不是一个数 是由于表达式没有确定的数值如0/0 或Inf-Inf

例子:

rho = (1+sqrt(5))/2

rho =

1.6180

a = abs(3+4i) a = 5

z = sqrt(besselk(4/3,rho-i)) z =

0.3730+ 0.3214i

huge = exp(log(realmax)) huge =

1.7977e+308

toobig = pi*huge toobig = Inf

2.2 矩阵操作 (产生矩阵、载入矩阵、由M文件产生矩阵、矩阵联接、删除矩阵行与列)

? 产生矩阵

? MATLAB提高四个函数产生基本矩阵

zeros 全零 ones 全一

rand 均匀分布的随机数 randn 正态分布的随机数

例子: Z = zeros(2,4) Z =

0 0 0 0 0 0 0 0

F = 5*ones(3,3) F =

5 5 5 5 5 5 5 5 5

N = fix(10*rand(1,10)) N =

9 2 6 4 8 7 4 0 8 4

R = randn(4,4) R =

0.6353 0.0860 -0.3210 -1.2316 -0.6014 -2.0046 1.2366 1.0556 0.5512 -0.4931 -0.6313 -0.1132 -1.0998 0.4620 -2.3252 0.3792

? 加载函数

Load 函数可以读入先前MALAB产生的但存在二进制文件中的数据或是包含数值数据的文本文件。形成文本文件是主要数据的组织,要求排成一个矩形的数字表,数字间用空格分开,每行就是矩阵的一行,每行的元素要相同。如产生包含一矩阵的文本文件:

数据文件内容

16.0 3.0 2.0 13.0 5.0 10.0 11.0 8.0 9.0 6.0 7.0 12.0 4.0 15.0 14.0 1.0 保存的文件名为 magik.dat

然后由load magik.dat 将数据导入MATLAB中,且产生的变量名即为magik。

将二进制文件或文本文件的数据读入MATLAB中的最容易的方法就是用

Impor Wizard。 ? M文件

? 矩阵连接 就是将小矩阵变成大矩阵的过程

矩阵级联运算符方括号 [ ]

例:B = [A A+32; A+48 A+16] A就是magic矩阵 B =

16 3 2 13 48 35 34 45 5 10 11 8 37 42 43 40 9 6 7 12 41 38 39 44 4 15 14 1 36 47 46 33 64 51 50 61 32 19 18 29 53 58 59 56 21 26 27 24 57 54 55 60 25 22 23 28 52 63 62 49 20 31 30 17 ? 删除矩阵的行与列 X = A;

X(:,2) = [] 删除矩阵X的第二列 X =

16 2 13 5 11 8 9 7 12 4 14 1

? 删除矩阵的元素(采用单下标法,双下标会出错) 错X(1,2) = []

对X(2:2:10) = [] 删除后剩余的元素重排成一个行向量 X =

16 9 2 7 13 12 1

2.3 更多操作有关矩阵与数组 (线性代数中矩阵的使用,数组、多速率数据、标量扩展、

逻辑下标、find 函数的使用) ? 数组操作 + Addition - Subtraction

.* Element-by-element multiplication ./ Element-by-element division .\\ Element-by-element left division .^ Element-by-element power

基本的数学函数都是对每个数组元素处理。 ? 标量 标量与矩阵间的操作

B = A - 8.5 B =

7.5 -5.5 -6.5 4.5 -3.5 1.5 2.5 -0.5 0.5 -2.5 -1.5 3.5 -4.5 6.5 5.5 -7.5

B(1:2,2:3) = 0 将矩阵B的第1、2行,第2、3列的元素赋为0 小括号指出了赋零值

的位置

B =

7.5 0 0 4.5 -3.5 0 0 -0.5 0.5 -2.5 -1.5 3.5 -4.5 6.5 5.5 -7.5 ? 逻辑下标

X是普通矩阵,L是经过逻辑运算后的矩阵,X(L)定义L非零处的X的值。如删除不符合要求的数据。 x = x(isfinite(x)) x =

2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8

? find函数 找出满足一定逻辑条件的数组(阵列排列)元素的下标,按列找,所以

对一矩阵来说得到是一个行向量,每个元素是矩阵每一列中满足条件的元素的下标。

k = find(isprime(A))' A为magic矩阵,找素数 k =

2 5 9 10 11 13 A(k) 显示相应的素数 ans =

5 3 2 11 7 13

A(k) = NaN 将是素数的元素都变成零 A =

16 NaN NaN NaN NaN 10 NaN 8 9 6 NaN 12 4 15 14 1

2.4 控制命令窗口 输入输出(改变输出格式、抑制输出、enter long lines、在命令行编辑)

? 格式函数

函数format 控制MATLAB显示的数的格式,它只影响数的显示,不影响MATLAB如何计算它或保存它。

? 抑制输出 分号 ;

? 输入长语句 如果语句太长一行放不下,就用省略号,三个点(…),然后按回车表

明下行接着写,如

s = 1 -1/2 + 1/3 -1/4 + 1/5 - 1/6 + 1/7 ... - 1/8 + 1/9 - 1/10 + 1/11 - 1/12; ? 命令行编辑

上、下、左、右箭头可以方便命令行的编写。详细间表 如 上箭头可回调以前输入的命令。

3 图形 如何画数据、标注图形以及处理图形

3.1 MATLAB 画图纵览 (创建图形,包括多数据集、定义属性值、保存图形)

? 画图过程

? 产生图表曲线(graph)图表曲线的类型的选择取决与你的数据的性质以及你想 用你的数据说明什么。

用MATLAB产生图表曲线的两种基本方法: 1用画图工具交互地产生曲线图 2 在命令窗口用画图命令

两种方法混合使用也可,如用画图命令产生图,然后用画图工具修改。 ? 研究数据

提取数据的信息,如均值,拟和等 ? 编辑图表曲线的组成

曲线图都是由对象组成的,它们的性质是可以修改的。这些属性会影响图的外观和表现形式。 ? 注释图形 ? 打印输出图表

? 添加和移除图形内容

缺省状态,在同一图形窗口产生的新图形会覆盖以前的图形。 ? 保存图表以便重新导入MATLAB中

两种方法保存生成的图形:

1. 保存为FIG文件(由图形窗口的File 菜单选Save) 2. 产生生成图形的MATLAB代码(由图形窗口的File 菜单选Generate M-File)

? 图表的组成

? 图形窗口、坐标系、线条-------图形对象

? 画图工具

? Figure打开图形窗口-

? 命令窗口输plottools

用画图工具和MATLAB代码混合作图 t = 0:pi/20:2*pi; y = exp(sin(t));

plotyy(t,y,t,y,'plot','stem') xlabel('X Axis')

%ylabel('Plot Y Axis') 用画图工具给y轴加标签 title('Two Y Axes')

3.2 使用MATLAB画图工具的一些方法 (用图形绘画工具交互编辑图形) 练习:MATLAB help contents中 目录是MATLAB/Getting Started/Graphics/Some Ways to Use MATLAB Plotting Tools

3.3 使用基本画图函数 (用MATLAB画图函数来创建和修改图形)

? 创建一幅图

? 函数plot(y) 产生分断线性图,y向量对y中元素的标号(下标) ? 函数plot(x,y) y对x

x = 0:pi/100:2*pi; 一简单例子画正弦信号 y = sin(x); plot(x,y)

xlabel('x = 0:2\\pi')

ylabel('Sine of x')

title('Plot of the Sine Function') ? 在一个图中画多个数据集

? 函数plot(x,y,x,y1)的变量是多对x-y变量可生成多数据集,MATLAB会自动 用不同颜色将其区分开。 x = 0:pi/100:2*pi; y = sin(x);

y2 = sin(x-.25); y3 = sin(x-.5); plot(x,y,x,y2,x,y3)

legend('sin(x)','sin(x-.25)','sin(x-.5)') ? 定义线条的风格和颜色

? 命令plot(x,y,'color_style_marker') color_style_marker'是定义线条的颜色、风格、

标记符这些特征的字符串,用单引号括起来。

1. 颜色字符串是:'c', 'm', 'y', 'r', 'g', 'b', 'w', 和 'k',分别对应青色、洋红、

黄色、红、绿、蓝、白和黑。

2. 线条风格字符串是:'-'实线、'--'虚线、':'点、'-.'点划线。忽略线形风格

就不会有线。

3. 标记符风格字符串是:'+', 'o', '*', 'x','s','d','^','v'等。

? 画线和标志

? plot(x,y,'ks') 没有定义线形,不画线只画标记符, ? plot(x,y,'r:+') 例子:

x1 = 0:pi/100:2*pi; x2 = 0:pi/10:2*pi;

plot(x1,sin(x1),'r:',x2,sin(x2),'r+') ? 画复数据

? plot(Z) 等价plot(real(Z),imag(Z)) Z是复向量或矩阵 t = 0:pi/10:2*pi; plot(exp(i*t),'-o') axis equal

? 在现有的图上添加新图 ? hold on

例子首先用函数peaks产生等高线图,然后加伪彩色图 [x,y,z] = peaks; pcolor(x,y,z) shading interp hold on

contour(x,y,z,20,'k') hold off ? 图形窗口

? 如果屏幕上还没有图形窗口,绘图函数会自动打开一个新的图形窗口 figure ? 如果一个图形窗口存在,MATLAB就会用该窗口显示图形

? 如果有多个图形窗口已打开,MATLAB只对当前的图形窗口(最后一个使用的

窗口或被点中的)操作。figure(n)

? 一个图上显示多条曲线

? 命令subplot 可以在一个图形窗口内显示多个坐标系。

subplot(m,n,p)将图形窗口分成了m*n个坐标系,并选中第p个坐标系作为当前操作对象,这些坐标系是按行编号的,先第一行,后第二行等。

t = 0:pi/10:2*pi;

[X,Y,Z] = cylinder(4*cos(t)); subplot(2,2,1); mesh(X) subplot(2,2,2); mesh(Y) subplot(2,2,3); mesh(Z) subplot(2,2,4); mesh(X,Y,Z) ? 控制坐标轴

? 设置坐标轴范围。缺省时,MATLAB会根据数据的最大和最小值自动设置坐标

轴范围。用命令axis可指定范围。

axis([xmin xmax ymin ymax]) 设置二维图形范围

axis([xmin xmax ymin ymax zmin zmax]) 设置三维图形范围 ? 设置坐标系的高宽比

axis square x轴与y轴长度相同

axis equal x轴与y轴刻度长度相同 ? 设置栅格线

grid on 开 grid off 关 ? 加坐标标签和标题

? 用xlabel、ylabel和zlabel命令添加x、y、z轴标签 ? 用title命令在图形窗口顶部添加标题 ? 用text在图形窗口任意位置添加文本 例子:

t = -pi:pi/100:pi; y = sin(t); plot(t,y)

axis([-pi pi -1 1])

xlabel('-\\pi \\leq {\\itt} \\leq \\pi') ylabel('sin(t)')

title('Graph of the sine function')

text(1,-1/3,'{\\itNote the odd symmetry.}')

4 编程 如何用MATLAB来创建脚本文件及函数,如何处理数据结构 4.1 流控制 (if、switch、for 、while、continue、break)

? if,else 和elseif

? if语句计算逻辑表达式的值,如果该值为真,则执行一组语句 ? elseif 和else 关键字是可选项,它提供另一组语句的执行 ? 关键字end 与if 配对结束if语句 ? 不用小括号和大括号

if rem(n,2) ~= 0 n是奇数还是偶数 M = odd_magic(n) elseif rem(n,4) ~= 0

M = single_even_magic(n) n是不被4整除的偶数

else

M = double_even_magic(n) n是被4整除的偶数 end

? 逻辑表达式中,标量进行比较时采用关系运算符;矩阵比较时采用函数isequal Isempty、all、any;否则会出错

A = magic(4); B = A; B(1,1) = 0;

A = = B ans =

0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

isequal(A, B) ans = 0

? switch和case

? switch判断变量或表达式的值

? 关键字case和otherwise描述执行的语句组 ? end 必须与switch配对

switch (rem(n,4)==0) + (rem(n,2)==0) case 0

M = odd_magic(n) case 1

M = single_even_magic(n) case 2

M = double_even_magic(n) otherwise

error('This is impossible') end

? for

? for重复语句组固定次数 ? for要与end配对

for n = 3:32

r(n) = rank(magic(n)); end r

? while

? while 实现的循环不是固定次数。while 要与 end 成对出现

例子说明if while 的使用 a = 0; fa = -Inf;

b = 3; fb = Inf; while b-a > eps*b x = (a+b)/2; fx = x^3-2*x-5;

if sign(fx) == sign(fa) a = x; fa = fx; else

b = x; fb = fx; end end x

? continue

? continue 跳过该语句出现后的循环体内的剩余语句,将控制权交给下一次循环。 ? break

? break语句提早退出for或loop循环。对于嵌套循环,break只退出最内部的循环。 ? try-catch ? return

? return终止当前一系列命令,把控制权交给调用函数或交给键盘。可以在被调函 数内插入return语句使它停止,并把控制权交给调用函数。

4.2 其它数据结构 (多维数组、cell arrays、字符、文本数据、结构体的操作)

4.3 脚本文件与函数 (写脚本文件和函数、使用全局变量、传递字符串变量给函数、用

eval函数计算文本表达式、向量化代码、重新分配数组、用句柄来引用函数、使用对函数操作的函数)

包含了用MATLAB编写的代码的文件被称为M文件。用文本编辑器产生M文件,然后可以像用任一其它MATLAB函数或命令一样使用这些M文件。 有两种M文件:

1. 脚本,不接收输入变量也不返回输出变量。它们可对工作空间中的数据进行操作 2. 函数,接收输入变量并返回输出变量。内部变量对于函数是局部变量。

尝试编程只需把创建的M文件保存到当前目录即可,如果开发更多的M文件,就要把保存目录加入到MATLAB的搜索路径中。

要看某一M文件内容,如huatu.m 用命令 type huatu

? 脚本

? 当调用一脚本文件时,MATLAB只是批处理地处理文件中的命令。

? 脚本文件可对工作空间中现存的数据进行操作,或产生新数据并对其进行操作 ? 尽管脚本文件不返回输出变量,但其产生的任何变量都保存在工作空间中以备

随后的计算。

% 创建一个M文件叫magicrank.m 目的是Investigate the rank of magic squares

r = zeros(1,32); for n = 3:32

r(n) = rank(magic(n));

end r bar(r)

在命令窗口键入magicrank,就可执行以上M文件,从而技术前30个魔幻平方的秩,并画出结果的条线图。文件执行完后,变量n,r就被保留在工作空间。 ? 函数

? 函数可接收输入变量并返回输出变量 ? 函数文件的名字必须和函数名一样。

? 函数只对它们自己的工作空间中的变量进行操作,该函数工作空间是从公共的 MATLAB工作空间中分离出来的。 例子, 看求秩的函数rank

function r = rank(A,tol)

% RANK Matrix rank.

% RANK(A) provides an estimate of the number of linearly % independent rows or columns of a matrix A.

% RANK(A,tol) is the number of singular values of A % that are larger than tol.

% RANK(A) uses the default tol = max(size(A)) * norm(A) * eps.

s = svd(A); if nargin==1

tol = max(size(A)') * max(s) * eps;

end

r = sum(s > tol);

? 函数第一行以关键字function 开始,给出函数名和变量顺序。例子中,有两个 输入一个输出

? %号后是注释语句,提供该函数的帮助文本,当键入help rank 时只显示这些行 ? 帮助文本的第一行又叫H1行,当用lookfor命令时,MATLAB显示的就是这一 行。

? 其余行是可执行的MATLAB代码,由它们来定义函数。引入函数体的变量s、r、 tol、A对rank函数来说都是局部变量,它们独立于MATLAB工作空间中的任何 变量。

? MATLAB中函数特有的,可变的变量个数(输入或输出变量)。 如果没有输出变量,结果就保存在变量ans中。如果第二个输入变量没有被提供,函数就按缺省值来算。

rank(A) r = rank(A)

r = rank(A,1.e-6)

? 函数类型

? 匿名函数 这是一种快速产生简单函数的方法,不用每次都创建M文件。 它由一个MATLAB表达式和任意个输入和输出变量组成。你可以就在MATLAB命令窗口定义一个匿名函数。 语法规则:f = @(arglist)expression sqr = @(x) x.^2; 编一个求平方的函数

a = sqr(5) a =

25

主函数和子函数

凡不是匿名函数的所有函数都要在M文件中定义。 M文件中首先出现的是主函数,后面是任意个子函数。 主函数比子函数的活动范围要大。主函数可从外部由MATLAB命令行或其它M文件中的函数调用,而子函数不能。

4. 子函数只对主函数和同一个M文件内的其它子函数可以看见 ? 私函数

1. 私函数是主M文件函数的类型,它的独特之处在于它只对有限的一组函数是可

见的。如果想限制对某一函数的访问,或不想公开该函数的使用时,这种函数会派上用场。

2. 私有函数位于具有特殊名private的子目录中。它们只对处于父目录中的函数是

可见的。假设目录newmath在MATLAB的搜索路径上,newmath的一个叫做private的子目录就可以包含一些只能被newmath中的函数调用的函数。

3. 由于私有函数在父目录以外是看不到的,所以它们可以用与其它目录中相同的

函数名。这是有用的当你想创建自己的特有的一种函数同时又想在另一个目录里保留它的原型。而且同样的函数名,MATLAB先找到的是私有函数而后是非私有函数,这也是创建私有函数的一个原因。 ? 嵌套函数

1. 嵌套函数是在任何MATLAB的M文件函数体内定义的函数。

function x = A(p1, p2) ... B(p2)

function y = B(p3) ... end ... end

2. 像其它函数一样,内嵌函数也有自己的工作空间用来存储自己使用过的变量。

但它还可以访问它所嵌套的所有函数的工作空间。比如,一个变量在主函数中被赋了值,那么嵌套在主函数中任意层的嵌套函数都可对这个变量进行读写。同样,如果一个变量在嵌套函数内被赋了值,那包含该嵌套函数的任一函数都可对该变量进行读写。 ? 函数过载

1. 过载函数是用于创建一函数对不同类型的输入做出不同的响应

2. 你可以通过对不同的类型的输入(双精和整型)创建不同的独立的函数,但具

有同一函数名,使使用者看不到这种区别。

? 全局变量

? 要想使更多的函数共享一个变量,只有在这些函数中将该变量声明为全局变量 global.

? 要想让工作空间访问某一变量,在命令窗口将其声明为全局变量 ? 全局变量的声明应该发生在全局变量被使用前 ? 用大写字母来区分全局变量与其它变量 例子 先编写函数,再在命令窗口调用

? 1. 2. 3.

function h = falling(t) global GRAVITY

h = 1/2*GRAVITY*t.^2;

global GRAVITY GRAVITY = 32; y = falling((0:.1:5)');

两个定义全局变量语句使得在命令窗口给GRAVITY赋的值也可以在函数内部使用,这样可以交互的修改函数内部变量,而不用重新修改函数文件。 ? 函数句柄

? 对任意的MATLAB函数可以创建一个句柄,然后把它作为引用该函数的方法。 ? 向量化

? 使MATLAB程序运行更快的方法之一就是将你编程时所用的算法向量化。也就 是说,凡是其它编程语言会用for循环或DO循环的地方,MATLAB可以用向量 或矩阵运算。例子产生一个对数表 用for循环实现

x = .01;

for k = 1:1001

y(k) = log10(x); x = x + .01; end 向量化

x = .01:.01:10; y = log10(x);

更为复杂的代码采用向量化不见效,可参考Improving Performance and Memory Usage ? 预分配

? 给向量或矩阵预分配空间,避免了每循环一次都要增大这些变量的空间,所以 可加快程序的执行速度

r = zeros(32,1); for n = 1:32

r(n) = rank(magic(n)); end

5 创建图形用户界面 介绍GUIDE,MATLAB的图形用户开发环境

5.1 什么是GUIDE (介绍GUIDE,MATLAB图形用户界面设计环境) 5.2 设计GUI (简要介绍GUIDE设计编辑器)

参看MATLAB/Greating Graphical User Interfaces/Introduction to Creating GUIs/Creating a Simple GUI with GUIDE, 学习在图形用户界面开发环境中做一个简单的图形用户界面。 6 桌面工具以及开发环境

6.1 桌面浏览 (获取工具、安排桌面、设置参数)菜单项desktop

启动

6.2 命令窗口与命令历史 (运行函数和输入变量)

命令窗口 (箭头、回车)

历史窗口

6.3 帮助浏览器(查询和浏览文档和demos)

? 用帮助浏览器可以浏览MATLAB产品相应的文档和演示(demos),通过问号按钮

即可打开帮助浏览器。

? 帮助浏览器由两部分组成,Help Navigator和显示面板组成。 ? Help Navigator是用来查找信息,显示面板显示查找到的结果 ? Search for域, 用于查找文档和演示中具体的词。你可以

1. 指定一个确切的短语,并用双引号把它括起来,如\2. 在不明确的地方用通配符*,如wo*d1

3. 词之间用布尔运算符,如word1NOT word2 ? Contents表

1. 查文档的标题或内容表。

2. 一般,contents与被显示的页是同步的。

3. 如果通过搜索或由超链接找到的一页,要是想要看看与该页相关的内容可以

点击Contents标签

? Index标签

查找文档中具体的索引输入(关键字) ? Search Results标签

显示Search for 的搜索结果,并将文档中搜到的结果与演示中的分开。 ? Demos标签

浏览并运行MathWorks 产品的演示。演示包含的代码可以用做开发自己的M文件的基础。

6.4 当前目录浏览器和搜索路径(管理和使用M文件)

凡是想要运行的文件必须要么是在当前路径,要么在搜索路径中。

? 当前目录

? 查看或修改当前目录的快捷方法就是用桌面工具栏上的当前目录域。

? 搜索路径

当创建了一个M文件后,要将其所在的目录或路径加载到MATLAB的搜索路径中。 设置搜索路径:File > Set Path

6.5 工作空间浏览器和数组编辑器 (操作MATLAB中的变量)

? 工作空间

? 工作空间是由MATLAB运行时产生的变量以及内存中存储的变量组成。 ? 查看工作空间中的变量信息可用工作空间浏览器

? 阵列编辑器,双击工作空间浏览器中的变量就可看到它。

6.6 用Cell(单元)调试代码段,有利于模块化的M文件的调试

7 当使用MATLAB时,会经常对代码进行实验,如修改、测试、更新直到满意为止。用

脚本M文件的cell功能可方便以上调试过程。函数M文件的Cell功能较脚本M文件有所限制,将Cell与断点调试结合可增强文件调试的功能,用Index搜关键字“%%”即可得到帮助。

用单元功能的整个过程:

? 在MATLAB的编辑/调试器中选择菜单项Cell >Enable Cell Mode Cell启动单元模

式。

? 用分隔符%%定义单元和单元标题

? 在要定义Cell的代码行前插入分隔符%%,表示一个新的单元的开始。

一个单元是从本单元的%%开始到下一个单元的%%结束。

单元间的水平线可区分各个单元,该水平现在打印M文件时不显示。

MATLAB不执行以%%开头的代码行,一般%%后是单元标题,所以要把可执行代码放在该行后面。

一般,M文件的第一个单元开头不用%%,MATLAB会自动识别。 ? 加标题

分隔符%%后,键入一个空格,后面紧跟单元标题,为了强调MATLAB将其用粗体显示。加单元标题可提高程序的可读性。

当鼠标位于单元的任一行时,该单元所有的代码会被高亮显示。背景色可通过菜单选项设置File > Preferences > Editor/Debugger > Display,修改Cell display options。

例子:一个名为sine_wave的M文件定义了两个单元。第一个单元产生基本输出图形,第二个单元对图形进行标注。例子MATLABclass\\exercise cell.m

设置单元之前

设置单元之后

? 一旦定义了单元,就可在单元间切换查看各单元的代码,并且可独立的测试每个

单元的代码,查看相应的输出结果,即完成修改单元代码的参数及调试。 ? 查看某个单元,可通过点击显示单元标题按钮,挑选要查看的单元标题

? 测试单元代码,用菜单项Cell中的测试选项或工具栏上的按钮,测试时,单元

的输出结果会显示在命令窗口或图形窗口。

? 单元测试功能可以运行编辑/调试器中当前显示的代码,即使代码中由没有保存

的修改。测试的单元所在的M文件不必处于MATLAB的搜索路径。

表示运行当前单元的代码

表示运行当前单元的代码并移动到下一个单元 表示运行文件中的所有代码

? 修改单元中的数值,单元会自动重新计算输出结果。

? 要修改单元中的数值,首先要把鼠标放在该数旁边,而后用单元工具栏上的数值修改工具。用这个工具,可以定义一个数,并加上相应的数学运算符来对这个数进行加、减、乘、除运算。

? MATLAB不会自动保存用单元工具栏对变量进行的修改,所以要注意修改后保存。

例子: 在上面的例子sine_wave.m里修改x的值。

? 运行sine_wave.m的第一个单元,结果如下

? ? ? ? ?

要想得到平滑的正弦波形,要调整采样间隔

将鼠标放在表示采样间隔的数值旁边,将数值修改工

具中乘/除数改为2

按乘号表示增大步长,按除号表示减小步长

当按除号时,步长在减小,同时图形窗口的正弦波也

做出相应的变化。

调整步长,直到输出结果满意,最后保存修改的参数。

7.1 编辑器/调试器 (创建和调试M文件)

? 编辑器

? 由现存的代码创建M文件

1. 调用命令历史中的语句,选中点右键Creat M-File

2. 在大部分MATLAB函数(内置函数不行)和工具箱函数上进行修改,完毕

后另存。

3. Demos中的例子程序。

? 调试器

两种错误:

1. 语法错误---如写错了函数名、漏了括号

2. 运行错误----这些错误本质上是算法错误。查出运行错误很难。

检错和优化程序用以下工具:

? 语法强调和分隔符匹配

1. 语法强调帮你识别出M文件中没有终止的字符串

2. 分隔符匹配可正确地匹配括号和关键字

File > Preferences > Keyboard > Delimiter Matching.设置调试器检查的匹配。 ? 错误信息

1. 当运行有语法错误的M文件时,MATLAB在命令窗口显示错误信息,并显

示出它所在的行。

2. 点击错误信息部分的下划线,相应的M文件会打开并直指包含错误的行。 ? M-Lint

用M-Lint代码分析器可以检查代码的完整性,了解代码可能的改进的地方。

? 编辑器/调试器图形调试器和MATLAB调试函数

通过访问函数空间,检查和改变其中的值来纠正运行时的问题。 1. 为调试做准备

被调试的文件是已经被保存的,且它的路径已经加载到了搜索路径中。 2. 设置断点

有三种基本类型的断点可以设置: ? 标准断点,停在指定行

? 条件断点,在特定条件下停在指定行

? 错误断点,在特定类型的错误如警告、NaN、无穷值出现时程序停止运行,

不用在指定的文件中指定行设置断点。

如果想要检查循环增量的值,不要在for 语句处设置断点,如 for n = 1:10 m = n+1; end

MATLAB执行for语句只一次,所以在for语句处设断点,看不到增量的变化,相反得把断点设在for语句的下一行,m=n+1。

有“-”的行表示可执行行,没有则是不可执行行(注释行)。

设置断点要设在可执行行前,如果设在了不可执行行前,系统认为断点是被设在了该行的下一行。

设置断点:可以在所在行的breakpoint alley 处点击;也可把鼠标放在设断点的那一

行,而后点击工具栏上的设置断点按钮。

设置断点例子:在collatzplot.m的10、11、12行设置断点,第10行的断点允许你跳进(step into)函数collatz 看那儿是否有问题。11、12行的断点停下程序以便检测中间结果。红色表示有效断点,灰色为无效。

断点是灰色的可能原因:

一是文件还没保存,一是文件有语法错误,修改错误并保存文件,断点变有效。 3. 运行有断点的M文件

命令窗口输入 collatzplot(3), 运行有断点的M文件结果是:

? 命令窗口的提示符变成了 K>> 表示MATLAB正处于调试状态 ? 用绿色箭头指出接下来要被执行的语句。

? Stack域显示出当前的函数

? 如果你调试的文件不在当前目录或不在搜索路径上,你就会被提醒修改路径 4. 单步调试整个M文件

? ? ? ?

一直运行直到程序结束或遇到下一个断点 单步运行 进入函数 跳出函数

进入子函数collatz,这时Stack域显示的当前函数是collatz,函数

当N=3时,用

Collatzplot的第10行前的指示符变成了空箭头,表示MATLAB控制权已由主函数 移交给了子函数。在子函数中也可用与主函数中相同的调试方法。 5. 检查值

当程序停下时,你可以查看工作空间中的任意变量的当前值。检查变量值可以 检查某行是否产生了预期的值,如果值与预期的相同,则运行下一行;如果不同,那么本行或他的前一行有错。用以下方法检测变量值,更多方法看Examining Values in the Example ? 挑选工作空间

在命令窗口和用脚本M文件生成的变量都位于基本工作空间,而用函数M文

件产生的变量都处于它们自己的函数工作空间。要检查某一变量,首先要选择工作空间。当运行程序时,当前工作空间被显示在Stack域中。对于当前运行的函数,要检查另一个工作空间的变量时,首先从Stack列表里挑选该变量对应的工作空间。 ? 在编辑器/调试器中用数据提示查看值

? 在命令窗口中查看值

在命令提示符K>>后键变量名,可显示当前工作空间中的当前变量。 ? 在工作空间浏览器和阵列编辑器中查看值

工作空间浏览器中显示了当前工作空间中的所有变量。修改工作空间浏览器的Stack可以查看别的工作空间的变量

双击变量名,可以打开阵列编辑器,从而查看变量细节

? 计算选项 选中M文件中的一个变量或等式,点右键,从下拉菜单中选Evaluate Selection,MATLAB会将计算结果显示在命令窗口中。 ? 检查例子中的值 检查n/N=2时,当第二次调用子函数结束时,运行箭头会变成绿色向下箭头。 单步运行完子函数可回到主函数,也可用step out ,自动运行完子函数其余的语句,然后回到主函数。错误在12行,应该是seq_length(N),而不是plot_seq。 6. 纠正问题和结束调试

? 修改值检测结果

调试时,可以在命令窗口给要检测的变量赋一新值,看接下来程序的反应,如与预期结果相同,则没问题;若有,则说明程序有问题。 ? 结束调试

要修改,保存文件必须退出调试模式。按退出调试模式的按钮 ? 清除断点

使断点失灵,可以占时忽略它,就像没有断点。右击断点,从下拉菜单中选Disable Breakpoint。

清除断点。工具栏或关闭MATLAB 7. 有条件断点

如果想要在一定循环次数后检查程序的运行结果,可以设置条件断点。如在collatzplot的10行设置条件断点,指定当N大于等于2时MATLAB停止运行。 ? 点击设置断点的行,按右键在下拉菜单中选中Set/Modify Conditional

Breakpoint,然后在条件断点对话框中输入条件N>=2. 10行前出现黄色提示符。

? 当运行程序时,当条件满足,MATLAB就进入调试模式

7.2 M-Lint 代码检测和剖析报告 (改善和调整M文件)

? M-Lint 代码检测报告

? 显示潜在的错误和问题,以及对M文件进行优化的可能性。术语lint也被C 语言中相似的工具使用

? 可以从当前目录浏览器来访问M-Lint 代码检测报告

使用M-Lint 的方法:要么对现有的M文件或一组M文件产生一个报告,根据报告中的意见去修改,要么利用M-Lint的自动代码纠正功能,在编辑器/调试器中边工作边让它来检测。

? 编辑器/调试器中的M-Lint 自动代码分析器

分析器可对编辑器/调试器中的M文件完成连续的,自动的代码检测,要启动它需要

? 确保M-Lint messaging preference 设置有效。 ? 打开要编辑/调试的文件,编辑窗口的右上边缘有一个

M-Lint信息指示器: 红色-------有语法错误

橘黄色----警告或有可以改进的地方,但没有错误 绿色----既没有语法错误又没有警告和改进的地方

? 点击M-Lint信息指示器可以到达下一个出现错误,警告的位置

? 代码段下方的下划线表示该处有错误或警告,鼠标放在上面会出现相应的

M-Lint信息。

打开例子程序:open(fullfile(matlabroot,'help','techdoc','matlab_env','examples','lengthofline.m')) 将例子文件lengthofline.m保存到C:\\MATLAB\\MATLAB class.

例子中的22行的M-Lint消息表示,变量nothandle已赋值,但此后在文件的任何地方都没被用过。可能这个变量是多余的,若是删掉。但后面是要用到的,故把24行的变量 ~ishandle(hline(nh))改成 nothandle(nh),这样22行就不再出现M-Lint消息了。

对于该如何处理例子中的警告或可能改进的地方,参看Messages and Resuling Changes for the lengthofilne Example。

? 被高亮的一些错误或警告表明,M-Lint可自动修改它。

23行高亮区显示出提示信息,点右键可修改它。

M-Lint 用numel(hline)取代了prod(size(hline)) 。

?

除了用M-Lint信息指示器来定位下一个错误或警告,

也可用M-Lint信息栏来查看检查消息。红色标记代表错误,橘黄色标记代表警告或可以改进的地方。把鼠标放在标记上就可以查看消息。

多个消息可能代表的是一个问题或多个问题,处理一个可能会解决一系列的问题。

例子中,48行有问题,提示说是括号不匹配,将鼠标放在该行的第一个括号上,随着箭头按键的移动,发现括号是匹配的,说明问题在data{3}(;),将分号改为冒号,改正后的M-Lint信息指示器由红变橘黄色,说明此时程序没有语法错误。

? 剖析器

? MATLAB包含的剖析器有助于改善M文件的性能

? 在剖析器里面运行一个MATLAB语句或M文件,它会给出什么地方耗费时间。 可从Desktop菜单访问剖析器。

Communication Toolbox

1 信源 1.1 白噪声 ? 函数wgn

? 产生具有高斯白噪声分布的随机矩阵

? 可用dBW、dBm或线性单位来定义噪声功率 ? 可产生实或复噪声 ? 例子

? 以下的命令产生一个列向量包含50个实数白噪声,功率为2dBW y1 = wgn(50,1,2);

? 产生复数白高斯噪声,功率为2瓦,负载为60欧姆, y2 = wgn(50,1,2,60,'complex',’dBW’); 加性高斯白噪声信道用awgn函数

1.2 随机符号

? 函数randsrc产生随机矩阵,矩阵中包含的元素就是数据符号,它们之间相互独立,

按照定义的分布。

? a = randsrc(5,4,[1,3,5]) 产生5*4矩阵,矩阵中的元素是均匀分布的集合{1,3,5} 中的符号。

? b = randsrc(5,4,[1,3,5; .5,.25,.25]) 产生5*4矩阵,矩阵中的元素是集 合{1,3,5}中的符号,1的概率0.5,3、5的概率分别为0.25。

1.3 随机整数

? Randint函数产生随机整数矩阵

? c = randint(5,4,[2,10]) 产生2到10之间的随机整数。

1.4 随机误比特图样 randerr函数用于测试差错控制编码。 2 信道

信道包括AWGN信道,衰落信道和二进制对称信道(测试信道编码的)。

许多应用使用的信道模型是混合了衰落和AWGN,在这种情况下,应该先用衰落信道函数,而后再用AWGN函数。 2.1 AWGN信道

? AWGN信道中噪声电平的描述

AWGN信道中的噪声功率通常用以下量描述:

? 每样值的信噪比SNR,这是函数awgn的实际输入参数。

? 比特能量与噪声功率谱密度之比Eb/N0,这是BERTool和性能估计函数使用的 参数。

? 符号能量与噪声功率谱密度之比Es/N0。 ? Eb/N0与Es/N0的关系(以dB为单位)

这里,k是每符号信息比特的个数,在通信系统中,k要受符号个数和差错控制编码的编码率影响。如用编码率为1/2的代码和8-PSK的调制,则每符号的信息比特个数k 为(1/2) log2(8) =3/2, 三个信息比特对应六个编码比特,也就是对应2个8-PSK符号。

? SNR与Es/N0的关系(以dB为单位)

这里,Tsym是信号符号周期,Tsamp是信号采样周期。

如,复基带信号的过采样系数为4,那么Es/N0就超出相应的SNR 10 log10(4)。 3 调制

3.1 通信工具箱的调制特征

? 通信工具箱针对输入信号类型的不同有相应的调制函数。

? 基带仿真和通带仿真

对于给定的调制技术,有两种方法来模拟或仿真该调制技术,一个是基带仿真,

一个是通带仿真。基带仿真,又称为低通等效方法,要求较少的计算量。该工具箱支持数字调制的基带仿真,支持模拟调制的通带仿真。 ? 调制术语

载波频率-----Fc,

采样速率-----Fs仿真期间,消息信号被采样的速率

载波频率要比输入消息信号(调制信号)的频率大得多。奈奎斯特采样定理要求采样速率Fs至少要大于等于载频与消息信号最高频率之和的二倍,这样解调器才可正确恢复消息。

3.2 模拟调制

? 表示模拟信号

? 单通道信号--------向量

向量中的元素表示对模拟信号进行采样后得到的采样点的幅值,采样间隔为1/Fs。 例1:t向量表示采样时刻(秒),x向量为对应于采样时刻的信号的样点值,Fs为8k.

要产生频率为300Hz,时长为0.1秒的正弦波信号。 Fs = 8000; % Sampling rate is 8000 samples per second. Fc = 300; % Carrier frequency in Hz

t = [0:.1*Fs]'/Fs; % Sampling times for .1 second x = sin(20*pi*t); % Representation of the signal y = ammod(x,Fc,Fs); % Modulate x to produce y. figure;

subplot(2,1,1); plot(t,x); % Plot x on top. subplot(2,1,2); plot(t,y)% Plot y below.

例2:Fs=8000; a=0.85; N=512;

% message signal f1=100;f2=50; fc=2000;

t=0:1/Fs:(N-1)/Fs;

m=sin(2*pi*f1*t)+sin(2*pi*f2*t); subplot(211) plot(t,m);

% modulated signal m_n=m/max(abs(m)); c=cos(2*pi*fc*t); x=((1+a*m_n).*c)'; subplot(212); plot(t,x);

? 多通道信号-------矩阵,每列表示一个通道

如产生两通道信号,一个是初相为零的正弦波,一个是初相为pi/8。 Fs = 8000;

t = [0:.1*Fs]'/Fs;

x = [sin(20*pi*t), sin(20*pi*t+pi/8)] ? 模拟调制例子

发端对模拟信号采样,调制后送入AWGN信道,收端解调后,画原始消息与解调恢复的消息波形。

% 对时长为2秒的信号进行采样, % 采样速率为100Hz. Fs = 100; % Sampling rate t = [0:2*Fs]'/Fs; % 采样时刻

% 产生信号,两正弦信号的叠加 x = sin(2*pi*t) + sin(4*pi*t);

Fc = 10; % 载波频率

phasedev = pi/2; % 调相灵敏度

y = pmmod(x,Fc,Fs,phasedev); % 调相. y = awgn(y,10,'measured',103); % 加噪声. z = pmdemod(y,Fc,Fs,phasedev); % 解调.

% Plot the original and recovered signals. figure; plot(t,x,'k-',t,z,'g-');

legend('Original signal','Recovered signal'); 3.3 数字调制

? 表示数字信号

数字信号用向量表示,其中的元素表示数据符号的M种可能的取值。 如数字信号是八进制,表示这种信号用[2 3 7 1 0 5 5 2 6]' ? 带通信号的低通表示

? 带通信号的低通等效

一个带通信号就是全部频率分量都位于某一中心频率f0附近的信号。换句话说,带通信号有x(f)?0,对f?f0?W,这里W??f0。一个低通信号是其频率分量均位于零频率附近的信号,即对于f?W,有X(f)?0。

本文来源:https://www.bwwdw.com/article/j197.html

Top