例
第1章 MATLAB简介
例1-1 在MATLAB命令窗口中查阅内存变量。
代码语言:javascript复制who
whos
例1-2 在例1-1之后,在MATLAB命令窗口中删除内存变量b。
代码语言:javascript复制clear b
who
例1-3 在MATLAB中查阅帮助信息。
代码语言:javascript复制help
--- clc 的帮助 ---
clc - 清空命令行窗口
此 MATLAB 函数 清除命令行窗口中的所有文本,让屏幕变得干净。运行 clc
后,您不能使用命令行窗口中的滚动条查看以前显示的文本。但您可以在命令行窗口中使用向上箭头键 ↑ 从命令历史记录中重新调用语句。
clc
另请参阅 clear, clf, close, home
clc 的参考页
代码语言:javascript复制help topic
未找到 topic。
请使用帮助浏览器的搜索字段搜索文档,或者
键入 "help help" 获取有关帮助命令选项的信息,例如方法的帮助。
例1-4 在MATLAB中搜索个命令的帮助信息,在M函数文件中搜索包含关键字jacobian的所有M函数文件名,如图所示。
代码语言:javascript复制help jacobian
--- jacobian 的帮助 ---
jacobian - Calculate Jacobian matrix for model at existing or new X points
This is a method of mbcmodel.model.
J = Jacobian(model, optional X)
jacobian 的参考页
名为 jacobian 的其他函数
第2章MATLAB基础
例2-1 向量点积运算。
代码语言:javascript复制A = 1: 10;
B = linspace(1, 10, 10);
AT=A';
BT=B';
e = dot(A, B)
f = dot(AT, BT)
e =
385
f =
385
例2-2 合法向量叉积运算。
代码语言:javascript复制A = 1 : 3,
B = 3 :5
e = cross(A, B)%该函数计算的是A和B叉积后各分量的元素值,且A,B只能是三维向量
A =
1 2 3
B =
3 4 5
e =
-2 4 -2
例2-3 求给定矩阵的行列式值。
代码语言:javascript复制A = [3 2 4; 1 -1 5; 2 -1 3],
D1 = det(A)
B = ones(3),D2 = det(B),
C = pascal(4), D3 = det(C)
A =
3 2 4
1 -1 5
2 -1 3
D1 =
24
B =
1 1 1
1 1 1
1 1 1
D2 =
0
C =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
D3 =
1
例2-4 已知矩阵A = [1 3;2 -1],B = [3 0;1 2],A B,2A,2A-3B,AB。
代码语言:javascript复制A = [1 3;2 -1],
B = [3 0; 1 2]
A B
2*A
2*A - 3*B
A*B
A =
1 3
2 -1
B =
3 0
1 2
ans =
4 3
3 1
ans =
2 6
4 -2
ans =
-7 6
1 -8
ans =
6 6
5 -2
例2-5 数组元素的索引与寻址。
代码语言:javascript复制A = [4 2 5 6; 3 1 7 0;12 45 78 23] %创建数组
A(2, 3) %双下标索引访问数组第2行第3列元素
A(7) %对数组第7个元素(即第1行第3列)重新赋值
A =
4 2 5 6
3 1 7 0
12 45 78 23
ans =
7
ans =
5
例2-6 单-双下标转换。
代码语言:javascript复制A = rand(3, 5)
IND = sub2ind(size(A), 2, 4)
A(IND)
[I, J] = ind2sub(size(A), 13)
A =
0.4317 0.9269 0.1131 0.2143 0.6202
0.4551 0.5976 0.3992 0.1705 0.4357
0.9794 0.5837 0.9429 0.3469 0.4158
IND =
11
ans =
0.1705
I =
1
J =
5
例2-7 逻辑索引
代码语言:javascript复制A = rand(5)
B = A > 0.8 %通过比较关系运算产生逻辑索引
A(B) = 0 %通过逻辑索引访问原数组元素,并重新赋值
A =
0.8147 0.0975 0.1576 0.1419 0.6557
0.9058 0.2785 0.9706 0.4218 0.0357
0.1270 0.5469 0.9572 0.9157 0.8491
0.9134 0.9575 0.4854 0.7922 0.9340
0.6324 0.9649 0.8003 0.9595 0.6787
B =
5×5 logical 数组
1 0 0 0 0
1 0 1 0 0
0 0 1 1 1
1 1 0 0 1
0 1 1 1 0
A =
0 0.0975 0.1576 0.1419 0.6557
0 0.2785 0 0.4218 0.0357
0.1270 0.5469 0 0 0
0 0 0.4854 0.7922 0
0.6324 0 0 0 0.6787
例2-8 通过cat函数扩展数组。
代码语言:javascript复制A = rand(3, 5)
B = eye(3)
C = magic(5)
�t(1, A, B) %列数不同,不能垂直连接
cat(2, A, B) %行数相同,可以水平连接
A =
0.1965 0.5433 0.5570 0.7846 0.3992
0.6936 0.5259 0.7306 0.0758 0.9111
0.7474 0.4067 0.2935 0.4717 0.4280
B =
1 0 0
0 1 0
0 0 1
C =
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
ans =
0.1965 0.5433 0.5570 0.7846 0.3992 1.0000 0 0
0.6936 0.5259 0.7306 0.0758 0.9111 0 1.0000 0
0.7474 0.4067 0.2935 0.4717 0.4280 0 0 1.0000
例2-9 使用块状复制函数repmat。
代码语言:javascript复制A = eye(2)
repmat(A, 2, 2)
B = ones(2,3)
blkdiag(A, B)
A =
1 0
0 1
ans =
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
B =
1 1 1
1 1 1
ans =
1 0 0 0 0
0 1 0 0 0
0 0 1 1 1
0 0 1 1 1
例2-11 使用块操作函数kron
代码语言:javascript复制A = [0 1; 1 2]
B = magic(2)
C = kron(A, B)
A =
0 1
1 2
B =
1 3
4 2
C =
0 0 1 3
0 0 4 2
1 3 2 6
4 2 8 4
例2-12 索引扩展
代码语言:javascript复制A = eye(3)
A(4, 6) = 25
A =
1 0 0
0 1 0
0 0 1
A =
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 25
例2-13 数组裁剪
代码语言:javascript复制A = magic(8)
A(1 : 3 : 5, 3 : 7)
A =
64 2 3 61 60 6 7 57
9 55 54 12 13 51 50 16
17 47 46 20 21 43 42 24
40 26 27 37 36 30 31 33
32 34 35 29 28 38 39 25
41 23 22 44 45 19 18 48
49 15 14 52 53 11 10 56
8 58 59 5 4 62 63 1
ans =
3 61 60 6 7
27 37 36 30 31
例2-14 数组元素删除
代码语言:javascript复制A = magic(7)
A(1 : 3 : 8, :) = []
A =
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20
A =
38 47 7 9 18 27 29
46 6 8 17 26 35 37
13 15 24 33 42 44 4
21 23 32 41 43 3 12
例2-15 数组转置
代码语言:javascript复制A = rand(2, 4)
A'
B=[2 - i, 3 4i, 2, 5i; 6 i, 4 - i, 2i, 7]
B'
B.'
transpose(B)
A =
0.6826 0.3488 0.0464 0.3570
0.7855 0.7805 0.3528 0.1297
ans =
0.6826 0.7855
0.3488 0.7805
0.0464 0.3528
0.3570 0.1297
B =
2.0000 - 1.0000i 3.0000 4.0000i 2.0000 0.0000i 0.0000 5.0000i
6.0000 1.0000i 4.0000 - 1.0000i 0.0000 2.0000i 7.0000 0.0000i
ans =
2.0000 1.0000i 6.0000 - 1.0000i
3.0000 - 4.0000i 4.0000 1.0000i
2.0000 0.0000i 0.0000 - 2.0000i
0.0000 - 5.0000i 7.0000 0.0000i
ans =
2.0000 - 1.0000i 6.0000 1.0000i
3.0000 4.0000i 4.0000 - 1.0000i
2.0000 0.0000i 0.0000 2.0000i
0.0000 5.0000i 7.0000 0.0000i
ans =
2.0000 - 1.0000i 6.0000 1.0000i
3.0000 4.0000i 4.0000 - 1.0000i
2.0000 0.0000i 0.0000 2.0000i
0.0000 5.0000i 7.0000 0.0000i
例2-16 数组翻转
代码语言:javascript复制A = rand(4, 6)
flipud(A)
fliplr(A)
rot90(A, 2)
rot90(A)
A =
0.9822 0.4332 0.4040 0.9370 0.0107 0.1857
0.4158 0.5763 0.9589 0.7557 0.7465 0.4728
0.4065 0.6505 0.5955 0.5389 0.1030 0.0096
0.7827 0.0330 0.9331 0.8243 0.0484 0.8582
ans =
0.7827 0.0330 0.9331 0.8243 0.0484 0.8582
0.4065 0.6505 0.5955 0.5389 0.1030 0.0096
0.4158 0.5763 0.9589 0.7557 0.7465 0.4728
0.9822 0.4332 0.4040 0.9370 0.0107 0.1857
ans =
0.1857 0.0107 0.9370 0.4040 0.4332 0.9822
0.4728 0.7465 0.7557 0.9589 0.5763 0.4158
0.0096 0.1030 0.5389 0.5955 0.6505 0.4065
0.8582 0.0484 0.8243 0.9331 0.0330 0.7827
ans =
0.8582 0.0484 0.8243 0.9331 0.0330 0.7827
0.0096 0.1030 0.5389 0.5955 0.6505 0.4065
0.4728 0.7465 0.7557 0.9589 0.5763 0.4158
0.1857 0.0107 0.9370 0.4040 0.4332 0.9822
ans =
0.1857 0.4728 0.0096 0.8582
0.0107 0.7465 0.1030 0.0484
0.9370 0.7557 0.5389 0.8243
0.4040 0.9589 0.5955 0.9331
0.4332 0.5763 0.6505 0.0330
0.9822 0.4158 0.4065 0.7827
例2-17 数组尺寸调整
代码语言:javascript复制A = rand(3, 4)
reshape(A, 2, 6)
%reshape(A, 2, 8) %a*b不等于m*n时会报错
A =
0.7179 0.3803 0.7431 0.8529
0.3610 0.3721 0.3601 0.1200
0.5727 0.4243 0.6265 0.1743
ans =
0.7179 0.5727 0.3721 0.7431 0.6265 0.1200
0.3610 0.3803 0.4243 0.3601 0.8529 0.1743
例2-18 使用数组一数组运算
代码语言:javascript复制A = magic(4)
B = eye(4)
A B
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
B =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
ans =
17 2 3 13
5 12 10 8
9 7 7 12
4 14 15 2
例2-19 使用数组除法。
代码语言:javascript复制A = [3 5 6; 2 1 4; 2 5 6]
B=randn(3)
A/B
A*inv(B)
pinv(A)*B
A =
3 5 6
2 1 4
2 5 6
B =
2.7596 0.0057 0.3940
-2.2960 -1.2947 1.0369
0.2760 -0.1472 0.1139
ans =
23.7807 11.3288 -132.6633
11.4654 5.9046 -58.2724
23.7630 11.5301 -134.4347
ans =
23.7807 11.3288 -132.6633
11.4654 5.9046 -58.2724
23.7630 11.5301 -134.4347
ans =
2.4836 0.1529 0.2800
1.7725 0.5565 -0.3318
-2.2589 -0.5393 0.2022
例2-20 使用点运算
代码语言:javascript复制A = magic(4)
B = ones(4) 4 * eye(4)
A.*B%对应的元素的乘法,因此和A.*B结果一样
B.*A
A.B%以A的各个元素为分母,B对应的各个元素作除法
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
B =
5 1 1 1
1 5 1 1
1 1 5 1
1 1 1 5
ans =
80 2 3 13
5 55 10 8
9 7 30 12
4 14 15 5
ans =
80 2 3 13
5 55 10 8
9 7 30 12
4 14 15 5
ans =
0.3125 0.5000 0.3333 0.0769
0.2000 0.4545 0.1000 0.1250
0.1111 0.1429 0.8333 0.0833
0.2500 0.0714 0.0667 5.0000
例2-21 使用数组运算函数。
代码语言:javascript复制A.B%以A的各个元素为分母,B对应的各个元素作除法
A = magic(4)
sqrt(A)
sqrtm(A)
exp(A)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
ans =
4.0000 1.4142 1.7321 3.6056
2.2361 3.3166 3.1623 2.8284
3.0000 2.6458 2.4495 3.4641
2.0000 3.7417 3.8730 1.0000
ans =
3.7584 - 0.2071i -0.2271 0.4886i 0.3887 0.7700i 1.9110 - 1.0514i
0.2745 - 0.0130i 2.3243 0.0306i 2.0076 0.0483i 1.2246 - 0.0659i
1.3918 - 0.2331i 1.5060 0.5498i 1.4884 0.8666i 1.4447 - 1.1833i
0.4063 0.4533i 2.2277 - 1.0691i 1.9463 - 1.6848i 1.2506 2.3006i
ans =
1.0e 06 *
8.8861 0.0000 0.0000 0.4424
0.0001 0.0599 0.0220 0.0030
0.0081 0.0011 0.0004 0.1628
0.0001 1.2026 3.2690 0.0000
例2-22 使用数组查找函数find。
代码语言:javascript复制A = rand(3, 5)
A < 0.5
A > 0.3
(A > 0.3) & (A < 0.5)
find((A > 0.3) & (A < 0.5))
A =
0.9354 0.3638 0.4137 0.4762 0.0777
0.9896 0.0903 0.7574 0.2666 0.8466
0.4657 0.8442 0.5540 0.1353 0.3370
ans =
3×5 logical 数组
0 1 1 1 1
0 1 0 1 0
1 0 0 1 1
ans =
3×5 logical 数组
1 1 1 1 0
1 0 1 0 1
1 1 1 0 1
ans =
3×5 logical 数组
0 1 1 1 0
0 0 0 0 0
1 0 0 0 1
ans =
3
4
7
10
15
例2-23 数组排序
代码语言:javascript复制A = rand(1, 8)
sort(A)
[B, J] = sort(A, 'descend') %降序排列并返回索引
A(J) %通过索引页可以产生降序排序的数组
A =
0.6740 0.1044 0.5874 0.1148 0.2493 0.4142 0.7155 0.8697
ans =
0.1044 0.1148 0.2493 0.4142 0.5874 0.6740 0.7155 0.8697
B =
0.8697 0.7155 0.6740 0.5874 0.4142 0.2493 0.1148 0.1044
J =
8 7 1 3 6 5 4 2
ans =
0.8697 0.7155 0.6740 0.5874 0.4142 0.2493 0.1148 0.1044
例2-24 使用squeeze命令来撤销“孤维”,使用高维数组进行降维。
代码语言:javascript复制A = rand(2, 3, 3)
B = cat(4, A(:, :, 1), A(:, :, 2), A(:, :, 3))
C = squeeze(B)
size_B = size(B)
size_C = size(C)
A(:,:,1) =
0.8147 0.1270 0.6324
0.9058 0.9134 0.0975
A(:,:,2) =
0.2785 0.9575 0.1576
0.5469 0.9649 0.9706
A(:,:,3) =
0.9572 0.8003 0.4218
0.4854 0.1419 0.9157
B(:,:,1,1) =
0.8147 0.1270 0.6324
0.9058 0.9134 0.0975
B(:,:,1,2) =
0.2785 0.9575 0.1576
0.5469 0.9649 0.9706
B(:,:,1,3) =
0.9572 0.8003 0.4218
0.4854 0.1419 0.9157
C(:,:,1) =
0.8147 0.1270 0.6324
0.9058 0.9134 0.0975
C(:,:,2) =
0.2785 0.9575 0.1576
0.5469 0.9649 0.9706
C(:,:,3) =
0.9572 0.8003 0.4218
0.4854 0.1419 0.9157
size_B =
2 3 1 3
size_C =
2 3 3
例2-25 某数据的横坐标为x=[0.2 0.3 0.5 0.6 0.8 0.9 1.2 1.3 1.5 1.8],纵坐标为y=[1 2 3 5 6 7 5 4 1],对该数据进行多项式拟合。
代码语言:javascript复制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);
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, y5, 'g--');
legend('原始数据','5阶多项式拟合','9阶多项式拟合');
xlabel('x');
ylabel('y');
p5 =
0.8877*x^5 - 10.3*x^4 42.942*x^3 - 77.932*x^2 59.833*x - 11.673
警告: 多项式未正确设置条件。请添加具有不同 X 值的点,减少多项式的阶数,或者尝试按照 HELP POLYFIT 中所述进行中心化和缩放。
例2-26 根据WLS数据拟合方法,自行编写使用WLS方法拟合数据的M函数,然后使用WLS方法进行数据拟合。
代码语言:javascript复制function [th, err, yi] = polyfits(x, y, N, xi, r)
%x, y为数据点系列,N为多项式拟合的系统,r为加权系数的逆矩阵。
M = length(x);
x = x(:);
y = y(:);
%判断函数的格式
if nargin == 4
%当调用函数的格式为(x, y, N, r)
if length(xi) == M
r = xi;
xi = x;
%当调用函数的格式为(x, y, N, xi)
else
r = 1;
end
%当调用格式为(x, y, N)
else if nargin ==3
xi = x;
r = 1;
end
end
%求解系数矩阵
A(:, N 1) = ones(M, 1);
for n = N:-1:1
A(:, n) = A(:, n 1).*x;
end
if length(r) == M
for m = 1:M
A(m, :) = A(m, :) / r(m);
y(m) = y(m) / r(m);
end
end
%计算拟合系数
th = (A y)';
ye = polyval(th, x);
err = norm(y - ye) / norm(y);
yi = polyval(th, xi);
代码语言:javascript复制x = [-3: 1: 3]';
y = [1.1650 0.751 -0.6965 0.0591 0.6268 0.3516 1.6961]';
[x, i] = sort(x);
y = y(i);
xi = min(x) [0:100] / 100 *(max(x) - min(x));
for i = 1 : 4
N = 2 * i - 1;
[th, err, yi] = polyfits(x, y, N, xi);
subplot(2, 2, i)
plot(x, y, 'o')
hold on
plot(xi, yi, '-')
grid on
end
例2-27 全局变量的使用。
代码语言:javascript复制function y = myt(x)
global a;
a = a 9;
y = cos(x);
代码语言:javascript复制global a
a = 2
myt(pi)
cos(pi)
a
a =
2
ans =
-1
ans =
-1
a =
11
例2- 28 编程计算向量元素的平均值。
代码语言:javascript复制a = input('输入变量:a = ');
[b, c] = size(a);
if ~((b == 1) | (c ==1)) | (((b ==1) & (c ==1))) %判断输入是否为向量
error('必须输入向量')
end
average = sum(a) / length(a) %计算向量a所有元素的平均值
代码语言:javascript复制输入变量:a = [1 2 3]
average =
2
参考书籍:
例13-1 含突变点信号freqbrk的连续小波变换mesh图。MATLAB程序设计如下:
代码语言:javascript复制load freqbrk
s = freqbrk;
coefs = cwt(s, [1;30],'morl');
colormap([0 0 0])
mesh(abs(coefs));
例13-2 突变点信号freqbrk的离散小波变换。MATLAB程序设置如下:
代码语言:javascript复制load freqbrk
s = freqbrk;
ls = length(s);
[C, L] = wavedec(s, 4, 'db5');
A4 = wrcoef('a', C, L,'db5', 4);
D4 = wrcoef('d', C, L,'db5', 1);
subplot(3, 1, 1);plot(abs(s), 'k');
subplot(3, 1, 2);plot(abs(A4),'k');
subplot(3, 1, 3);plot(abs(D4),'k');
例13-3 利用一维连续小波分析工具分析正弦曲线噪声信号。具体操作步骤如下:
[1]打开一维连续小波分析工具,在命令行窗口中输入waveletAnalyzer,弹出小波分析工具主界面。
[2]单击One-Dimensional下面的Continuous Wavelet1-D工具按钮,弹出的一维连续小波主界面。
[3]下载信号源。选择File-Load Signal命令,在弹出的对话框中选择noissin.mat文件,它的路径为toolbox/wavelet/wavelet,单击OK按钮,这样信号就被下载到了此工具中。
[4]执行小波变换,在图中的界面选择db4小波,并且尺度设置为1~48。
[5]单击Analyze按钮。经过短暂计算后,工具显示对应尺度a=24的系数图和最大尺度图。
[6]观测小波系数行。用鼠标右键单击系数图,如图所示,然后单击右侧面板中高亮显示的New Coefficients Line按钮,观察Coefficients Line图的变化。
[7]观测最大系数行,如图所示。用鼠标右键单击系数图,然后单击右侧面板中高亮显示的Refresh Maxima Lines按钮。
在系数图中,用鼠标光标移动的位置信息显示在工具屏幕下的Info文本框中,如图所示。
[8]将尺度转换到伪频率。在工具屏幕的右下方,选中Frequencies单击按钮,再次用鼠标右键单击系数图,如图所示。
[9在Selecterd Axes下取消勾选后两个复选框,如图所示。
[10]放大细节。通过画矩形框得到的图形如图所示。
[11]单击X 按钮,如图所示,显示水平放大后的信号,如图所示。
[12]观察标准系数图与绝对系数图。在Coloration Mode下拉列表框中分别选中absolute modes和normal modes选项,效果如图所示。
代码语言:javascript复制load noissin;
whos
c = cwt(noissin, 1: 48, 'db4');
c1 = cwt(noissin, 1:48, 'db4', 'plot');
c2 = cwt(noissin, 2: 2: 128, 'db4', 'plot');
Name Size Bytes Class Attributes
noissin 1x1000 8000 double
例13-4 利用一维离散小波分析工具分析真实世界的噪声信号。具体操作如下。
[1]打开一维小波分析工具。首先在命令行窗口输入waveletAnalyzer弹出小波分析工具箱主界面,然后选择Wavelet 1-D选项,进入Wavelet 1-D界面,如图所示。
[2]下载信号源。选择File-Load-Signal命令,在弹出的对话框选择leleccum.mat文件,它的路径toolbox/wavelet/wavelet,单击OK按钮。这样,信号就被下载到了此工具中。
[3]执行一级小波系数分解。在如图所示的界面中选择db1小波进行一级分解,如图所示。同时单击Analyze按钮,经过短暂计算后,工具显示分解图。
[4]放大相关细节。画矩形框,如图所示。单击X 按钮,显示水平放大后的信号,如图所示。
[6]执行多级小波系数分解。在界面的右上方,将Level设置为3,并单击Analyze按钮,如图所示。在界面的右下方提供了5种分解模式选项,如图所示,读者可以分别选中看不同的分解系数模式。
[6]去噪。单击De-noise按钮,如图所示,弹出一维小波降噪窗口,如图所示。
[7]提纯分析。将Level设置为5,Wavelet设置为db3,单击Analyze按钮,如图所示。
[8]压缩信号。单击Compress按钮,弹出压缩窗口,如图所示。
[9]显示统计值。在Wavelet 1-D工具种单击Statistics按钮,弹出初始值号的统计值,如图所示。单击Histograms按钮,显示如图所示的直方图。
代码语言:javascript复制load leleccum;
s = leleccum(1: 3920);
l_s = length(s);
[cA1, cD1] = dwt(s, 'db1');
A1 = upcoef('a', cA1, 'db1', 1, l_s);
D1 = upcoef('d', cD1, 'db1', 1, l_s);
subplot(1, 2, 1); plot(A1);
title('Approximation A1');
subplot(1, 2, 2); plot(D1);
title('Detail D1');
A0 = idwt(cA1, cD1,'db1', l_s);
err = max(abs(s - A0));
[C, L] = wavedec(s, 3, 'db1');
cA3 = appcoef(C, L, 'db1', 3);
A3 = wrcoef('a', C, L, 'db1', 1);
D1 = wrcoef('d', C, L, 'db1', 1);
D2 = wrcoef('d', C, L, 'db1', 2);
D3 = wrcoef('d', C, L, 'db1', 3);
subplot(2, 2, 1); plot(A3);
title('Detail D1');
subplot(2, 2, 2); plot(D1);
title('Detail D2');
subplot(2, 2, 3); plot(D2);
title('Detail D3');
subplot(2, 2, 4); plot(D3);
A0 = waverec(C, L, 'db1');
err = max(abs(s - A0));
subplot(2, 1, 1); plot(s); title('Original'); axis off
subplot(2, 1, 2); plot(A3); title('Level 3 Approximation');
subplot(3, 1, 1); plot(D1);
title('Detail Level 1');
subplot(3, 1, 2); plot(D2);
title('Detail Level 2');
subplot(3, 1, 3); plot(D3);
title('Detail Level 3');
例13-5 图像局部压缩。
在本例种,把图像中部的细节系数都置零,从压缩图像中可以很明显地看出只有中间部分变得模糊(比如在原图中很清晰的围巾的条纹不能分辨),而其他部分的细节仍然可以分辨得很清楚。另外,小波域的系数表示的是原图个频率段的细节信息,并且提供了一种位移相关的信息表述方式,可以通过对局部细节系数进行处理来达到局部压缩的效果。
代码语言:javascript复制load tire;
%使用sym4小波对信号进行一层小波分解
[cal, chl, cvl, cdl] = dwt2(X, 'sym4');
codcal=wcodemat(cal, 192);
codchl=wcodemat(chl, 192);
codcvl=wcodemat(cvl, 192);
codcdl=wcodemat(cdl, 192);
%将4个系数图像组合为一个图像
codx = [codcal, codchl, codcvl, codcdl];
rcal = cal;
rchl = chl;
rcvl = cvl;
rcdl = cdl;
%将3个细节系数的中部置零
rchl(33: 97, 33: 97) = zeros(65, 65);
rcvl(33: 97, 33: 97) = zeros(65, 65);
rcdl(33: 97, 33: 97) = zeros(65, 65);
codrcal = wcodemat(rcal, 192);
codrchl = wcodemat(rchl, 192);
codrcvl = wcodemat(rcvl, 192);
codrcdl = wcodemat(rcdl, 192);
%将处理后的系数图像组合为一个图像
codrx = [codrcal, codrchl, codrcvl, codrcdl];
%重建处理后的系数
rx = idwt2(rcal, rchl, rcvl, rcdl, 'sym4');
subplot(221);
image(wcodemat(X, 192)), colormap(map); title('原始图像');
subplot(222);
image(codx), colormap(map); title('一层分解后各层系数图像');
subplot(223);
image(wcodemat(rx, 192)), colormap(map); title('压缩图像');
subplot(224); image(codrx), colormap(map); title('处理后各层系数图像');
%求压缩信号的能量成分
per = norm(rx) / norm (X);
per = 1.0000;
%求压缩信号与原信号的标准差
err = norm(rx - X);
例13-6 利用二维小波分析进行图像压缩。MATLAB代码设置如下:
代码语言:javascript复制%装载信号
load nelec;
indx = 1:1024;
x = nelec(indx);
%用小波hear对信号进行三层分解
[c, l] = wavedec(x, 3, 'haar');
alpha = 1.5;
%获取信号压缩的阈值
[thr, nkeep] = wdcbm(c, l, alpha);
%对信号进行压缩
[xd, cxd, lxd, perf0, perf12] = wdencmp('lvd', c, l, 'haar', 3, thr, 's');
subplot(2, 1, 1);
plot(indx, x);
title('原始信号');
subplot(2, 1, 2);
plot(indx, xd);
title('压缩后的信号')
%装入图像
load tire
%下面进行噪声的产生
init = 371825452;
rand('seed', init);
Xnoise = X 18 * (rand(size(X)));
%显示原始图像及它的含噪声图像
colormap(map);
subplot(2, 2, 1);
image(wcodemat(X, 192));
title('原始图像')
axis square
subplot(2, 2, 2);
image(wcodemat(Xnoise, 192));
title('含噪声的图像')
axis square
%用sym5小波对图像信号进行二层小波分解
[c, s] = wavedec2(X, 2, 'sym5');
%下面进行图像的去噪处理
%使用ddencmp函数来计算去噪的默认阈值和熵标准
%使用wdencmp函数来实现图像的压缩
[thr, sorh, keepapp] = ddencmp('den', 'wv', Xnoise);
[Xdenoise, cxc, lxc, perf0, perf12] = wdencmp('gbl', c, s, 'sym5', 2, thr, sorh, keepapp);
%显示去噪后的图像
subplot(223), image(Xdenoise);
title('去噪后的图像')
axis square
%装入图像
load wbarb;
%显示图像
subplot(221);
image(X);
colormap(map)
title('原始图像');
axis square
disp('压缩前图像X的大小:');
whos('X')
%对图像用bior3.7小波进行2层小波分解
[c, s] = wavedec2(X, 2, 'bior3.7');
%提取小波分解结构中第一层低频系数和高频系数
ca1 = appcoef2(c, s, 'bior3.7', 1);
ch1 = detcoef2('h', c, s, 1);
cv1 = detcoef2('v', c, s, 1);
cd1 = detcoef2('d', c, s, 1);
%分别对各频率成分进行重构
a1 = wrcoef2('a', c, s, 'bior3.7', 1);
h1 = wrcoef2('h', c, s, 'bior3.7', 1);
v1 = wrcoef2('v', c, s, 'bior3.7', 1);
d1 = wrcoef2('d', c, s, 'bior3.7', 1);
c1 = [a1, h1; v1, d1];
%显示分解后各频率成分的信息
subplot(222);
image(c1);
axis square
title('分解后低频和高频信息')
%下面进行图像压缩处理
%保留小波分解第一层低频信息;进行图像的压缩
%第一层的低频信息即为ca1,显示第一层的低频信息
%首先对第一层信息进行量化编码
ca1 = appcoef2(c, s, 'bior3.7', 1);
ca1 = wcodemat(ca1, 400, 'mat', 0);
%改变图像的高度
ca1 = 0.5 * ca1;
subplot(223);
image(ca1);
colormap(map);
title('第一次压缩');
disp('第一次压缩图像大小为:');
whos('ca1');
%保留小波分解第二层低频信息,进行图像的压缩,此时压缩比更大
%第二层的低频信息即为ca2,显示第二层的低频信息
ca2 = appcoef2(c, s, 'bior3.7', 2);
%首先对第二层信息进行量化编码
ca2 = wcodemat(ca2, 440, 'mat', 0);
%改变图像高度
ca2 = 0.25 * ca2;
subplot(224);
image(ca2);
colormap(map);
axis square
title('第二层压缩');
disp('第二层压缩的大小为:');
whos('ca2')
压缩前图像X的大小:
Name Size Bytes Class Attributes
X 256x256 524288 double
第一次压缩图像大小为:
Name Size Bytes Class Attributes
ca1 135x135 145800 double
第二层压缩的大小为:
Name Size Bytes Class Attributes
ca2 75x75 45000 double
例13-7 利用二维小波变换对图像进行压缩。MATLAB代码设置如下:
代码语言:javascript复制%装入一个二维信号
load wbarb;
%显示图像
subplot(121); image(X); colormap(map);
title('原始图像'); disp("压缩前图像的大小"); whos("X");
axis square;
%对图像进行压缩
%对图像用db3小波进行二层小波分解
[c, s] = wavedec2(X, 5, "db3");
%使用wavedec2函数来实现图像的压缩
[thr, sorh, keepapp] = ddencmp("cmp", "wv", X);
%在输入参数中选择了全局阈值选项"gb1",用来对所有高频系数进行相同阈值量化比较
[Xcomp, cxc, lxc, perf0, perfl2] = wdencmp("gbl", c, s, "db3", 5, thr, sorh, keepapp);
%将压缩后的图像于原始图像相比较
subplot(122); image(Xcomp); colormap(map);
title('压缩图像');
axis square
disp("小波分解系数中值为0的系数个数百分比");
perf0
disp("压缩后剩余能量百分比");
perfl2
压缩前图像的大小
Name Size Bytes Class Attributes
X 256x256 524288 double
小波分解系数中值为0的系数个数百分比
perf0 =
49.9148
压缩后剩余能量百分比
perfl2 =
99.9877
例13-8 图像压缩中阈值的确定。MATLAB代码设置如下:
代码语言:javascript复制load tire;
%求得颜色映射表的长度,以便后面的转换
nbc = size(map, 1);
%用默认方式求出图像的全局阈值
[thr, sorh, keepapp] = ddencmp('cmp', 'wv', X);
%对图像作用全局阈值
[xd, cxd, lxd, perf0, perfl2] = wdencmp('gbl', X, 'bior3.5', 3, thr, sorh, keepapp);
%用bior3.5小波对图像进行三层分解
[c, s] = wavedec2(X, 3, 'bior3.5');
%指定Birge-Massart策略中的经验系数
alpha = 1.5;
m = 2.7 * prod(s(1, :));
%根据各层小波系数确定分层阈值
[thr1, nkeep1] = wdcbm2(c, s, alpha, m);
%对原始图像作用分层阈值
[xd1, cxd1, sxd1, perf01, perf121] = wdencmp('lvd', c, s, 'bior3.5', 3, thr1, 's');
%将颜色映射表转换为灰度映射表
colormap(pink(nbc));
subplot(131);
image(wcodemat(X, nbc));
title('原始图像');
subplot(132);
image(wcodemat(xd, nbc));
title('全局阈值化压缩图像');
xlabel(['能量成分', num2str(perfl2), '%', '零系数成分', num2str(perf0), '%']);
subplot(133);
image(wcodemat(xd1, nbc));
title('分层阈值化压缩图像');
xlabel(['能量成分', num2str(perf121), '%', '零系数成分', num2str(perf01), '%']);
例13-9 基于小波包分析的图像压缩。MATLAB代码设置如下:
代码语言:javascript复制%读入信号
load detfingr
%求颜色索引表长度
nbc = size(map, 1);
%得到信号的阈值,保留层数,小波树优化标准
[thr, sorh, keepapp, crit] = ddencmp('cmp', 'wp', X);
%通过以上得到的参数对信号进行压缩
[xd, treed, perf0, perf12] = wpdencmp(X, sorh, 4,'sym4',crit, thr*2, keepapp);
%更改索引表为pink索引表
colormap(pink(nbc));
subplot(121); image(wcodemat(X, nbc)); title('原始图像');
subplot(122); image(wcodemat(xd, nbc)); title('全局阈值化压缩图像');
xlabel(['能量成分', num2str(perf12), '%', '零系数成分', num2str(perf0), '%']);
plot(treed);
例13-10 去噪实例一。MATLAB代码设置如下:
代码语言:javascript复制%装入图像
load detfingr
%下面进行噪声的产生
init = 3718025452;
rand('seed', init);
Xnoise = X 18 * (rand(size(X)));
%显示原始图像及它含噪声的图像
colormap(map);
subplot(1, 3, 1); image(wcodemat(X, 192));
title('原始图像X');
axis square
subplot(1, 3, 2);
image(wcodemat(X, 192));
title('含噪声的图像Xnoise');
axis square
%用sym5小波对图像信号进行二层小波分解
[c, s] = wavedec2(X, 2, 'sym5');
%下面进行图像的去噪处理
%使用ddencmp函数计算去噪的默认阈值和熵标准
%使用wdencmp函数实现图像的压缩
[thr, sorh, keepapp] = ddencmp('den', 'wv', Xnoise);
[Xdenoise, cxc, lxc, perf0, perf12] = wdencmp('gbl', c, s, 'sym5', 2, thr, sorh, keepapp);
%显示去噪后的图像
subplot(133); image(Xdenoise);
title('去噪后的图像');
axis square
例13-11 去噪实例二。MATLAB代码设置如下:
代码语言:javascript复制load julia
%画出原始图像
subplot(221); image(X); colormap(map);
title('原始图像');
axis square
%产生含噪图像
init = 2055615866; randn('seed', init)
x = X 38 * randn(size(X));
%画出含噪图像
subplot(222); image(x); colormap(map);
title('含噪声图像');
axis square
%下面进行图像的去噪处理
%用小波函数sym4对x进行二层小波分解
[c, s] = wavedec2(x, 2, 'sym4');
%提取小波分解中第一层的低频图像,即实现了低通滤波去噪
a1 = wrcoef2('a', c, s, 'sym4');
%画出去噪后的图像
subplot(223); image(a1);
title('第一次去噪图像');
axis square;
%提取小波分解中第二层的低频图像,即实现了低通滤波去噪
%相等于第一层的低频图像再进行一次低频滤波处理
a2 = wrcoef2('a', c, s, 'sym4', 2);
%画出去噪后的图像
subplot(224); image(a2);title('第二次去噪图像');
axis square;
例13-12 去噪实例三。MATLAB代码设置如下:
代码语言:javascript复制load wmandril
%画出原始图像
subplot(131); image(X); colormap(map);
title('原始图像');
axis square
%产生含噪声图像
init = 2055615866; randn('seed', init)
x = X 10 * randn(size(X));
%画出含噪声图像
subplot(132); image(X); colormap(map);
title('含噪声图像');
axis square
%下面进行图像的去噪处理
%小波函数coif对x进行二层小波分解
[c, s] = wavedec2(x, 2, 'coif3');
%提取小波分解中第一层的低频图像,即实现了低通滤波去噪
%设置尺度向量n
n = [1, 2]
%设置阈值向量p
p = [10, 12, 23, 28];
%对3个方向高频系数进行阈值处理
nc = wthcoef2('h', c, s, n, p, 's');
nc = wthcoef2('v', c, s, n, p, 's');
nc = wthcoef2('d', c, s, n, p, 's');
%对新的小波分解结构[nc, s]进行重构
xx = waverec2(nc, s, 'coif3');
%画出重构后图像的波形
subplot(133); image(X); colormap(map);
title('去噪后的图像');
axis square
例13-13 图像增强实例。MATLAB代码设置如下:
代码语言:javascript复制load facets
%画出原始图像
subplot(121); image(X); colormap(map);
title('原始图像');
axis square
%下面进行图像的增强处理
%用小波函数sym4对X进行二层小波分解
[c, s] = wavedec2(X, 2, 'sym4');
sizec = size(c);
%对分解系数进行处理以突出轮廓部分,弱化细节部分
for i= 1:size(2)
if (c(i) > 350)
c(i) = 2 * c(i);
else
c(i) = 0.5 * c(i);
end
end
%下面对处理后的系数进行重构
xx = waverec2(c, s, 'sym4');
%画出重构后的图像
subplot(122); image(xx);
colormap(map);
title('增强图像');
axis square
例13-14 采用DCT和小波方法来使图像钝化。MATLAB代码设置如下:
代码语言:javascript复制%读入chess信号
load chess
%分别保存用DCT方法和小波方法的变换系数
blur1 = X;
blur2 = X;
%对原图像做二维离散余弦变换
ff1 = dct2(X);
%对变换结果在频域做BUTTERWORTH滤波
for i = 1 : 256
for j = 1 : 256
ff1(i , j) = ff1(i, j) / (1 ((i * j j * j) / 8192)^2);
end
end
%重建变换后的图像
blur1 = idct2(ff1);
%对图像做二层的二维小波分解
[c, l] = wavedec2(X, 2, 'db3');
csize = size(c);
%对低频系数进行放大处理,并抑制高频系数
for i = 1: csize(2);
if (c(i) > 300)
c(i) = c(i) * 2;
else
c(i) = c(i) / 2;
end
end
%通过处理后的小波系数重建图像
blur2 = waverec2(c, l, 'db3');
%显示3个图像
subplot(221); image(wcodemat(X, 192));colormap(gray(256));
title('原始图像','fontsize', 18);
subplot(223); image(wcodemat(blur1, 192));colormap(gray(256));
title('采用DCT方法图像','fontsize', 18);
subplot(224); image(wcodemat(blur2, 192));colormap(gray(256));
title('采用小波方法钝化图像','fontsize', 18);
例13-15 图像锐化。MATLAB代码设置如下:
代码语言:javascript复制%读入chess信号
load chess
%分别保存用DCT方法和小波方法的变换系数
blur1 = X;
blur2 = X;
%对原图像做二维离散余弦变换
ff1 = dct2(X);
%对变换结果在频域做BUTTERWORTH滤波
for i = 1 : 256
for j = 1 : 256
ff1(i , j) = ff1(i, j) / (1 32768 / ((i * j j * j))^2);
end
end
%重建变换后的图像
blur1 = idct2(ff1);
%对图像做二层的二维小波分解
[c, l] = wavedec2(X, 2, 'db3');
csize = size(c);
%对低频系数进行放大处理,并抑制高频系数
for i = 1: csize(2);
if (abs (c(i)) < 300)
c(i) = c(i) * 2;
else
c(i) = c(i) / 2;
end
end
%通过处理后的小波系数重建图像
blur2 = waverec2(c, l, 'db3');
%显示3个图像
subplot(221); image(wcodemat(X, 192));colormap(gray(256));
title('原始图像','fontsize', 18);
subplot(223); image(wcodemat(blur1, 192));colormap(gray(256));
title('采用DCT方法图像','fontsize', 18);
subplot(224); image(wcodemat(blur2, 192));colormap(gray(256));
title('采用小波方法钝化图像','fontsize', 18);
例13-16 下面用二维小波分析将woman.mat和facets.mat两个图像融合在一起。MATLAB代码设置如下:
代码语言:javascript复制load woman;
X1 = X; map1 = map;
subplot(221); image(X1); colormap(map1);
title('woman');
axis square
load facets;
X2 = X; map2 = map;
for i = 1: 256
for j = 1: 256
if (X2(i, j) > 100)
X2(i, j) = 1.2 * X2(i, j);
else
X2(i, j) = 0.5 * X2(i, j);
end
end
end
subplot(222); image(X2); colormap(map2);
title('facets');
axis square
%用小波函数sym4对X1进行二层小波分解
[c1, s1] = wavedec2(X1, 2, 'sym4');
%对分解系数进行处理以突出轮廓部分,弱化细节部分
sizec1 = size(c1);
for i = 1 : sizec1(2)
c1(i) = 1.2 * c1(i);
end
%用小波函数sym4对X2进行二层小波分解
[c2, s2] = wavedec2(X2, 2, 'sym4');
%下面进行小波变换域的图像融合
c = c1 c2;
%减少图像亮度
c = 0.5 * c;
%对融合的系数进行重构
xx = waverec2(c, s1, 'sym4');
%画出融合后的图像
subplot(223); image(xx);
title('融合图像');
axis square
例13-17 图像分解实例一。MATLAB代码设置如下:
代码语言:javascript复制load woman
%使用db1小波对图像进行三层静态小波分解
[swa, swh, swv, swd] = swt2(X, 3, 'db1');
whos;
colormap(map);
kp = 0;
for i = 1 : 3
subplot(3, 4, kp 1), image(wcodemat(swa(:, :, i), 192));
%显示第i层近似系数图像
title(['Approx, cfs, level', num2str(i)])
subplot(3, 4, kp 2),image(wcodemat(swh(:, :, i), 192));
title(['Horiz.Det.cfs level', num2str(i)])
subplot(3, 4, kp 3),image(wcodemat(swh(:, :, i), 192));
title(['Vert.Det.cfs level', num2str(i)])
subplot(3, 4, kp 4),image(wcodemat(swh(:, :, i), 192));
title(['Diag.Det.cfs level', num2str(i)])
kp = kp 4;
end
Name Size Bytes Class Attributes
X 256x256 524288 double
map 255x3 6120 double
swa 256x256x3 1572864 double
swd 256x256x3 1572864 double
swh 256x256x3 1572864 double
swv 256x256x3 1572864 double
例13-18 图像分解实例二。MATLAB代码设置如下。
代码语言:javascript复制load woman
%使用dbl小波对noiswom图像进行三层小波分解
[swa, swh, swv, swd] = swt2(X, 3, 'db1');
mzero = zeros(size(swd));
A = mzero;
A(:, :, 3) = iswt2(swa, mzero, mzero, mzero, 'db1');
%使用iswt2的滤波器功能重建第三层近似系数,为了避免iswt的合成运算,注意在重建过程中,应保证其他各项系数为0.
H = mzero;
V = mzero;
D = mzero;
for i = 1; 3
swcfs = mzero;
swcfs(:, :, i) = swh(:, :, i);
H(:, :, i) = iswt2(mzero, swcfs, mzero, mzero, 'db1');
swcfs = mzero;
swcfs(:, :, i) = swv(:, :, i);
V(:, :, i) = iswt2(mzero, mzero, swcfs, mzero, 'db1');
swcfs = mzero;
swcfs(:, :, i) = swh(:, :, i);
H(:, :, i) = iswt2(mzero, mzero, mzero, swcfs, 'db1');
end
%分别重建1至3级的各个细节系数,同样在重建某一吸收的时候,要令其他系数为0
A(:, :, 2) = A(:, :, 3) H(:, :, 3) V(:, :, 3) D(:, :, 3);
A(:, :, 1) = A(:, :, 2) H(:, :, 2) V(:, :, 2) D(:, :, 2);
%使用递推的方法建立第一层和第二层的近似系数
colormap(map)
kp = 0;
for i = 1:3
subplot(3, 4, kp 1), image(wcodemat(A(:, :, i), 192));
title(['第', num2str(i), '层近似系数图像'])
subplot(3, 4, kp 2), image(wcodemat(H(:, :, i), 192));
title(['第', num2str(i), '层水平细节系数图像'])
subplot(3, 4, kp 3), image(wcodemat(V(:, :, i), 192));
title(['第', num2str(i), '层竖直细节系数图像'])
subplot(3, 4, kp 4), image(wcodemat(D(:, :, i), 192));
title(['第', num2str(i), '层对角细节系数图像'])
kp = kp 4;
end
%画出通过手动方法重建的各级小波系数图像
err = norm(A(:, :, 2) - swa(:, :, 2))
%求出这种算法重建的第2层近似系数和分解系数之间的误差
ans =
3
err =
9.4444e 04
例16-1 下面的程序代码在一个图形窗口中创建多个坐标轴(Axes)对象,并在创建过程中指定对象创建的位置。
代码语言:javascript复制axes('position', [.1 .1 .8 .6])
mesh(peaks(20));
axes('position', [.1 .7 .8 .2])
pcolor([1 : 10; 1 : 10]);
例16-2 使用rectangle函数创建不同的二维举行区域或椭圆区域示例。程序代码如下:
代码语言:javascript复制rectangle('Position', [0.59, 0.35, 3.75, 1.37], 'Curvature',[0.8, 0.4],...
'LineWidth', 2, 'LineStyle', '--')
daspect([1, 1, 1])
figure
rectangle('Position', [1, 2, 10, 5], 'Curvature', [1,1],...
'faceColor', 'r')
daspect([1, 1, 1])
xlim([0, 11])
ylim([1, 7])
例16-3 使用surface函数将图形映射到面上。程序代码如下:
代码语言:javascript复制load clown
surface(peaks, flipud(X),...
'FaceColor', 'texturemap',...
'EdgeColor', 'none',...
'CDataMapping', 'direct')
colormap(map)
view(-35, 45)
例16-4 使用findobj函数访问对象,并改变对象的属性。程序代码如下:
代码语言:javascript复制x = 0: 15;
y = [1.5 * cos(x); 4 * exp(-.1 * x).* cos(x); exp(.05 * x) .* cos(x)]';
h = stem(x, y);
axis([0 16 -4 4])
set(h(1), 'Color', 'black',...
'Marker', 'o',...
'Tag', 'Decaying Exponential')
set(h(2), 'Color', 'black',...
'Marker', 'square',...
'Tag', 'Growing Exponential')
set(h(3), 'Color', 'black',...
'Marker', '*',...
'Tag', 'Steady State')
set(findobj(gca, '-depth', 1, 'Type', 'line'), 'LineStyle', '--')
h = findobj('-regexp', 'Tag', '(?!Steady State$).');
set(h, {'MarkerSize'}, num2cell(cell2mat(get(h, 'MarkerSize')) 2))
h = findobj('type', 'line', 'Marker', 'none',...
'-and', '-not', 'LineStyle', '--');
set(h, 'Color', 'red')
参考书籍:《Matlab2020a》
例如,在命令行窗口输入:
代码语言:javascript复制A = [1, 2, 3, 4];
A(0, 1)
位置 1 处的索引无效。数组索引必须为正整数或逻辑值。
代码语言:javascript复制 A = [1, 2, 3, 4];
A(1, 1)
ans =
1
例如,在命令窗口输入:
代码语言:javascript复制A = [1, 2; 3, 3; 4, 5];
B = [1, 2, 3; 4, 5, 6; 7, 8, 9];
A * B
错误使用 *
用于矩阵乘法的维度不正确。请检查并确保第一个矩阵中的列数与第二个矩阵中的行数匹配。要执行按元素相乘,请使用 '.*'。
代码语言:javascript复制 A = [1, 2; 3, 3; 4, 5];
B = [1, 2, 3; 4, 5, 6; 7, 8, 9];
A' * B
ans =
41 49 57
49 59 69
例如,在命令窗口输入:
代码语言:javascript复制A = [1, 2, 3];
B = 6 * A%对A的每个元素都乘以6
C = 6 / A%用6除以A的每个元素
B =
6 12 18
错误使用 /
矩阵维度必须一致。
代码语言:javascript复制A = [1, 2, 3];
B = 6 * A%对A的每个元素都乘以6
C = 6 ./ A%用6除以A的每个元素
B =
6 12 18
C =
6 3 2
例如,在命令窗口中输入
代码语言:javascript复制 m_fun
未定义函数或变量 'm_fun'。
例如,在命令窗口输入:
代码语言:javascript复制function c = myfun(a, b)
function c = myfun(a, b)
↑
错误: 此上下文中不支持函数定义。请在代码文件中创建函数。
例16-5 下面的命令在一个绘图窗口中创建一个text对象,并将该对象复制到新的绘图窗口中。
代码语言:javascript复制x = 0 : 0.01 : 6.28;
y = sin(x);
figure; plot(x, y)
text_handle = text('String', '{5pidiv4, sin(5pidiv4)}rightarrow',...
'Position', [5 * pi / 4, sin(5 * pi /4), 0], 'HorizontalAlignmen', 'right')
x1 = 0.5 : 0.01 : 6.78;
y1 = sin(x1);
figure; plot(x1, y1)
copyobj(text_handle, gca)
text_handle =
Text ({5pidiv4, sin(5pidiv4)}rightarrow) - 属性:
String: '{5pidiv4, sin(5pidiv4)}rightarrow'
FontSize: 10
FontWeight: 'normal'
FontName: 'Helvetica'
Color: [0 0 0]
HorizontalAlignment: 'right'
Position: [3.9270 -0.7071 0]
Units: 'data'
显示 所有属性
例16-6 下面的命令首先创建3条函数曲线,然后使用delete函数删除其中的两天曲线。
代码语言:javascript复制x = 0 : 0.05 :50;
y = [1.5 * cos(x); 4 * exp(-.1*x).*cos(x);exp(.05*x).*cos(x)]';
h = plot(x, y);
delete(h(1 : 2: 3))
例16-7 下面给出一个绘图函数my_plot说明newplot的使用方法,该函数在绘制多个图形时将循环使用不同的线型。程序代码如下:
代码语言:javascript复制function my_plot(x, y)
cax = newplot; %返回当前坐标轴对象的句柄
LSO = ['- ';'--';': '; '-.'];
set(cax, 'FontName', 'Times', 'FontAngle', 'italic')
set(get(cax, 'Parent'), 'MenuBar', 'none')
line_handles = line(x, y, 'Color', 'b');
style = 1;
for i = 1 : length(line_handles)
if style > length(LSO), style = 1, end
set(line_handles(i),'LineStyle', LSO(style, :))
style = style 1;
end
grid on
代码语言:javascript复制my_plot(1 : 10, peaks(10))
代码语言:javascript复制function my_plot3(x, y, z)
cax = newplot;
hold_state = ishold; %检查当前hold属性的状态
LSO = ['- ';'--';': '; '-.'];
if nargin == 2
hlines = line(x, y, 'Color', 'k');
if ~hold_state%如果hols属性为off,则改变视图
view(2)
end
else if nargin ==3
hlines = line(x, y, z, 'Color', 'k')
if ~hold_state%如果hols属性为off,则改变视图
view(3)
end
end
end
ls = 1;
for hindex = 1 : length(hlines)
if ls > length(LSO), ls = 1; end
set(hlines(hindex), 'LineStyle', LSO(ls, :))
ls = ls 1;
end
代码语言:javascript复制my_plot3(1 : 10, peaks(10))
代码语言:javascript复制my_plot3(1 : 10, 1 : 10, peaks(10))
通常的调试步骤如下。
【步骤1】:先运行(Run)一遍M文件,针对具体的出错信息,在适当的地方设置断点或条件断点。
【步骤2】:再次运行(Run)到断点位置,此时MATLAB把运行控制权交给键盘。
X = [1, 2, 3]
mean(X)%均值
X = [1, 2, 3
4, 5, 6]
mean(X, 1) %列向量的均值
mean(X, 2) %行向量的均值
mean(mean(X)) %整个矩阵的均值
mean2(X) %整个矩阵的均值
X = [1, 2, 9]
median(X) %数据的中值
X=[1, 2, 3, 4]
var(X) %方差
sum((X(1, :)-mean(X)).^2)/(length(X)-1) %方差
X=[1 2
3 4]
std(X, 0, 1)%列向量方差
std(X, 0, 2) %行向量方差
std2(X) %整个矩阵的方差
A = [61.45, 55.9, 61.95, 59, 58.14, 53.61, 55.48, 54.21, 61.52, 54.92];
B = [40.36, 39.8, 49.2, 48, 51.5, 49.39, 51.13, 58.06, 61, 62.35];
C = [8.61, 8.91, 10.43, 13.32, 13.48, 15.75, 18.14, 19.95, 21.95, 23.53];
D = [14.31, 14.72, 15.28, 15.91, 14.67, 15, 15.86, 15.16, 13.72, 12.94];
E = [7.67, 7.75, 8.15, 9.24, 10.68, 10.58, 10.31, 10, 8.91, 8.51];
q = [A', B',C', D', E']
w=cov(q) %协方差
参考链接:https://www.cnblogs.com/lwngreat/p/4268881.html
偏微分方程工具箱
求解椭圆方程
1.输入【pdetool】,进入偏微分方程工具箱
2.点击【
】,绘制如图图形
3.点击【Boundary】-【Specify boundary conditions...】
4.点击【OK】
5.点击【PDE】-【PDE Specification...】
6.点击【OK】
7.点击【
】-【
】-【
】
8.点击【Plot】-【Parameters】
9.点击【u】-【Use entry】-输入【u-(1-x.^2-y.^2)/4】-【Plot】
16.点击【File】-【Save as】”
test.m
代码语言:javascript复制% This script is written and read by pdetool and should NOT be edited.
% There are two recommended alternatives:
% 1) Export the required variables from pdetool and create a MATLAB script
% to perform operations on these.
% 2) Define the problem completely using a MATLAB script. See
% http://www.mathworks.com/help/pde/examples/index.html for examples
% of this approach.
function pdemodel
[pde_fig,ax]=pdeinit;
pdetool('appl_cb',1);
set(ax,'DataAspectRatio',[1 1 1]);
set(ax,'PlotBoxAspectRatio',[1.5 1 1]);
set(ax,'XLim',[-1.5 1.5]);
set(ax,'YLim',[-1 1]);
set(ax,'XTickMode','auto');
set(ax,'YTickMode','auto');
% Geometry description:
pdepoly([ -1,...
1,...
1,...
0,...
0,...
-1,...
],...
[ -1,...
-1,...
1,...
1,...
0,...
0,...
],...
'P1');
set(findobj(get(pde_fig,'Children'),'Tag','PDEEval'),'String','P1')
% Boundary conditions:
pdetool('changemode',0)
pdesetbd(6,...
'dir',...
1,...
'1',...
'0')
pdesetbd(5,...
'dir',...
1,...
'1',...
'0')
pdesetbd(4,...
'dir',...
1,...
'1',...
'0')
pdesetbd(3,...
'dir',...
1,...
'1',...
'0')
pdesetbd(2,...
'dir',...
1,...
'1',...
'0')
pdesetbd(1,...
'dir',...
1,...
'1',...
'0')
% Mesh generation:
setappdata(pde_fig,'Hgrad',1.3);
setappdata(pde_fig,'refinemethod','regular');
setappdata(pde_fig,'jiggle',char('on','mean',''));
setappdata(pde_fig,'MesherVersion','preR2013a');
pdetool('initmesh')
pdetool('refine')
pdetool('refine')
% PDE coefficients:
pdeseteq(1,...
'1.0',...
'0.0',...
'10.0',...
'1.0',...
'0:10',...
'0.0',...
'0.0',...
'[0 100]')
setappdata(pde_fig,'currparam',...
['1.0 ';...
'0.0 ';...
'10.0';...
'1.0 '])
% Solve parameters:
setappdata(pde_fig,'solveparam',...
char('0','6192','10','pdeadworst',...
'0.5','longest','0','1E-4','','fixed','Inf'))
% Plotflags and user data strings:
setappdata(pde_fig,'plotflags',[4 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 1]);
setappdata(pde_fig,'colstring','u-(1-x.^2-y.^2)/4');
setappdata(pde_fig,'arrowstring','');
setappdata(pde_fig,'deformstring','');
setappdata(pde_fig,'heightstring','');
% Solve PDE:
pdetool('solve')
求解抛物线方程
1.输入【pdetool】,进入偏微分方程工具箱
2.点击【Options】-【Application】-【Generic Scalar】
3.点击【Options】-【Grid】
4.点击【Options】-【Grid Spacing】
5.点击【Auto】-输入【-0.05 0.05】-【Apply】
6.点击【Draw】-【Rectangle/Square】
7.分别绘制【R1】和【R2】-【R1 R2】修改为【R1-R2】
8.点击【R1】和【R2】-设置【R1】和【R2】
9.点击【Edit】-【Select All】-【Boundary】-【Specify boundary conditions...】
GUI界面编程
1.输入【guide】,打开guidequick start窗口
2.点击【新建GUI】-【确定】
2.设计如图图形,点击【工具】-点击【菜单编辑器】
3.点击【新建菜单】,输入菜单属性,点击【打开】-【确定】
参考链接:https://jingyan.baidu.com/article/e5c39bf587698b39d760331d.html?st=5&net_type=&bd_page_type=1&os=1&rst=&word=m通道滤波器组
MATLAB论坛:
网址链接:https://www.ilovematlab.cn/forum.php?s_tid=ForumTopNavigation