2.6 M文件及程序调试
2.6.1 主程序文件
注释,以“%”对本程序的特性以及关键的部份进行说明。
1)一般以 clc,clear,close all等语句开始,清除工作空间中原有的变量和图形,以避免其它已执行的程序残留数据对本程序的影响。
2)程序的主体
如果程序中要用到全局变量,要在这里说明。
格式,global 变量名 1 变量名 2 变量名 3…
一般地,若程序中用到流程控制语句,
都要缩进,并且要注意 end的对应。
3)文件命名要应按前面介绍的标志符来命名。 文件名中不能有汉字,也不能以数字开头。
函数文件及其应用
函数文件是 M文件重要的组成部分,M语言函数文件能够接受用户的输入参数,进行计算,并将计算结果作为函数的返回值返回给调用者。
格式
function [x,y]=myfun(a,b,c)-----函数定义行
%函数功能说明行
%帮助文件,说明如何使用该函数
函数体例子
计算一数组的平均值及找出其中间值。
主程序:
clc
clear,close all
N=input('n=')
x=1:N;
[mean,mid]=newstats(x)
%mean
%mid
x1=[5.8,1,3.5,2.2,6.3,3.8]
[mean1,mid1]=newstats(x1)
函数
function [avg,med]=newstats(u)
n=length(u);
avg=mean(u,n);
med=median(u,n);
function a=mean(v,n)
a=sum(v)/n;
function m=median(v,n)
w=sort(v);
if rem(n,2)==1
m=w((n+1)/2);
else
m=(w(n/2)+w(n/2+1))/2;
end
程序调试
M文件编辑器不仅是个文件编辑器,而且是个可视化的调试开发环境。
在这里可以对主程序以及函数文件进行调试,以排查程序的错误。
一般地,程序错误有两类:
1、语法错误;
2、运行错误。
断点的设置
在文件编辑器中有个 Breakpoins菜单,可以用来设置断点,只有设置了断点的程序才能进行调试。
调试程序按钮
clc
clear,close all
dt=0.01
t=0:dt:5;
x=exp(-2*t)
h=exp(-1*t);
subplot(2,2,1),plot(t,h);grid
y=conv(x,h)*dt;
figure
subplot(2,2,2),plot(t,y(1:length(t)));grid
y1=exp(-t)-exp(-2*t);
subplot(2,2,3),plot(t,y1,'r'),grid
第四章 matalab其它函数库
4.1数据分析函数库
4.1.1基本数据分析
clc
clear
close all
data=[154 49 83 67;158 99 81 75;155 100 68 86;145
63 75 96;145 63 75 96;141 55 65 75;
155 56 64 85;147 89 87 77;147 96 54 100;145 60
76 67]
D=max(data)
Std(data)求各列标准差,是指将 N个元素与该列的平均值之差的平方和开方即

