Matlab学习

2022-05-29 09:26:18 浏览数 (1)

第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

0 人点赞