matlab基本编程

///////////////////像 C 语言、FORTRAN 等计算机高级语言一 样进行程序设计,编写扩展名为.m 的 M 文件,实现各种复杂的运算,这使得 MATLAB 在科 研中的应用更加深入,常常作为系统仿真的工具应用。MATLAB 提供文件编辑器和编译器, 这为用户带来了方便,事实上,MATLAB 自带的许多函数就是 M 文件函数,用户也可利用 M 文件来生成和扩充自己的函数库。 所谓 M 文件,简单来说就是用户把要实现的命令写在一个以.m 作为扩展名的文件中, 然后由 MATLAB 系统进行解释,最后运行出结果。由此可见 MATLAB 具有强大的可开发性 和可扩展性。另外,由于 MATLAB 是由 C 语言开发而成的,因此 M 文件的语法规则与 C 语 言几乎一样,简单易学。 ////////////////////////

////M 文件有函数(Functions)和脚本(Scripts)两种格式。二者相同之处在于它们都是以 m 作为扩展名的文本文件,不进入命令窗口,而是由文本编辑器来创建外部文本文件。但是 两者在语法和使用上略有区别。 ///

脚本是一个扩展名为.m 的文件,其中包含了 MATLAB 的各种命令,与批处理文件很类 似,在 MATLAB 命令窗口下直接输入此文件的主文件名,MATLAB 可逐一执行在此文件内 的所有命令,和在命令窗口逐行输入这些命令一样。脚本式 M 文件运行产生的所有变量都是

MATLAB中许多常用的函数(如sqrt、inv和abs等)都是函数式M文件,使用时,MATLAB 获取传递给它的变量,利用操作系统所给的输入,运算得到要求的结果,然后返回这些结果。

P 码是伪代码 Psedocode 的简写,一个 M 文件首次被调用时,MATLAB 将首先对该 M 文件进行语法分析,并把生成的相应内部伪代码(P 码)存放在内存中。此后当再次调用该 M 文件时,将直接运行该文件在内存中的 P 码文件而不会对原码文件重复进行语法分析。P 码文件和原码文件具有相同的文件名,但其扩展名为“.p”。并且其运行速度要高于原码文件, 但是对于规模不大的文件,用户一般察觉不到这种速度上的优势。
pcode filename  %在当前目录下生成 filename.p
pcode filename – inplace  %在 filename.m 所在目录下生成 filename.p
如果要在内存中对 P 码文件进行操作,可键入以下命令:
inmem    %罗列出内存中的所有 P 码文件
clear filename   %清除内存中的 filename.pP 码文件
clear functions   %清除内存中的所有 P 码文件

matlab 变量   global var1 var2; 全局变量
ans MATLAB 中默认变量 pi 圆周率 eps 计算机中的最小数 inf 无穷大 NaN 不定值,如 0/0 i(j) 复数中的虚数单位 nargin 所用函数的输入变量数目 nargout 所用函数的输出变量数目 realmin 最小可用正实数 realmax 最大可用正实数

 whos global         %查看工作空间的全局变量
要测试变量名是否已用作函数名,可键入 which –all进行确认;
iskeyword可列出所有的预留关键字

循环语句
for 循环 for 循环的语法结构如下:
for 循环变量=数组   
 循环体;
end
实例:%根据中心极限定理,从双极性分布的序列中获得满足正态分布的随机序列
clear;
n=50;
p=0.5; %生成一个满足双极性分布的矩阵,大小为 500*1000
x=binornd(n,p,500,1000);        
z=(x-25)/sqrt(12.5);       
for i=1:1:1000
    y(1,i)=0;
end
for i=1:1:1000
    for j=1:1:500     %将独立分布的双极性随机数相加
y(1,i)=y(1,i)+z(j,i);       
end
%对最终的数据进行调整
y(1,i)=y(1,i)/sqrt(500);       
end

while 循环 while 循环的语法结构如下:
while 表达式     
 循环体;
end
实例:
t=zeros(1,6);
i=1;5
while i<=6
    t(1)=1/i;
    i=i+1;
end

条件语句实例:
function y=control(n)
a=20;
if n==0
    y=a+1;
elseif n==1
    y=a*(1+n);
elseif n==2
    y=a+n;