N
d at ame and at ad at as t d 2))(()(
4.1.2 用于场论的数据分析函数
4.1.3 用于随机数据分析的函数
4.1.4 用于傅立叶分析的函数
4.2 矩阵的分解和变换
4.2.1 线性方程组的系数矩阵
4.2.2 矩阵的分解
4.2.3 矩阵的特征值分析
4.1.2 用于场论的数据分析函数
1)gradient函数,用于求二维场和三维场的梯度。若 F(x,y),
jyFixF F
2)del2 是二维场和三维场的拉普拉斯算子
L = del2(U)
.,,)(
2
1
2 2
2
2
2
2
22

zd
ud
yd
ud
xd
ud
NN
ul
N是自变量的个数
cross 为两个向量的矢量积。
a× b=(aybz-azby)i+ (azbx-axbz)j+ (axby-aybx)k
Dot 为两个向量的数量级。
例,设 a=[1,2,3]; b=[2,3,8]
c=cross(a,b)=??
d=dot(a,b)=??
4.1.3 用于随机数据分析的函数
产生随机数的命令
1,rand(m,n) 产生在 0与 1之间均匀分布的
m行 n列随机数矩阵,其均值为 0.5。
2,randn(m,n) 产生正态分布的 m行 n列随机数矩阵,其均值为 0。
练习:
x=rand(1,1000); hist(x)
y=randn(1,1000);hist(y)
4.1.4 用于傅立叶分析的函数
1、卷积,conv(x,y),结果为 x,y的卷积。
若 x是输入信号,y是线性系统的脉冲单位冲激函数,则 x,y的卷积就是系统的输出信号。
2,filter(b,a,x) 是根据输入信号 x和线性系统的传输系数,求输出信号。 A为分母多项式的系数向量,b为分子多项式的系数向量。
3,X=fft(x,N)
求出时域信号 x的离散傅立叶变换 X。 N
为规定的点数,其默认值为 x的长度。
当 N取 2的整数幂时变换的数度最快。
通常 N取大于又最靠近 x的幂次,即
N=2^nextpow2(length(x)),若 x的长度为 12,
nextpow2(12)= 4,N= 2^4=16;
问 length(x) =13,15,17;
nextpow2(length(x))=
fft函数
格式,X=fft(x,N)
一般情况下,fft求出的函数为复数,可用 abs和
angle分别求出其幅度和相位。
clc
Clear; close all;
t=0:0.001:3;
u=sin(300*t)+2*cos(200*t);
U=fft(u);
plot(abs(U));
axis([0,300,0,3000])
figure
plot(angle(U))
4、傅立叶逆变换函数
x=ifft(X)
4.2.1线性方程组的系数矩阵
线性方程组可以用矩阵法求解,
AX= B
A为系数矩阵。
det( A)
rank(A)
trace(A)
cond(A)
矩阵 A 的秩
在矩阵 A所能划分出的行列式不为零的最大方阵的边长为矩阵 A 的秩,记作 rA,
或 rankA。
特别规定零矩阵的秩为零。
显然 rA≤min(m,n) 易得:
若 A中至少有一个 r阶子式不等于零,且在 r<min(m,n)时,A中所有的 r+1阶子式全为零,则 A的秩为 r。
练习 1
clc
clear
close all
a=[1 2 -1 3 ;2 -2 6 4 ;1 -1 3 2 ;0 0 0 0 ]
hlsa=det(a)
zhia=rank(a)
d=inv(a)
t=trace(a)
c=cond(a)
练习 2》》
clc
clear
close all
a=[ 2 9 0 0;0 4 1 4;7 5 5 1;7 8 7 4 ]
hlsa=det(a)
zhia=rank(a)
d=inv(a)
t=trace(a)
c=cond(a)
4.2.2 矩阵的分解
矩阵可以分解成几个具有特殊构造性质的矩阵的乘积。
1、矩阵的三角分解( lu分解)
[l,u]=lu(a)
2、矩阵的正交分解( qr分解)
q为正交方阵,a为上三角矩阵
3、奇异值分解( svd分解)
格式,[u,s,v]=svd(b)
分解成三个矩阵,其中 s对角线上的元素就是矩阵 a的奇异值。
矩阵的条件数等于最大奇异值和最小奇异值之比。
练习
clc
clear
close all
b=[0.2190 0.6793 0.5194 0.0535
0.0077;0.0470 0.9347 0.8310 0.5297 0.3834;
0.6789 0.3835 0.0346 0.6711 0.0688]
[q,r]=qr(b)
[u,s,v]=svd(b)
4.2.3 矩阵的特征值分析
格式,[e,r]=eig(a)
e为矩阵特征向量; r为矩阵的特征根。
特征根为特征方程的根。
另一方法,用 matlab的 poly函数可以求出矩阵的特征方程系数。
利用 roots命令可以求出其特征根。
练习
clc
clear
close all
a=[ 2 9 0 0;0 4 1 4;7 5 5 1;7 8 7 4 ]
[e,r]=eig(a)
p=poly(a)
r=roots(p)