MATlAB学习笔记
数学模型四大组成部分:
-
决策变量(自变量)
-
环境变量(无法干预的因素)
-
目标函数(因变量)
-
约束条件(可行域的范围)
物理模型(事物模型)、符号模型、数学模型
数学建模竞赛论文写作规范
MATLAB皮毛
1.变量
变量名区别大小写
字母开头(可使用字母、数字、下划线),最多不超多63位
clear all 清除右侧工作区变量
clc清除命令行所有内容
注释“%% ”
1.1数字
1.2字符和字符串
s = ‘a’
abs(s)=97
char(97) = ‘a’
1.3矩阵
A = [1 2 3; 4 5 2; 6 7 2] 或者A=[1,2,3; 4,5,2; 6,7,2]
分号 ‘;’ 跳到下一行,逗号 ‘,’ 和空格 ’ ’ 分开数字
B = A’——B为A的转置
C = A(😃——竖着拉长
D = inv(A)——矩阵求逆(非方阵无法求逆)
A * D
E = zeros(10,5,3)——三维10行5列矩阵
rand
rand(m,n)生成m行n列的均匀分布的伪随机数
rand(m,n,‘double’)生成指定精度的均匀分布的伪随机数,参数还可以是’single’
randi
randi(iMax)在开区间(0,iMax)生成均匀分布的伪随机整数
randi(iMax,m,n)在开区间(0,iMax)生成m*n型随机矩阵
r = randi([iMin,iMax], m, n)也是开区间
randn
生成标准分布的伪随机数(均值为0,方差为1)
1.4元胞数组
A = cell(1,6)——1行6列的元胞数组
A{2} = eye(3)——A{2}为3*3的对角线数值为1的单位矩阵
A{5} = magic(3)——生成一个3阶的幻方。3阶幻方就是1-9九个数字,组成一个3*3的矩阵,使得该矩阵无论横、竖、斜三个方向的数的和相等。
-
magic(n)——生成一个n阶的幻方。n阶幻方就是1-n^2个数字,组成一个n*n的矩阵,使得该矩阵无论横、竖、斜三个方向的数的和相等,和为n * (n^2+1) / 2
1.5结构体
books = <mark>struct</mark>('name' , {{'Machine Learning' , 'Data Mining'}} , 'price' , [30 , 40])
books.name = {‘Machine Learning’} {‘Data Mining’}
books.name(1) = {‘Machine Learning’}——取出来的是cell
books.name{1} = ‘Machine Learning’——取出来的是字符串
2.矩阵操作
2.1矩阵的定义和构造
A = [1 2 16 1 03 16]
B = 0 : 2 : 10——B = [ 0 2 4 6 8 10 ],从0到10,2为步长
C = repmat(B, 3, 1)
C =
0 2 4 6 8 10
0 2 4 6 8 10
0 2 4 6 8 10
C = repmat(B, 3, 2)——把B重复3行2列
C =
0 2 4 6 8 10 0 2 4 6 8 10
0 2 4 6 8 10 0 2 4 6 8 10
0 2 4 6 8 10 0 2 4 6 8 10
D = ones(3,2)
D =
1 1
1 1
1 1
2.2矩阵的四则运算
A = [1 2 3 4; 5 6 7 8]
1 2 3 4
5 6 7 8
B = [9 9 6 6; 7 7 8 8]
9 9 6 6
7 7 8 8
C = A+B
10 11 9 10
12 13 15 16
D = A-B
-8 -7 -3 -2
-2 -1 -1 0
E = A * B’——A乘B的转置
69 77
189 197
F = A .* B——对应项相乘
9 18 18 24
35 42 56 64
G = A / B——相当于A乘于B的逆,A * pinv(B)
-0.4167 0.7500
-0.2833 1.1500
H = A ./ B——对应项相除
0.1111 0.2222 0.5000 0.6667
0.7143 0.8571 0.8750 1.0000
2.3矩阵的下标
A =magic(5)
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
B =A(2,3)
7
C =A(3,:)
4 6 13 20 22
D =A(:,4)
8
14
20
21
2
[m , n] = find(A > 20)
m =
2
1
5
4
3
n =
1
2
3
4
5
3.MATLAB的逻辑和流程控制
if else end
for end
while end
switch case end
3.1for循环结构
步长默认为1,可以省略
3.2while循环结构
3.3if…else…end结构
3.4switch…case…end结构
4.MATLAB基本绘图操作
4.1二维平面绘图
figure建立一个幕布
plot(x,y)——以x为横轴,y为纵轴建立一个坐标系
title( ‘y=sin(x)’ )——给图像标题命名
xlable(‘x’)——x轴标签
ylable(‘sin(x)’)——y轴标签
xlim([0 2*pi])——将图像中的x轴坐标范围限定在[0,2*pi]之间
参数:
对同一个幕布同一个x有多个y:
-
- plotyy(x,y1,x,y2,‘plot’)
4.2三维立体绘图
plot3(x,sin(x),cos(x))
hold on——在同一个幕布当中绘制多条线
hold off——不保存多个东西
grid on——在图后面加一些网格线
5.MATLBA图形的保存与导出
MATLAB数学建模
(以《MATLAB数学建模》——李昕版本为参考书籍)
第一章 MATLAB基础知识
1.1 数组和变量
1.1.1 数组的定义
1.1.2 数组的创建
1.创建空数组
>> A = []
A =
[]
2.创建一维数组
>> A = [1 2 3]
A =
1 2 3
>> B = [1;2;3]
B =
1
2
3
和冒号类似的功能是linspace函数:
-
Var = linspace(start_var, stop_var, n),从start_var到stop_var,创建总元素为n的等差数列,n默认值为100
-
Var = logspace(start_var, stop_var, n),从10start_var到10stop_var,创建总元素为n的等比数列,n默认值为100
>> A = 1:4
A =
1 2 3 4
>> B = 1:2:4
B =
1 3
>> C = linspace(1,2,4)
C =
1.0000 1.3333 1.6667 2.0000
>> logspace(0, log10(32), 6)
ans =
1.0000 2.0000 4.0000 8.0000 16.0000 32.0000
3.创建二维数组
>> A = [1 2 3; 2 5 6; 1 4 5]
A =
1 2 3
2 5 6
1 4 5
>> B = [1:5; linspace(3,10,5); 3 5 2 6 4]
B =
1.0000 2.0000 3.0000 4.0000 5.0000
3.0000 4.7500 6.5000 8.2500 10.0000
3.0000 5.0000 2.0000 6.0000 4.0000
>> C = [[1:3]; [linspace(2,3,3)]; 3 5 6]
C =
1.0000 2.0000 3.0000
2.0000 2.5000 3.0000
3.0000 5.0000 6.0000
4.创建三维数组
1)使用下标创建三维数组
>> for i = 1:2
for j = 1:2
for k = 1:2
A(i,j,k) = i + j + k;
end
end
end
>> A
A(:,:,1) =
3 4
4 5
A(:,:,2) =
4 5
5 6
>> B(3,4,:)=2:5
B(:,:,1) =
0 0 0 0
0 0 0 0
0 0 0 2
B(:,:,2) =
0 0 0 0
0 0 0 0
0 0 0 3
B(:,:,3) =
0 0 0 0
0 0 0 0
0 0 0 4
B(:,:,4) =
0 0 0 0
0 0 0 0
0 0 0 5
2)使用低维数组创建高维数组
>>D2 = [1 2 3; 4 5 6; 7 8 9];
D3(:,:,1) = D2;
D4(:,:,2) = 2*D2;
3)使用创建函数创建三维数组
-
C = cat(dim,A1,A2,A3,···),cat的功能是连接数组,dim是创建数组的维度,A1、A2、A3表示各维度上的数组
>> D1 = [ 1 2 3 ;4 5 6; 1 1 1]
D2 = cat(3,2*D1,D1*D1,D1')
D1 =
1 2 3
4 5 6
1 1 1
D2(:,:,1) =
2 4 6
8 10 12
2 2 2
D2(:,:,2) =
12 15 18
30 39 48
6 8 10
D2(:,:,3) =
1 4 1
2 5 1
3 6 1
-
repmat用来复制并堆砌数组
-
reshape用来重构数组
5.利用函数创建标准数组
-
zeros
-
ones
-
eye——单位矩阵
-
magic
-
randn
-
gallery——测试矩阵
1.1.3 多维数组及其操作
1.属性
-
size(A)——返回数组每一维上的大小
-
ndims(A)——返回数组A具有的维度值
-
whos——返回当前工作区各个变量的详细信息
2.维度操作
-
permute函数可以按照指定的顺序重新定义多维数组的维度顺序
-
ipermute函数被看作permute的逆函数,当B=permute(A,dims)时,ipermute(B,dims)刚好返回多维数组A
3.科学运算
-
sum、mean等函数可以对多维数组中第1个不为1的维度上的向量进行计算
-
sin、cos则对每一个元素单独进行运算
-
eigs等针对二维数组的运算函数则需要用指定的页面上的二维数组作为输入函数
1.2 矩阵
1.2.1符号矩阵的生成
-
str2sym——符号赋值函数
-
syms——符号声明函数
>> sym_matrix = str2sym('[a b c; Jack Mike John]')
sym_matrix =
[ a, b, c]
[Jack, Mike, John]
>> syms a b c
M1 = sym('Classical')
M2 = sym('Jazz')
M3 = sym('Blues')
syms_matrix = [a b c;M1,M2,M3;2,3 5]
M1 =
Classical
M2 =
Jazz
M3 =
Blues
syms_matrix =
[ a, b, c]
[Classical, Jazz, Blues]
[ 2, 3, 5]
1.2.2 大矩阵的生成
>> M = [1 2 3 4 5
1 2 3 4 6
6 6 6 6 6 ]
M =
1 2 3 4 5
1 2 3 4 6
6 6 6 6 6
1.2.3 矩阵的数学函数
-
exp(x)——计算矩阵x中每一个元素的指数
-
expm(x)——对矩阵x求指数
-
logm(x)——计算矩阵x的对数,是exmp函数的逆运算
-
complex(a,b)——a+bi
-
abs(3+2i)——求矩阵的模、求复数的幅值
-
det(x)——计算方阵行列式的值
-
eig(x)——求解方阵的特征值和特征向量
-
inv(x)——求解方阵的逆矩阵
1.3 符号运算的基本内容
1.3.1 符号变量代换其函数
subs(S, old, new)——将符号表达式S中的old变量替换为new
subs(S, new)——用new置换符号表达式S中的自变量
>> syms a b c d k n x y w t;
f = a * x^n + b * y + k
f1 = subs(f,[a b],[sin(t) log(w)])
f2 = subs(f1,k,1:4)
f =
k + a*x^n + b*y
f1 =
k + x^n*sin(t) + y*log(w)
f2 =
[x^n*sin(t) + y*log(w) + 1, x^n*sin(t) + y*log(w) + 2, x^n*sin(t) + y*log(w) + 3, x^n*sin(t) + y*log(w) + 4]
1.3.2 符号对象转换为数值对象的函数
-
double©——将符号常量C转换为双精度值
-
digits(D)——设置有效数字为D的近似解精度
-
vpa(E,D)——求得符号表达式E的D位精度的数值解
-
numeric(E)——将不含变量的符号表达式E转换为double双精度浮点数值形式,其效果与N = double(sym(E))相同
1.3.3 符号表达式的化简
-
factor()——符号表达式因式分解
-
expand()——符号表达式展开
-
collect()——合并同类项
-
simplify()——将符号表达式运用多种恒等变换综合化简
-
[R,HOW] = simple()——化简范围大于simplify,R为被化简的表达式,HOW为化简方法 -
[N,D] = numden()——通分,返回通分后的分子N与分母D,并转换成分子分母都是整系数的最佳多项式形式。若无等号左边的输出参数时,仅返回通分后的分子N,即numden(E)左边无”[N,D]=“时,输出为N。
-
horner()——将符号表达式转换为嵌套形式表达式
1.3.4 符号运算的其他函数
-
char()——将数值对象、符号对象转换为字符对象
-
pretty()——以习惯的方式显示符号表达式
>> syms a b c d x y
f = a * x/b + c/(d * y);
f1 = sqrt(b^2 - 4*a*c);
pretty(f)
pretty(f1)
c a x
--- + ---
d y b
2
sqrt(b - 4 a c)
-
clear——清除MATLBA工作区中的内容
1.3.5 两种特定的符号运算常数
-
compose()——复合函数运算命令
-
finverse()——反函数运算命令
第二章 数学建模基础
2.1 数学建模的概念
2.2 数据导入和保存
1.数据导入——load、importdata
2.文件的存储——save
3.文件的打开——open
注:open是以结构体的形式打开在工作区中
2.3 数据统计和分析
2.3.1 常用统计量
-
mean()——求算数平均值
nanmean()——忽略NaN计算算数平均值
-
median()——计算中位数
nanmedian()
-
var()——求样本方差
-
std()——求样本标准差
-
Jarque-Bera检验,该检验基于数据样本的偏度和峰度,评价给定数据是否服从未知均值和方差的正态分布的假设。对于正态分布数据,样本偏度接近于0,样本峰度接近于3。
>>
h = jbtest(X)——对输入数据矢量X进行Jarque-Bera检验,返回检验结果h。若h=1,则在显
著性水平0.05下拒绝X服从正态分布的假设;若h = 0,则可认为X服从正态分布
h = jbtest(X,alpha)——在显著性水平alpha下进行Jarque-Bera检验。
[H,P,JBSTAT,CV] = jbtest(X,alpha)——返回其他三个输出。P为检验的p值,JBSTAT为
检验统计量,CV为确定是否拒绝零假设的临界值
2.3.2 随机数
-
binornd()——二项分布随机数
-
poisspdf()——泊松分布随机数
-
unifrnd()——均匀分布随机数
-
normrnd()——正态分布随机数
······
2.3.3 假设检验
-
ztest()——方差已知时的均值假设检验
-
ttest()——方差未知时单个正态总体均值的假设检验
-
ttest2()——方差未知时两个正态总体均值的假设检验
2.3.4 方差分析
-
anoval()
2.4 统计图表的绘制
1.正整数的频率表
-
tabulate(X)
>> A = [1 1 4 5 1 4]
tabulate(A)
A =
1 1 4 5 1 4
Value Count Percent
1 3 50.00%
2 0 0.00%
3 0 0.00%
4 2 33.33%
5 1 16.67%
2.经验累积分布函数图像
-
[h,stats] = cdfplot()——h表示曲线的环柄,stats表示一些样本特征
>> X = normrnd(0,1,50,1);
[h,stats] = cdfplot(X)
h =
Line - 属性:
Color: [0 0.4470 0.7410]
LineStyle: '-'
LineWidth: 0.5000
Marker: 'none'
MarkerSize: 6
MarkerFaceColor: 'none'
XData: [-Inf -2.1495 -2.1495 -1.6747 -1.6747 -1.6105 -1.6105 -1.5305 -1.5305 -1.4487 -1.4487 … ]
YData: [0 0 0.0200 0.0200 0.0400 0.0400 0.0600 0.0600 0.0800 0.0800 0.1000 0.1000 0.1200 0.1200 … ]
显示 所有属性
stats =
包含以下字段的 struct:
min: -2.1495
max: 2.6825
mean: -0.1385
median: -0.1591
std: 1.0113
3.最小二乘拟合直线
-
lsline
4.绘制正态分布概率图形
-
normplot(X)——若X为向量,则显示正态分布概率图形;若X为矩阵,则显示每一列的正态分布概率图形
>> A = [0 5 1 1 2 3 0 3 0 1 1 8];
normplot(A)
5.绘制威布尔概率图形
-
wblplot(X)——若X为向量,则显示威布尔概率图形;若X为矩阵,则显示每一列的威布尔概率图形
>> A = [0 5 1 1 2 3 0 3 0 1 1 8];
weibplot(A)
6.样本数据的盒图
-
boxplot
>> X1 = normrnd(5,1,100,1);
X2 = normrnd(6,1,100,1);
x = [X1 X2];
boxplot(x,1,'|',1,0)
7.增加参考线
-
refline(slope,intercept)——slope表示斜率,intercept表示截距
-
refline(slope,intercept)——slope = [a b],图中加一条直线y=ax+b
>> XJY = [0 5 1 1 2 3 0 3 0 1 1 8]';
plot(XJY)
refline(0.1,-1)
8.增加多项式曲线
-
refcurve()——在当前图形中加入一条多项式曲线
h = refcurve(p)——在图中加入一条多项式曲线,h为曲线的环柄,p为多项式系数向量,p = [p1,p2,p3,···,pn],其中p1为最高幂项系数。
>> h = [95 172 220 269 349 281 423 437 432 478 556 430 410 356];
plot(h,'r')
refcurve([-6,120,-10])
9.样本概率图形
-
p = capaplot(data,specs)——返回来自于估计分布的随机变量落在指定范围内的概率。data为所给样本数据,specs为指定范围,p表示在指定范围内的概率
>> h = [95,172,220,269,349,281,423,437,432,478,556,430,410,356];
p = capaplot(h,[100,300])
p =
0.3213
10.附加有正态密度曲线的直方图
-
histfit(data)——data为向量,返回直方图和正态曲线
-
histfit(data,nbins)——nbins指定bat的个数
>> A = normrnd(5,10,1,20);
histfit(A)
11.在指定的界限之间画正态密度曲线
-
p = normspec(specs,mu,sigma)——specs指定界限,mu、sigma为正态分布的参数,p为样本落在上、下界之间的概率。
>> normspec([50,inf],200,100)
ans =
0.9332
2.5 回归模型
回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
回归分析通常分为一元线性回归分析、多元线性回归分析、非线性回归分析、曲线估计、时间序列的曲线估计、含虚拟变量的回归分析和逻辑回归分析等类型
1.一元线性回归
>> x = 1:10;
y = [2650 1942 1493 1086 766 539 485 291 224 202];
for i = 1:10
plot(x(i),y(i),'ok');
hold on
end
xlabel('x');
ylabel('y');
>> x = 1:10;
y = [2650 1942 1493 1086 766 539 485 291 224 202];
z = zeros(size(y));
N = length(y);
for i = 1:N
z(i) = log(y(i));
plot(x(i),z(i),'ok');
hold on
end
xlabel('x');
ylabel('z');
2.多元线性回归
-
[b,bint,r,rint,stats] = regress(y,x,alpha)——y为因变量数据向量,x为自变量数据向量,alpha为显著性水平(缺省时设定为0.05)。b为输出向量,bint为回归系数估计值和它们的置信区间,r为残差,rint为置信区间,stats是用于检验回归模型的统计量。
-
注意y,x的输入格式!
>> x1 = [1.376 1.375 1.378 1.401 1.412 1.428 1.445 1.477];
x2 = [0.450 0.475 0.485 0.500 0.535 0.545 0.550 0.575];
x3 = [2.170 2.554 2.676 2.713 2.823 3.088 3.122 3.262];
x4 = [0.8922 1.1610 0.5346 0.9589 1.0239 1.0499 1.1065 1.1387];
y = [5.19 5.30 5.60 5.82 6.00 6.06 6.45 6.95];
save data x1 x2 x3 x4 y
load data %%取出数据
Y = y';
X = [ones(size(x1')),x1',x2',x3',x4'];
[b,bint,r,rint,stats] = regress(Y,X)
b =
-13.3547
12.8531
1.7866
0.2071
-0.3714
bint =
-25.5633 -1.1461
0.6278 25.0784
-16.2410 19.8142
-1.4491 1.8632
-1.2072 0.4644
r =
-0.0631
0.0354
0.0211
0.0686
0.0460
-0.1627
0.0138
0.0409
rint =
-0.1322 0.0060
-0.2061 0.2769
-0.1355 0.1777
-0.4556 0.5927
-0.0073 0.0993
-0.3143 -0.0111
-0.5014 0.5291
-0.2791 0.3608
stats =
0.9830 43.2851 0.0055 0.0136
即Y于X的模型为:
Y = -13.3547 + 12.8531 * x1 + 1.7866 * x2 + 0.2071 * x3 - 0.3714 * x4
第三章 MATLAB程序设计
3.1 自顶向下的程序设计方法
以列主元高斯消元法为例
3.2 符号运算
3.2.1 符号对象
>> a1 = [1/3, pi/7, sqrt(5), pi+sqrt(5)]
a2 = sym([1/3, pi/7, sqrt(5), pi+sqrt(5)])
a3 = sym([1/3, pi/7, sqrt(5), pi+sqrt(5)],'e')
a4 = str2sym('[1/3, pi/7, sqrt(5), pi+sqrt(5)]')
a1 =
0.3333 0.4488 2.2361 5.3777
a2 =
[1/3, pi/7, 5^(1/2), 189209612611719/35184372088832]
a3 =
[1/3 - eps/12, pi/7 - (13*eps)/165, (137*eps)/280 + 5^(1/2), 189209612611719/35184372088832]
a4 =
[1/3, pi/7, 5^(1/2), pi + 5^(1/2)]
>> a5 = sym(str2sym('[1/3, pi/7, sqrt(5), pi+sqrt(5)]'))
a5 =
[1/3, pi/7, 5^(1/2), pi + 5^(1/2)]
%%可以看到a5的表达形式同a4非常像
3.2.2 创建符号对象
1.函数命令sym()的调用格式
-
S = sym(A)——由A来建立一个符号对象S,其类型为sym类型。A为数字(值)或数值矩阵或数值表达式,则输出是将数值对象转换成符号对象。
-
S = sym(‘A’)——A为不带 ‘[’ 、 ‘]’ 的字符串,将此字符串转换为符号对象。
-
S = sym(str2sym(‘[ ]’)或S = str2sym(’[ ]')
-
S = sym(A,flag)——命令功能同S = sym(A)。flag可以去以下选项
-
’r‘——默认设置,最接近有理表示的形式。这种形式是指用两个正整数p、q构成的p/q、p*pi/q、sqrt(q)、2p、q10表示的形式之一
-
‘d’——最接近的十进制浮点精确表示;
-
’e‘——带估计误差的有理表示
-
’f‘——十六进制浮点表示
-
-
S = sym(‘A’,flag)——命令功能同S = sym(’A‘)。只不过转换成的符号对象应按flag指定的要求。flag可取以下“限定性”选项:
-
‘positive’——限定A为正的实型符号变量
-
’real‘——限定A为实型符号变量
-
’unreal‘——限定A为非实型符号变量
-
2.函数命令syms()的调用格式
-
syms s1 s2 s3 flag——flag限定性同上
3.函数命令class( )的调用格式
-
str = class(object)——返回指代数据对象类型的字符串。
3.2.3 符号表达式及函数
在不指明自变量的情况下,按照数学常规,自变量通常都是小写英文字母,并且为字母表末尾的几个,如t、w、x、y、z等。
-
findsym(f,n)——按照数学习惯确定符号函数f中的n个自变量。当指定n=1时,从符号函数f中找出在字母表中与x最近的字母;如果有两个字母与x的距离相等,则取较后一个。当输入参数n缺省时,函数命令将给出f中所有的符号变量。
-
findsym(e,n)——这种格式的功能是按数学习惯确定符号方程e中的n个自变量
3.3 关系运算符和逻辑运算符
3.3.1 关系运算符
== 等于
~= 不等于
3.3.2 逻辑运算符
1.逐个元素的逻辑运算
逻辑与&、逻辑或|、逻辑非~
2.捷径逻辑运算
逻辑与&&、逻辑或||
3.逐位逻辑运算
-
bitand(a,b)——逐位逻辑与
-
bitor(a,b)——逐位逻辑或
-
bitcmp(a,b)——逐位逻辑非
-
bitxor(a,b)——逐位逻辑异或
3.3.3 常用操作函数
-
xor(x,y)——异或运算
-
any(x)——如果在一个向量x中,任何元素是非零,返回1;矩阵x中的每一列有非零元素,返回1
-
all(x)——如果在一个向量x中,所有元素非零,返回1;矩阵x中的每一列所有元素非零,返回1
3.4 分支结构
3.4.1 if分支结构
if expression
statements
elseif expression
statements
else
statements
end
3.4.2 switch分支结构
switch switch_expression
case `case_expression`
`statements`
...
otherwise
`statements`
end
3.5 循环结构2.
3.5.1 while循环结构
while expression
statements
end
3.5.2 for循环结构
for index
= values
statements
end
3.5.3 控制程序的其他命令
1.continue
2.break
3.return
4.input
-
input()
>> a = input('input a number:','s')
b = input('input a number:')
input a number:66n
a =
'66n'
input a number:6
b =
6
5.keyboard——使程序暂停运行,等待键盘命令
6.error和warning
-
error(‘message’)——显示出错信息message,终止程序
-
errordlg(‘errorstring’,‘dlgname’)——显示出错信息的对话框,对话框的标题为dlgname
-
warning(‘message’)——显示出错信息message,程序继续进行
3.6 程序调试和优化
3.6.1 程序调试命令
- dbstop - Set breakpoint %设置断点
- dbclear - Remove breakpoint %清除断点
- dbcont - Resume execution %重新执行
- dbdown - Change local workspace context %下移本地工作空间内容
- dbmex - Enable MEX-file debugging %使MEX文件调试有效
- dbstack - List who called whom %列出函数调用关系
- dbstatus - List all breakpoints %列出所有断点
- dbstep - Execute one or more lines %单步或多步执行
- dbtype - List M-file with line numbers %列出M文件
- dbup - Change local workspace context %上移本地工作空间内容
- dbquit - Quit debug mode %退出调试模式
3.6.2 经典算法程序举例
-
雅可比(Jacobi)迭代算法——解方程组常用算法
-
拉格朗日插值函数算法——求解插值点处的函数值
-
图论相关算法
-
最小生成树
-
最短路径Dijkstra算法
-
Ford算法
-
模糊聚类分析算法程序(组)
-
层次分析——求近似特征向量算法
-
灰色关联分析——单因子情形
-
灰色预测——GM(1,1)
-
第四章 常用建模函数
4.1 曲线拟合函数
4.1.1 多项式拟合
-
polyfit(x,y,n)——找到次数为n的多项式系数,对于数据集合{(xi,yi)},满足差的平方和最小
-
[p,E]=polyfit(x,y,n)——返回同上的多项式p和矩阵E。多项式系数在向量p中,矩阵E用在polyval函数中计算误差。
>> x = [0.3 0.4 0.7 0.9 1.2 1.9 2.8 3.2 3.7 4.5];
y = [1 2 3 4 5 2 6 9 2 7];
p5 = polyfit(x,y,5); %5阶多项式拟合
y5 = polyval(p5,x); %计算多项式 p 在 x 的每个点处的值
p5 %显示p5向量
p5 = vpa(poly2sym(p5),5)%显示5阶多项式
p9 = polyfit(x,y,9); %9阶多项式拟合
y9 = polyval(p9,x);
figure; %画图显示
plot(x,y,'bo');
hold on;
plot(x,y5,'r:');
plot(x,y9,'g--');
legend('原始数据','5阶多项式拟合','9阶多项式拟合');
xlabel('x');
ylabel('y');
p5 =
0.8877 -10.3002 42.9421 -77.9316 59.8332 -11.6732
p5 =
0.8877*x^5 - 10.3*x^4 + 42.942*x^3 - 77.932*x^2 + 59.833*x - 11.673
4.1.2 加权最小方差拟合
4.1.3 非线性曲线拟合
非线性曲线拟合是已知输入向量xdata、输出向量ydata,并直到输入与输出的函数关系为ydata = F(x,xdata),但不清楚系数向量x。进行曲线拟合即求x使得下式成立:
$$
minx(1/2)||F(x,xdata)−ydata||2_2=12∑(F(x,xdatai)−ydatai)2
$$
-
x = lsqcurvefit(fun, x0, xdata, ydata)——x0为初始解向量;xdata、ydata为满足关系ydata = F(x,xdata)的数据。
-
x = lsqcurvefit(fun, x0, xdata, ydata, lb, ub, options)——options为指定的优化参数
-
[x ,resnorm, residual, exitflag, output] = lsqcurvefit(···)——resnorm是在x处残差和的平方和,residual为在x处的残差,exitflag为终止迭代的条件,output为输出的优化信息。
4.2 参数估计函数
4.2.1 常见分布的参数估计
4.2.2 点估计
点估计是用单个数值作为参数的估计,目前使用较多的方法是最大似然法和矩法
1.最大似然法
pha = mle(‘dist’,data)——使用data适量中的样本数据,返回dist指定的分布的最大似然估计
2.矩法
moment(X,order)
4.2.3 区间估计
求参数的区间估计,首先要求出该参数的点估计,然后构造一个含有该参数的随机变量,并根据一定的置信水平求该估计值的范围。
mle()
4.3 参数传递函数
4.3.1 输入和输出参数的数目
MATLAB中可以通过nargin和nargout函数,确定函数调用时实际传递的输入和输出参数个数,结合条件分支语句,就可以处理函数调用中指定不同数目的输入/输出参数的情况。
function [n1,n2] = mythe(m1,m2)
if nargin == 1
n1 = m1;
if nargout == 2
n2 = m1;
end
else
if nargout == 1
n1 = m1 + m2;
else
n1 = m1;
n2 = m2;
end
end
>> m = mythe(4)
m =
4
>> [m,n] = mythe(4)
m =
4
n =
4
>> m = mythe(4,8)
m =
12
>> [m,n] = mythe(4,8)
m =
4
n =
8
>> mythe(4,8)
ans =
4
4.3.2 可变数目的参数传递
某些情况下,用户可能并不确定具体调用中传递的输入参数或输出参数的个数,即具有可变数目的传递参数。MATLAB中可通过varargin和varargout函数实现可变数目的参数传递,使用这两个函数对于处理具有复杂的输入/输出参数个数组合的情况也是便利的。
varargin
是函数定义语句中的一个输入变量,允许函数接受任意数量的输入参数。使用小写字符指定varargin
,将其作为最后一个输入参数附加在任何显式声明的输入项后。在执行函数时,
varargin
是一个 1×N 元胞数组,其中 N 是函数在显式声明的输入后收到的输入项数。但是,如果该函数在显式声明的输入后未收到任何输入,则varargin
是空元胞数组。
4.3.3 返回被修改的输入参数
同C语言,在函数内修改的工作区变量x不会改变实参x,除非返回到x
4.3.4 全局变量
关键词global
function y = azhe(x)
global A;
A = A + 9;
y = cos(x);
>> global A;
azhe(1)
ans =
0.5403
>> A
A =
11
4.4 插值函数
插值是指在所给的基准数据情况下,研究如何平滑地估算出基准数据之间其他点的函数数值。每当其他点上函数值获取的代价比较高时,插值就会发挥作用。
4.4.1 一维插值命令及实例
MATLAB中,一维插值有基于多项式的插值和基于快速傅里叶的插值的两种类型。一维插值就是对一维函数y = f(x)进行插值。
4.4.2 二维插值命令及实例
meshgrid函数用来生成二维和三维网格
[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐标返回二维网格坐标。X 是一个矩阵,每一行是 x 的一个副本;Y 也是一个矩阵,每一列是 y 的一个副本。坐标 X 和 Y 表示的网格有 length(y) 个行和 length(x) 个列。
[X,Y] = meshgrid(x) 与 [X,Y] = meshgrid(x,x) 相同,并返回网格大小为 length(x)×length(x) 的方形网格坐标。
[X,Y,Z] = meshgrid(x,y,z) 返回由向量 x、y 和 z 定义的三维网格坐标。X、Y 和 Z 表示的网格的大小为 length(y)×length(x)×length(z)。
[X,Y,Z] = meshgrid(x) 与 [X,Y,Z] = meshgrid(x,x,x) 相同,并返回网格大小为 length(x)×length(x)×length(x) 的三维网格坐标。
4.4.3 样条插值
-
yy = spline(x,y,xx)——对于给定的离散的测量数据x、y(称为断点),要寻找一个三项多项式y = p(x),以逼近每对数据(x,y)点间的曲线。
-
pp = spline(x,y)——返回由向量x与y确定的分段样条多项式的系数矩阵pp,它可用于命令ppval、unmkpp的计算。
>> x = [0 2 4 5 8 12 12.8 17.2 19.9 20];
y = exp(x).*sin(x);
xx = 0:0.25:20;
yy = spline(x,y,xx);
plot(x,y,'h',xx,yy,':black')
第九章 MATLAB数据图形可视化
9.1 MATLAB图形窗口
9.1.1 创建图形窗口
使用figure来建立图形窗口。
figure(x)——x为正整数,就会得到图形框名称为x的图形,直接输入figure默认显示图形框名称为1.
9.1.2 关闭与清楚图形框
-
close——关闭当前图形窗口,等效于close(gcf)
-
close(x)——关闭图形句柄指定的图形窗口
-
close name——关闭图形窗口名name指定的图形窗口
-
close all——关闭除隐含图形句柄的所有图形窗口
-
close all hidden——关闭包括隐含图形句柄的所有图形窗口
-
status = close(···)——调用close函数正常关闭图形窗口时,返回1,否则返回0。
-
clf——清楚当前图形窗口所有可见的图形对象
-
clf reset——清楚当前图形窗口所有可见的图形对象,并将窗口的属性设置为默认值
9.2 函数绘制
9.2.1 一元函数绘图
-
ezplot(f)——按照x的默认取值范围(-2pi<x<2pi)绘制f = f(x)的图形。对于f = f(x,y),则绘制f(x,y) = 0的图形
-
ezplot(f,[min,max])——按照x的指定范围(min<x<max)绘制f = f(x)的图形。
-
ezplot(x,y)——按照t的默认范围(-2pi<t<2pi)绘制x=x(t)、y=y(t)的图形。
-
ezplot(f,[xmin,xmax,ymin,ymax])——按照指定的x,y取值范围,在图形窗口绘制函数f = f(x,y)的图形。
-
ezplot(x,y,[tmin,tmax])——按照t的指定范围绘制x = x(t)、y = y(t)的图形。
>> syms x y
f = x.^3 + y.^2 - 3;
ezplot(f)
>> f = 'x.^3 + y.^2 - 3';
ezplot(f)
9.2.2 二元函数绘图
1.函数ezmesh
>> syms s t
x = 's^(2*t);
y = 'cos(s)^2+t';
z = 'sin(s)*tan(t)';
figure
ezmesh(x,y,z)
2.meshgrid、surf()——创建三维曲面图
对于二元函数z = f(x,y),每一对x和y的值产生一个z的值,作为x与y的函数,z是三维空间的一个曲面。MATLAB将z存放在一个矩阵中,z的行和列分别表示为:
$$
z(i,:) = f(x,y(i)
$$
$$
z(:,i) = f(x(i,y)
$$
当z = f(x,y)能用简单的表达式表示时,利用meshgrid函数可以方便地获得所有z地数据,然后用前面讲过的画三维图形的命令就可以绘制二元函数z = f(x,y)。
x = 0:0.5:4;
y = -5:0.2:3;
[X,Y] = meshgrid(x,y);
Z = cos(X).*cos(Y);
surf(X,Y,Z); %创建三维曲面图
xlabel('X'),ylabel('Y'),zlabel('Z');
title('Z = cos(X).*cos(Y)');
9.3 数据图形绘制简介
9.3.1 离散数据可视化
1.stem
-
stem(y)——以x=1,2,3···作为各个数据点的x坐标,以向量y的值为y坐标,在(x,y)坐标点画一个空心小圆圈,并连接一条线段到X轴
>> figure
t = linspace(-2*pi,2*pi,8)
h = stem(t)
set(h,'Color','blue')
t =
-6.2832 -4.4880 -2.6928 -0.8976 0.8976 2.6928 4.4880 6.2832
h =
Stem - 属性:
Color: [0 0.4470 0.7410]
LineStyle: '-'
LineWidth: 0.5000
Marker: 'o'
MarkerSize: 6
MarkerFaceColor: 'none'
BaseValue: 0
XData: [1 2 3 4 5 6 7 8]
YData: [-6.2832 -4.4880 -2.6928 -0.8976 0.8976 2.6928 4.4880 6.2832]
显示 所有属性
-
stem(x,y,‘option’)——以x向量的各个元素为x坐标,以y向量的各个元素为y坐标,在(x,y)坐标点画一个空心小圆圈,并连接一条线段到X轴。option选项表示绘图时的线型、颜色等设置。
-
stem(x,y,‘filled’)——filled表示点为实心
2.plot
>> a = linspace(-100,100,21);
b = (a.^2+sqrt(a))/1000;
plot(a,b,'rh','MarkerSize',15)
grid on
9.3.2 连续函数可视化
plot(若不用关键字或者显示某个具体点的内容,plot函数默认用直线连接各个离散点)
关键字:
-
Color
——线条颜色 -
LineStyle
——线型 -
LineWidth
——线条宽度 -
Marker
——标记符号 -
MarkerIndices
——要显示标记的数据点的索引(每隔多少个标记一个、标记特定的点) -
MarkerEdgeColor
——标记轮廓颜色 -
MarkerFaceColor
——标记填充颜色 -
MarkerSize
——标记大小 -
DatetimeTickFormat - datetime
——刻度标签的格式 -
DurationTickFormat - duration
——刻度标签的格式
plot(x,y,'-o','MarkerIndices',[1 5 10]) % 在第1、第5和第10个数据点处显示圆形标记。
plot(x,y,'-x','MarkerIndices',1:3:length(y)) % 每隔2个数据点显示1个交叉标记。
plot(x,y,'Marker','square','MarkerIndices',5) % 在第5个数据点显示1个正方形标记。
plot(x,y,'-or','MarkerIndices',1:8:length(y),'LineWidth',3,'MarkerSize',10,'MarkerEdgeColor','b','MarkerFaceColor','g')
9.4 二维绘图函数
9.4.1 二维图形绘制步骤
1.数据准备
2.指定图形窗口和位置
figure(1) 指定一号窗口
subplot(2,2,3) 将当前图窗划分为2×2网格,并在坐标区3创建图形
3.绘制图形
设置曲线的绘制方式,包括线型、色彩、数据点形等
plot(t,y,'b-') 用蓝实线画曲线
4.设置坐标轴和图形注释
设置坐标轴包括坐标的范围、刻度和坐标分割线等,图形注释包括图名、坐标名、图例、文字说明等。
title('调制波形') 图名
xlabel('t')
ylabel('y') 轴名
legend('sin(t)') 图例
text(2,0.5,'y = sin(t)') 文字
axis([0,pi,-1,1]) 设置轴的范围
grid on 画坐标分割线
5.图形的精细修饰
e.g.
set(h,'MakerSize',10) 设置数据点大小
6.按指定格式保存或导出图形
将绘制的图形窗口保存为.fig
文件,或者转换成其他图形文件、
9.4.2 快速方程式画图
1.fplot
单纯画方程式图形,图形之上(x,y)坐标值会自动取,但必须输入x坐标的范围。
-
fplot(‘方程式’,[xmin,xmax,ymin,ymax])
>> fplot('x-cos(x^2)-sin(2*x^3)',[-4,4])
警告: 在以后的版本中,fplot 将不接受字符向量或字符串输入。请改用 fplot(@(x)x-cos(x.^2)-sin(2.*x.^3))。
2.ezplot
-
ezplot——见9.2.1
9.4.3 特殊二维图形
1.特殊坐标图形的绘制
1)极坐标系
-
polar(theta,rho,LineSpec)——theta是用弧度制表示的角度,rho是对应的半径。极角theta为从x轴到半径的单位为弧度的向量,极径rho为各数据点到极点的半径向量,LineSpec指定极坐标图中线条的线型、标记符号和颜色等。
>> t = 0:0.1:3*pi; %极坐标角度
a = -2*pi:.001:2*pi; %设定极坐标角度
b = (1-sin(a)); %设定对应角度的半径
figure(1)
title('极坐标图形')
subplot(1,2,1); %在区域1绘图
polar(t,abs(cos(5*t)))%绘制图一
hold on;
subplot(1,2,2); %在区域2绘图
polar(a,b,'r'); %绘制图二
2)对数坐标系
-
semilogx(x,y)——x轴对数刻度坐标图,即用该函数绘制图形时x轴采用对数坐标。
>> x = 0:1000;
y = log(x);
semilogx(x,y)
-
semilogx(y)——对x轴的刻度求常用对数(以10为底),而y为线性刻度。
若y为实数向量或矩阵,则semilogx(y)结合y列向量的下标与y的列向量画出线条,即以y列向量的索引值为横坐标,以y列向量的值为纵坐标
>> y = [21 35 26 84
65 28 39 68
62 71 59 34];
semilogx(y)
-
semilogy(x,y)——y轴对数刻度坐标图,用该函数绘制图形时y轴采用对数坐标。
>> x = 0.001 : 0.1*pi : 2*pi;
y = 10.^x;
figure
subplot(2,1,1)
semilogy(x,y,'r-')
hold on
subplot(2,1,2)
plot(x,y)
*
3)柱坐标系
在MATLAB中没有在柱坐标和球坐标下直接绘制数据图形的命令,但pol2cart命令能够将柱坐标和球坐标值转化为直角坐标系下的坐标值,然后在直角坐标下绘制数据图形。
1:柱坐标系(r,φ,z)与直角坐标系(x,y,z)的转换关系:
$$
x=rcosφ
\
y=rsinφ
\
z=z
$$
2:同样的,直角坐标系(x,y,z)与柱坐标系(r,φ,z)的转换关系:$r = \sqrt{x2+y2}$
$\varphi = arctan(\dfrac{y}{x})$
$z=z$
-
[x,y] = pol2cart(theta,rho,)
-
[x,y,z] = pol2cart(theta,rho,z)
>> theta = 0 : pi/20 : 2*pi;
rho = sin(theta);
[t,r] = meshgrid(theta,rho);
z = r.*t;
[X,Y,Z,] = pol2cart(t,r,z);
mesh(X,Y,Z)
4)球坐标系
在MATLAB中可以使用sph2cart将球坐标值转换成直角坐标系下的坐标值,然后使用plot3、mesh等绘图命令。
1).球坐标系(r,θ,φ)与直角坐标系(x,y,z)的转换关系: [1]
x=rsinθcosφ.
y=rsinθsinφ.
z=rcosθ.
2).反之,直角坐标系(x,y,z)与球坐标系(r,θ,φ)的转换关系为:
$$
r = \sqrt{x2+y2+z^2}\
\theta = arccos\dfrac{z}{r}\
\phi = arctan\dfrac{y}{x}
$$
-
[x,y,z] = sph2cart(azimuth,elevation,r)——azimuth为方位角,elevation为仰角,r为半径
>> theta = linspace(0,2*pi,20);
fai = linspace(0,pi/2,20);
r = 1;
[x,y,z] = meshgrid(theta,fai,r);
[X,Y,Z] = sph2cart(x,y,z);
mesh(X,Y,Z)
2.特殊二维图形的绘制
-
bar(x,y)——条形图。x是横坐标,y是纵坐标
-
fplot(y,[a b])——精确绘图。y代表某个函数,[a,b]表示需要精确绘图的范围
-
polar(θ,r)——极坐标图。θ是角度,r代表以θ为变量的函数
-
stairs(x,y)——阶梯图。x是横坐标,y是纵坐标
-
line([x1,y1],[x2,y2],···)——折线图。[x1,y1]表示折现上的点
-
fill(x,y,‘b’)——实心图。x是横坐标,y是纵坐标,‘b’代表颜色
-
scatter(x,y,s,c)——散点图。s是圆圈标记点的面积,c是标记点的颜色
-
pie(x)——饼图。x为向量
-
contour(x)——等高线。x为向量
-
errorbar(y,e)——误差条。y为数据点,e为误差范围
-
hist(y)——直方图。y为矩阵
-
quiver(x,y,dx,dy)——向量图。
-
feather(x,y)——向量图。由向量参量x与y构成的速度参量,沿水平轴方向,从均匀间隔点发射出来
-
feather(z)——羽毛图。参量z是一个复数,相当于compass(real(z),imag(z))
-
movie()——建立动态二维图形。
>> x = [10 51 6 15 98 16 3 56];
subplot(1,2,1)
pie(x)
hold on
y = [0 1 0 0 1 0 0 0]; 切割饼图的操作
subplot(1,2,2)
pie(x,y)
>> M = rand(10000,3);
hist(M)
9.5 三维绘图函数
9.5.1 绘制三维曲面
-
surf()
-
surfc()——带等高线的surf函数
-
surfl()——绘制具有亮面的曲面图
-
shading faceted——在绘制曲面时采用分层网格线,为默认值
-
shading flat——表示平滑式颜色分布方式;去掉黑色线条,补片保持单一颜色
-
shading interp——表示插补式颜色分布方式;同样去掉线条,但补片以插值加色。这种方式需要比分块和平滑更多的计算量
-
[x,y,z] = sphere(n)——绘制三维球面
-
[x,y,z] = cylinder(R,n)——绘制三维柱面
-
peaks()——多峰函数
9.5.2 栅格数据的生成
-
meshgrid()
-
georasterref()
9.5.3 网格曲面的绘制命令
-
plot3()
-
mesh()
-
meshc()——在绘图的同时,在x-y平面上绘制函数的等值线
-
msehz()——在网格图的基础上在图形的底部外侧绘制平行z轴的边框线
9.5.4 隐藏线的显示和关闭
hidden on——去掉网格曲面的隐藏线
hidden off——显示网格曲面的隐藏线
第十章 MATLAB图像处理算法
10.1 图像处理基础
1.图像增强
目前图像增强技术根据其处理的空间不同,可分为空域法和频域法两大类,前者根据在图像所在的像素空间进行处理,后者是通过对图像进行傅里叶变换后在频域空间上间接进行的。
2.图像重建
3.图像变换
4.图像压缩
5.图像分割
6.图像边缘检测
7.图像识别
10.2 MATLAB图像处理函数
10.2.1 默认显示方式
-
imshow(X,MAP)——显示图像X,使用MAP颜色矩阵
-
H = imshow(…)——显示图像X,并将图像X的句柄返回给变量H
imshow函数特点:
自动设置图像的轴和标签属性。imshow程序代码会根据图像的特点,自动选择是否显示轴,或者是否显示标签属性。
自动设置是否显示图像的边框。程序代码会根据图像的属性,来自动选择是否显示图像的边框。
自动调用turesize代码程序,决定是否进行插值。
10.2.2 添加颜色条
-
colorbar
10.2.3 显示多帧图像
10.2.4 显示动画
-
movie
10.2.5 三维材质图像
-
warp(x,y,z,…)——在x、y、z三维界面上显示图像
10.2.6 图像的直方图
-
imhist(I)
-
imhist(I,n)
-
imhist(X,map)
在以上的调用格式中,参数I表示灰度图或二值图,n为直方图的柱数,X表示索引图,map为对应的Colormap。在调用格式imhist(I,n)中,当n未指定时,n根据I的不同类型取256(灰度图)或2(二值图)。
10.2.7 灰度变换
灰度变换主要功能是改变图像的对比度。
-
imadjust
10.2.8 均衡直方图
-
histeq