else
    y=a;
end
swich case语句实例
switch expression
  case value1
      statements1;
  case value2
      statements2;
      ……
  case valuen
      statementsn;
  otherwise
      statements;
end

其他流控制语句
continue、break、return、echo、error、try⋯ catch
文件打开  fid=fopen('fft.m', 'r');

对于脚本式 M 文件,echo 命令可以用以下方式来实现: echo on   %显示其后所有执行的命令文件的指令 echo off   %不显示其后所有执行的命令文件的指令 echo      %在上述两种情况之间切换 对于函数式 M 文件,echo 命令可以用以下方式来实现: echo filename on    %使 filename 指定的 M 文件的执行命令显示出来 echo filename off    %使 filename 指定的 M 文件的执行命令不显示出来 echo on all         %其后的所有 M 文件的执行指令显示出来 echo off all         %其后的所有 M 文件的执行指令显示出来

error 此指令是用来指示出错信息并终止当前函数的运行。语法格式如下:
error(‘message’) 类似的还有 warning 指令,二者区别在于 warning 指示警告信息后程序仍继续运行。

try...catch实例 可调用 lasterr 函数查询出错原因
clear;
n=4;
a=magic(3);
try
    a_n=a(n,:),
catch
    a_end=a(end,:),
end
lasterr

input实例
user_entry=input(’prompt’)  %在屏幕上显示提示信息 prompt,等待用户的输入,并将输入赋给变量
user_entry user_entry=input(’prompt’,’s’)  %返回的字符串作为文本变量而不是作为变量名或者数值

keyboard 命令
此命令被放置在 M 文件中,将停止文件的执行并将控制权交给键盘。通过在提示符前显 示 K 来表示一种特殊状态。在 M 文件中使用该命令,对程序的调试和在程序运行中修改变 量都很方便

pause命令
此命令用于暂时中止程序的运行,等待用户按任意键继续进行。该命令在程序的调试过 程和用户需要查询中间结果时使用很方便。该命令的语法格式如下:
pause    %停止 M 文件的执行,按任意键继续
pause(n)  %中止执行程序 n 秒后继续,n 是任意实数
pause on  %允许后续的 pause 命令中止程序的运行
pause off  %禁止后续的 pause 命令中止程序的运行

程序BUG
语法错误(Syntax Errors)和逻辑错误(Logic Errors
语法错误一般是指变量名与函数名 的误写、标点符号的缺漏和 end 的漏写等,

命令行调试
(1)设置断点 这是其中一个最重要的部分,可以利用它来指定程序代码的断点,使得 MATLAB 可在 断点前停止执行,从而可以检查各个局部变量的值。函数格式有以下几种: • dbstop in mfile 在文件名为 mfile 的 M 文件的第一个可执行语句前设置断点,执行该命令后,当程序运 行到 mfile 的第一个可执行语句时,可暂时中止 M 文件的执行,并进入 MATLAB 的调试模 式。M 文件必须处在 MATLAB 搜索路径或当前目录内。如果用户已经激活了图形调试模式, 则 MATLAB 调试器将打开该 M 文件,并在第一个可执行语句前设置断点。 • dbstop in mfile at lineno 在文件名为 mfile 的 M 文件的第 lineno 行设置断点,执行过程与上一命令类似。如果行 号为 lineno 的语句为非执行语句,则停止执行的同时,在该行号的下一个可执行语句前设置 断点。M 文件必须处在 MATLAB 搜索路径或当前目录内。此时,用户可以使用各种调试工 具、查看工作空间变量、公布任何有效的 MATLAB 函数。 • dbstop in mfile at subfun 执行该命令后,当程序执行到子程序 subfun 时,暂时中止文件的执行并使 MATLAB 处 于调试模式,其他要求和操作与上面的函数类似。 • dbstop if error 执行该命令后,可在运行 M 文件遇到错误时,终止 M 文件的执行,并使 MATLAB 处于 调试状态,运行停止在产生错误的行。这里的错误不包括 try⋯catch 语句中检测到的错误, 用户不能在错误后重新开始程序的运行。 • dbstop if all error 与上一命令类似,但是在执行该命令时遇到任何类型的运行错误时均停止,包括在 try⋯ catch 语句中检测到的错误。 • dbstop if warning 执行该命令后,在运行 M 文件遇到警告时,终止 M 文件的执行,并使 MATLAB 处于调 试状态,运行将在产生警告的行暂停,程序可以恢复运行。 • dbstop if caught error 执行该命令后,当 try⋯catch 检测到运行时间错误时,停止 M 文件的执行,用户可以恢 复程序的运行。 • dbstop if naninf 或 dbstop if infnan 执行该命令后,当遇到无穷值或者非数值时,终止 M 文件的执行。
(2)清除断点 • dbclear all 清除所有 M 文件中的所有断点。 • dbclear all in mfile 清除文件名为 mfile 的 M 文件中的所有断点。 • dbclear in mfile  清除 mfile 中第一个可执行语句前的断点。 • dbclear in mfile at lineno 清除 mfile 中行号为 lineno 的语句前的断点。 • dbclear in mfile at subfun 清除 mfile 中子函数 subfun 行前的断点。 • dbclear if error 清除由 dbstop if error 设置的暂停断点。 • dbclear if warning 清除由 dbstop if warning 设置的暂停断点。 • dbclear if naninf 清除由 dbstop if naninf 设置的暂停断点。 • dbclear if infnan 清除由 dbstop if infnan 设置的暂停断点。
MATLAB 7.0 从入门到精通
–108–
(3)恢复执行 • dbcont 从断点处恢复程序的执行,直到遇到程序的另一个断点或错误后返回 MATLAB 基本工 作空间。 (4)调用堆栈 • dbstack 此命令显示 M 文件名和断点产生的行号,调用此 M 文件的名称和行号等,直到最高级 M 文件函数,即列出了函数调用的堆栈。 使用此命令时,有如下格式:
[ST,I] = dbstack 通过 M×1 的结构体 ST 形式返回堆栈信息。ST 的形式有以下几种。 file—函数出现的文件名,如果没有则为空; name—文件中的函数名; line—函数行号。 I 是当前的工作空间的索引。 • dbstack(N) 此命令省略了显示中的前 N 个帧。 • dbstack (’-completenames’) 此命令输出堆栈中的每个函数的全名,即函数文件的名称和在堆栈中函数包含的关系。 (5)列出所有断点 • dbstatus 此命令列出所有的断点,包括错误、警告、nan 和 inf 等。 s=dbstatus 将通过一个 M×1 的结构体来返回断点信息,结构体中有以下字段。 name—函数名; line—断点行号向量; expression—与 line 中相对应的断点条件表达字符串; cond —条件字符串,如 error、caught error、warning 或 naninf; identifier—当条件字符串是 error、caught error 或 warning 时,该字段是 MATLAB 的信 息指示字符串。 • dbstatus mfile 此命令列出指定的 M 文件中的所有断点设置,mfile 必须是 M 文件函数的名称或者是 MATLAB 有效的路径名。  (6)执行 1 行或多行语句 • dbstep 执行当前 M 文件下一个可执行语句。 • dbstep nlines 执行下 nlines 行可执行语句。 • dbstep in 当执行下一个可执行语句时,如果其中包含对另外一个函数的调用,此命令将从被调用
的函数文件的第一个可执行语句执行。 • dbstep out 此命令将执行函数剩余的部分,在离开函数时停止。 这 4 种形式的语句执行完后,都返回调试模式,如果在执行过程中遇到断点,程序将 中止。 (7)列出文件内容 • dbtype mfile 列出 mfile 文件的内容,并在每行语句前面加上标号以方便使用者设定断点。 • dbtype mfile start:end 列出 mfile 文件中指定行号范围的部分。 在 UNIX 和 VMS 调试模式下,并不显示 MATLAB 的调试器,此时必须使用 dbtype 来 显示源程序代码。 (8)切换工组空间 • dbdown 遇到断点时,将当前工作空间切换到被调用的 M 文件的空间。 • dbup 将当前工作空间(断点处)切换到调用 M 文件的工作空间。两个命令常常配合使用。 (9)退出调试模式 • dbquit 立即结束调试器并返回到基本工作空间,所有断点仍有效

图形界面调试
• step( ) 单步执行,快捷键为 F10,与调试命令中的 dbstep 相对应。 • step in( ) 深入被调函数,快捷键为 F11,与调试命令中的 dbstep in 相对应。 • step out( ) 跳出被调函数,快捷键为 Shift+F11,与调试命令中的 dbstep out 相对应。 • run/continue( ) 连续执行,快捷键为 F5,与调试命令中的 dbcont 相对应。 • go until cursor 运行到鼠标所在的行,与 dbstop in mfile at lineno 相对应。 • set/clear breakpoint( ) 设置或清除断点,快捷键为 F12,与 dbstop 和 dbclear 相对应。 • set/modify conditional breakpoint⋯
• enable/disable breakpoint 允许或者禁止断点的功用。 • clear breakpoints in all files( ) 清除所有断点,与 dbclear all 相对应。 • stop if errors/warnings 与 dbstop if error、dbstop if all error、dbstop if warning、dbstop if caught error、dbstop if naninf 和 dbstop if infnan 等命令等价,单击此菜单项时,将弹出一个对话框,
• exit debug mode( ) 退出调试模式,与 dbquit 相对应。


///////////////////////MATLAB 系统仿真的功能是十分强大的,重要的是建立正确的数学 模型。 用 MATLAB 对基带数字通信系统进行仿真。///////////
建立模型前先对要解决的问题作细致的分析,弄清楚系统的输入/输出和工作过程,然后
逐步建立数学模型。在本例中需要对通信系统中的各个部分进行分析和建模。首先要产生随 机数,可以用 MATLAB 自带的函数实现,然后根据格雷码的编码原则实现基带的 QAM 调制。 插值(过采样)是为了后面经过低通时更好的成形滤波的需要,相当于滤波后采样点数 增加,从而使波形更平滑。实际的通信系统中有两倍的、四倍的和八倍的过采样方式,本系 统中采样八倍过采样,虽然倍数越高得到的波形越平滑,系统的性能越好,但是这样会增加 运算量。在设备条件一定的情况下,可能会影响到通信的实时性,尤其是载波调制时,这个 问题更为明显,本系统采用 8 倍过采样是一种折中的做法。 实际信道中传输的都是模拟信号,所以插值之后需要进行滤波,实现 D/A 转换,在 MATLAB 中所有的计算都是离散的,这样经过数字滤波器后仍是一个离散序列。程序中采用 平方根升余弦滚降低通滤波器来进行发送端的低通滤波和接收端的匹配滤波,滚降系数取 0.5,由于滤波器的响应出现了一个群延迟,所以在作图的时候需要通过将输入信号延迟一下 做补偿,补偿值为 delay*fd。 信号在信道中传输时会受到噪声的影响,本系统中用叠加高斯白噪声的方法来模拟这个 现象,程序中用函数(awgn)来实现。 经过信道的传输信号到达接收端,首先要经过匹配滤波器,去掉噪声的影响。对于平方 根升余弦滚降低通滤波器来讲,匹配滤波器仍是它本身。 由于过采样的过程中加入了多余的点,而实际发送的信号并不包括这些信号,所以接收 的时候应该通过采样的方式将实际发送的信号点提取出来。采样时应该注意与发送信号的同 步,这里在滤波的过程中前后分别加了 24 个冗余的点,采样时应该把这些点排除在外。解调 部分根据欧氏距离最小的原则对采样后的信号进行判决,然后按照调制时的规则进行逆变换, 每一个符号分成两个比特,然后可以计算实际的误比特率 ber 等于接收的错误比特数除以总 比特数。 对于加载波部分,程序中采用 10 个点表示一个正弦波形。因为要求载波频率是信号频 率(指的是 I 路和 Q 路分离后的频率)的 10 倍,随机序列经过 I 路和 Q 路分离后,频率为 1Hz,映射后变为 0.5Hz,插点后频率扩大八倍变为 4Hz,而载波频率为 16Hz,所以两个点 之间应该有 4 个周期的三角函数波形,每两个点之间对应有载波的 40 个点。为了做到矩阵运 算的匹配需要将信号数组作 40 倍扩展,反映到实际电路中应该加保持电路,而这样会增加很 多高频成分,往往加低通滤波对波形进行平滑,本系统中不做考虑。

你可能感兴趣的:(matlab基本编程)