锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

MATLAB(1)

时间:2022-08-14 17:30:00 abs轮速传感器各自的优缺点120i角位移传感器meas60角位移传感器measfv1连接器1x8p连接器lb膜视觉传感器基础

MATLAB

第一章 MATALB基础技能

第1节 MATLAB窗口

1、语言修改

中文版:预设——MATLAB——常规

英文版:Preferences——MATLAB——General

2、布局

中文版:布局

英文版:layout

3、帮助

可以搜索一些指令

第2节 命令行

一、常用指令及格式

(1)清除操作
clc 清理命令行显示 clear 清理变量 close all 关闭所有绘图窗口 clf 清除当前图像窗口 
(2)快捷键
上下键:调用之前输入过的一些命令 esc:删除刚输入的段落 
(3)换行操作
%命令行换行输入 a=1 % 按Shift Enter快捷键暂时不执行此行命令,并输入下一行 b=2 % 按 Shift Enter快捷键进入下一行输入,也可以编辑本行或上述命令 c=a b % 按回车键运行3行命令  当用户输入关键字的多行循环命令时,例如for和end,不需要使用Shift Enter快捷键,直接按回车键 %进入下一行输入,直到循环完成,MATLAB各行程序将一起执行。 for r=1:5 % 按回车键 a=pi*r^2 % 按回车键 end % 按回车键,执行循环体内的命令 a =     3.1416 a =    12.5664 a =    28.2743 a =    50.2655 a =    78.5398  %在同一行输入多个函数 >> x = (1:10)'; logs = [x log10(x)] logs =     1.0000         0     2.0000    0.3010     3.0000    0.4771     4.0000    0.6021     5.0000    0.6990     6.0000    0.7782     7.0000    0.8451     8.0000    0.9031     9.0000    0.9542    10.0000    1.0000  %长命令行的分行输入 >> headers = ['Author First Name, Author Middle Initial ' ... 'Author Last Name '] headers =     'Author First Name, Author Middle Initial Author Last Name ' >> headers = ['Author First Name, Author Middle Initial ' 'Author Last Name '] headers =     'Author First Name, Author Middle Initial Author Last Name '      %标识符(...)若出现在两个单引号的中间,MATLAB则会报错 %headers = ['Author Last Name, Author First Name, ... %Author Middle Initial']  如果一行数据太多,想分行输入,需要添加标识符(...),不能直接换行 >> a=[1 2 3 4 5 ...  6 7 8] a =      1     2     3     4     5     6     7     8 % a=[1 2 3 4 5  % 6 7 8]      
(4)数据显示格式
%数据显示格式 默认显示:四舍五入,小数点后保留四位(但后台存储正常数据) >> aq=302.45 aq =   302.4500 >> a=302.00045 a =   302.0005  >> format long >> a=302.0045 a =      3.020045000000000e 02 >> format short >>  a=302.0045 a =   302.0045  format long format short format compact:紧凑显示(空行少) format loose:松散显示(空行多)  
(5)科学计数法
>> a=10000000000000000000000000000000000000 a =    1.0000e 37 >> b=100e35 b =    1.0000e 37 >> c=0.0000000000021 c =    2.1000e-12    
(6)随机种子设置
根据提示设置不同的版本 % rand('state', 0); % 14b之后 % rng(0)   % 17a之后  rng(0)    设置%后,每次生成的随机数相同,数据验证方便 >> rng(0) >> randperm(7) % 创建由1∶由7组成的随机数列(每次输入完成)rng(0)生成的随机序列如下) ans =      6     3     7     5     1     2     4 

2、变量赋值

>> a=1 a =      1 

3、矩阵操作

(1)矩阵输入
% 换行分号,行末分号 >> A = [1 2 3; 4 5 6; 7 8 10] A =      1     2     3      4     5     6      7     8    10 %行末加分号不在命令行窗口显示结果,但是会存入内存空间 >> A = [1 2 3; 4 5 6; 7 8 10]; >>  
(2)矩阵合并
>> A = ones(2, 5) * 6    % 所有元素都是6的2′5矩阵 A =      6     6     6     6     6      6     6     6     6     6 >> B= rand(3, 5) % 3′5 随机数矩阵 B =     0.8147    0.9134    0.2785    0.9649    0.9572     0.9058    0.6324    0.5469    0.1576    0.4854     0.1270    0.0975    0.9575    0.9706    0.8003 >> C = [A; B]     %换行,上下合并 C =     6.0000    6.0000    6.0000    6.0000    6.0000     6.0000    6.0000    6.0000    6.0000    6.0000     0.8147    0.9134    0.2785    0.9649    0.9572     0.9058    0.6324    0.5469    0.1576    0.4854     0.1270    0.0975    0.9575    0.9706    0.8003 >> A = ones(3, 5) * 6 A =      6     6     6     6     6      6     6     6     6     6      6     6     6     6     6 >> C = [A B]  当维度一致时,%,左右合并 C =   1 至 7 列     6.0000    6.0000    6.0000    6.0000    6.0000    0.8147    0.9134     6.0000    6.0000    6.0000    6.0000    6.0000    0.9058    0.6324     6.0000    6.0000    6.0000    6.0000    6.0000    0.1270    0.0975   8 至 10 列     0.2785    0.9649    0.9572     0.5469    0.1576    0.4854     0.9575    0.9706    0.8003     
(3)矩阵赋值
>> a=magic(4) a =    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
>> a(3,4)=0 % 对单个元素进行赋值
a =
    16     2     3    13
     5    11    10     8
     9     7     6     0
     4    14    15     1
>> a(:,1)=1 % 对第一列进行赋值
a =
     1     2     3    13
     1    11    10     8
     1     7     6     0
     1    14    15     1
>> a(14)=16 % 采用全下标对第14个元素进行赋值
a =
     1     2     3    13
     1    11    10    16
     1     7     6     0
     1    14    15     1
>> ones(4) % 创建所有元素为1的矩阵
ans =
     1     1     1     1
     1     1     1     1
     1     1     1     1
     1     1     1     1
>> rand(2,3) % 创建2*3的均匀分布随机数矩阵,赋值范围为0-1
ans =
    0.1419    0.9157    0.9595
    0.4218    0.7922    0.6557
>> randperm(7) % 创建由1∶7构成的随机数列
ans =
     1     7     4     6     5     2     3
(4)数组运算与矩阵运算
>> a=[1 2 4 9;16 25 36 49]
a =
     1     2     4     9
    16    25    36    49
>> b=sqrt(a) % 应用函数对矩阵中的每一个元素分别开方
b =
    1.0000    1.4142    2.0000    3.0000
    4.0000    5.0000    6.0000    7.0000

>> A=[1 2;3 4] % 测试矩阵A
A =
     1     2
     3     4
>> B=[4 3;2 1] % 测试矩阵B
B =
     4     3
     2     1
>> r1=100+A % 矩阵A加上一个常数
r1 =
   101   102
   103   104
>> r2_1=A*B % 两个矩阵相乘,矩阵乘法
r2_1 =
     8     5
    20    13
>> r2_2=A.*B % 两个矩阵相乘,数组乘法
r2_2 =
     4     6
     6     4
>> r3_1=A\B % 矩阵左除
r3_1 =
   -6.0000   -5.0000
    5.0000    4.0000
>> r3_2=A.\B % 数组除法
r3_2 =
    4.0000    1.5000
    0.6667    0.2500
>> r4_1=B/A % 矩阵右除
r4_1 =
   -3.5000    2.5000
   -2.5000    1.5000
>> r4_2=B./A % 数组除法
r4_2 =
    4.0000    1.5000
    0.6667    0.2500
>> r5_2=A^2 % 矩阵幂
r5_2 =
     7    10
    15    22
>> r5_1=A.^2 % 数组幂
r5_1 =
     1     4
     9    16
>> r6_1=2.^A % 数组幂
r6_1 =
     2     4
     8    16
(5)矩阵元素的扩展与删除
>> A=magic(4)
A =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
>> A(6,7)=17
A =
    16     2     3    13     0     0     0
     5    11    10     8     0     0     0
     9     7     6    12     0     0     0
     4    14    15     1     0     0     0
     0     0     0     0     0     0     0
     0     0     0     0     0     0    17
>> A(:,8)=ones(6,1)
A =
    16     2     3    13     0     0     0     1
     5    11    10     8     0     0     0     1
     9     7     6    12     0     0     0     1
     4    14    15     1     0     0     0     1
     0     0     0     0     0     0     0     1
     0     0     0     0     0     0    17     1
>> A(:,1)=[] % 删除矩阵A的第1列
A =
     2     3    13     0     0     0     1
    11    10     8     0     0     0     1
     7     6    12     0     0     0     1
    14    15     1     0     0     0     1
     0     0     0     0     0     0     1
     0     0     0     0     0    17     1
>> A(2,:)=[] % 删除矩阵A的第2行
A =
     2     3    13     0     0     0     1
     7     6    12     0     0     0     1
    14    15     1     0     0     0     1
     0     0     0     0     0     0     1
     0     0     0     0     0    17     1
(6)矩阵的重构
>> a=reshape(1:9,3,3) % 创建测试矩阵
a =
     1     4     7
     2     5     8
     3     6     9
>> a= [1,7;2,8;3,9;4,10;5,11;6,12] % 创建测试矩阵
a =
     1     7
     2     8
     3     9
     4    10
     5    11
     6    12
>> a = reshape(a,4,3) % 使用reshape改变a的形状,注意前后两个a每一个单下标对应的元素是一致的
a =
     1     5     9
     2     6    10
     3     7    11
     4     8    12
>> b=rot90(a,3) % 将矩阵a逆时针旋转3×90°
b =
     4     3     2     1
     8     7     6     5
    12    11    10     9
>> c=fliplr(a) % 将矩阵a左右翻转
c =
     9     5     1
    10     6     2
    11     7     3
    12     8     4
>> d=flipud(a) % 将矩阵a上下翻转
d =
     4     8    12
     3     7    11
     2     6    10
     1     5     9    
(7)矩阵的形状信息
>> A = rand(5,3) * 10 % 生成5*3的随机矩阵
A =
    2.7603    4.9836    7.5127
    6.7970    9.5974    2.5510
    6.5510    3.4039    5.0596
    1.6261    5.8527    6.9908
    1.1900    2.2381    8.9090
>> size(A) 
ans =
     5     3
>> a=length(A) %最长的那个方向的长度
a =
     5
>> A = A'   %转置
A =
    2.7603    6.7970    6.5510    1.6261    1.1900
    4.9836    9.5974    3.4039    5.8527    2.2381
    7.5127    2.5510    5.0596    6.9908    8.9090  
>> a=length(A)
a =
     5
>> b=sum(A(:))/numel(A) % 使用Sum和numel函数计算矩阵A的平均值
b =
    5.0682
>> numel(A) 
ans =
    15
>> mean(A)   %求每一列的平均数
ans =
    5.0855    6.3151    5.0048    4.8232    4.1124 
>> mean(A,2)  %求每一行平均数
ans =
    3.7849
    5.2151
    6.2046  
>> mean(A(:))  %求所有元素的平均数
ans =
    5.0682 
>> mean(mean(A))  %先对所有列求平均数,求完平均再求平均
ans =
    5.0682    

4、数据计算

>> b=29*(2+23/3)-5^2
b =
  255.3333

5、函数的调用

语法格式:返回值=函数名(参数1,参数2,……)

注意:Tab键补全功能,语法提示,错误纠正

plot函数:输入”plot(“,等一会儿,会自动显示

magic(3:直接输入enter,会报错,可以根据箭头指向位置以及错误提示修改

Sin(pi):直接输入enter,会报错,可以根据错误提示修改,sin是区分大小写的

mean(c,'o:按下Tab,会出现自动补全

%生成3*3的幻方,行,列,对角线和都相等
>> d=magic(3)
d =
     8     1     6
     3     5     7
     4     9     2


% mean(a,'omitnan'),忽略NAN值求平均数
>> c=1:10
c =
     1     2     3     4     5     6     7     8     9    10
>> mean(c,'omitnan')
ans =
    5.5000
>> c(4)=NaN
c =
     1     2     3   NaN     5     6     7     8     9    10
>> mean(c,'omitnan')
ans =
    5.6667
>> mean(c)
ans =
   NaN    

6、常用变量名

% ans:默认赋值结果变量名,但是会被不断覆盖
>> 2+3
ans =
     5
% NAN:not a number
>> 0/0
ans =
   NaN
% Inf:无穷大
>> 2/0
ans =
   Inf
% i或j:虚数单位
>> i
ans =
   0.0000 + 1.0000i
>> j
ans =
   0.0000 + 1.0000i
>> 2+3i
ans =
   2.0000 + 3.0000i
% pi:圆周率   
>> pi
ans =
    3.1416
% eps:相对精度,两个量最小可以差这么多(并不是MATLAB软件造成的,是计算机二进制系统造成的)
>> eps
ans =
   2.2204e-16
   
>> a=10000000000000000
b=10000000000000001
a =
   1.0000e+16
b =
   1.0000e+16
>> c=a-b
c =
     0
>> c==0
ans =
  logical
   1

>> a1=1000000000000000
b1=1000000000000001
a1 =
   1.0000e+15
b1 =
   1.0000e+15
>> c1=a1-b1
c1 =
    -1
>> c1==0
ans =
  logical
   0   

7、复数相关函数

>> sd=5+6i
sd =
   5.0000 + 6.0000i
>> r=real(sd)   % 给出复数sd的实部
r =
     5
>> im=imag(sd)   % 给出复数sd的虚部
im =
     6
%复数 z=a+bi(a,b∈R)
%则模为√(a²+b²)
%相位角设为W,arctanW=b/a
>> a=abs(sd)   % 给出复数sd的模/绝对值
a =
    7.8102 
>> an=angle(sd)  % 以弧度为单位给出复数sd的相位角,angle 函数可以写为 atan2( imag (h), real (h) )
an =
    0.8761 
>> A=[2,4;1,6]-[3,7;3,9]*i
A =
   2.0000 - 3.0000i   4.0000 - 7.0000i
   1.0000 - 3.0000i   6.0000 - 9.0000i    
>> B=[2+5i,3+2i;6-9i,3-5i]
B =
   2.0000 + 5.0000i   3.0000 + 2.0000i
   6.0000 - 9.0000i   3.0000 - 5.0000i
>> C=B-A
C =
   0.0000 + 8.0000i  -1.0000 + 9.0000i
   5.0000 - 6.0000i  -3.0000 + 4.0000i   

8、开立方根

>> a=-8
a =
    -8
>> r=a^(1/3)
r =
   1.0000 + 1.7321i
% 结果不为-2,因为在数学中开立方有三个解,有两个解是复数解,-2是实数解
>> R=abs(a)^(1/3) % 模的开3次方
R =
     2
>> m=[0,1,2]; % 为3个方根而设
>> theta=(angle(a)+2*pi*m)/3 % -pi> r=R*exp(i*theta) % 将得到的结果赋给r
r =
   1.0000 + 1.7321i  -2.0000 + 0.0000i   1.0000 - 1.7321i    

角度和弧度:1°=π/180°,1rad=180°/π

角度转弧度 π/180×角度;弧度变角度 180/π×弧度。

复数的立方根求法:
把复数变成幅度和相角的形式
例如a+bi:
幅度为:√(a^2 + b^2)
相角为:arctan(b/a)
开立方根:幅度开立方根,相角变成原来的1/3
得到3个复数,幅度相同,相角不同,它们都是原来那个数的立方根。

比如:求1的立方根:
先把1化成幅度和相角的形式:
幅度为1,相角为360k°(k=0,1,2,…)
开立方根:幅度开立方根,1开立方根还是1
相角变成原来的1/3:360k°/3=120k°(k=0,1,2,…)
所以相角有3种:0°,120°,240°。
得到3个立方根:
幅度1,相角0°;幅度1,相角120°;幅度1,相角240°
再化为a+bi的形式就是:
1 ; -1/2+(√3)i/2 ; -1/2-(√3)i/2

9、空格、冒号

(1)空格的作用
>> a1=7 -2 +5
a2=7 - 2 +5
a3=[7 - 2 + 5]
a4=[7 -2 +5]
a1 =
    10
a2 =
    10
a3 =
    10
a4 =
     7    -2     5
(2)冒号的作用
>> a=2:2:20

a =

     2     4     6     8    10    12    14    16    18    20

>> b=10:-1:2

b =

    10     9     8     7     6     5     4     3     2
>> b=10:1:2
b =
  空的 1×0 double 行向量
>> a=1:5
a =
     1     2     3     4     5  
>> a=[1 2 3; 4 5 6] % 创建测试矩阵
a =
     1     2     3
     4     5     6
>> d=a(1,:) % 通过使用冒号可以寻访全行元素
d =
     1     2     3
>> e=a(:,2) % 通过使用冒号可以寻访全列元素
e =
     2
     5
>> f=a(:) % 单下标寻访
f =
     1
     4
     2
     5
     3
     6
>> g=a(:,[1 3]) % 寻访地址可以是向量,以同时寻访多个元素
g =
     1     3
     4     6     

10、下标

>> a=[1 2 3; 4 5 6] % 创建测试矩阵
a =
     1     2     3
     4     5     6
>> A=a(2,2) % 全下标寻访,第2行第2列
A =
     5
>> b=a(4) % 单下标寻访 (访问顺序:按列,1,4,2,5)
b =
     5 
% 逻辑1标识     
>> B=a>5 % 返回逻辑下标
B =
  2×3 logical 数组
   0   0   0
   0   0   1
>> c=a(B) % 逻辑下标寻访
c =
     6   
>> C=a(a>5)
C =
     6     

11、多维数组:

创建多维数组最常用的方法有以下4种:

(1)直接通过“全下标”元素赋值的方式创建多维数组。

(2)由若干同样尺寸的二维数组组合成多维数组。

(3)由函数ones、zeros、rand、randn等直接创建特殊多维数组。

(4)借助cat、repmat、reshape等函数构建多维数组。

%三维数组:几行几列几页
>> A(3,3,3)=1 % 创建3*3*3数组,未赋值元素默认设置为0
A(:,:,1) =
     0     0     0
     0     0     0
     0     0     0
A(:,:,2) =
     0     0     0
     0     0     0
     0     0     0
A(:,:,3) =
     0     0     0
     0     0     0
     0     0     1
     
>> B(3,4,:)=1:4 % 创建3*4*4数组
B(:,:,1) =
     0     0     0     0
     0     0     0     0
     0     0     0     1
B(:,:,2) =
     0     0     0     0
     0     0     0     0
     0     0     0     2
B(:,:,3) =
     0     0     0     0
     0     0     0     0
     0     0     0     3
B(:,:,4) =
     0     0     0     0
     0     0     0     0
     0     0     0     4


>> C(:,:,1)=magic(4); % 创建数组A第1页的数据
C(:,:,2)=ones(4); % 创建数组A第2页的数据
C(:,:,3)=zeros(4) % 创建数组A第3页的数据
C(:,:,1) =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
C(:,:,2) =
     1     1     1     1
     1     1     1     1
     1     1     1     1
     1     1     1     1
C(:,:,3) =
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
     
>> D=rand(3,4,3) % 由函数rand直接创建特殊多维数组
D(:,:,1) =
    0.8003    0.9157    0.6557    0.9340
    0.1419    0.7922    0.0357    0.6787
    0.4218    0.9595    0.8491    0.7577
D(:,:,2) =
    0.7431    0.1712    0.2769    0.8235
    0.3922    0.7060    0.0462    0.6948
    0.6555    0.0318    0.0971    0.3171
D(:,:,3) =
    0.9502    0.3816    0.1869    0.6463
    0.0344    0.7655    0.4898    0.7094
    0.4387    0.7952    0.4456    0.7547
    
 % cat()函数,后面那个数字,表示在第几维度上拼
 >> E3=cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3) %借助cat函数构建多维数组
E3(:,:,1) =
     1     1     1
     1     1     1
E3(:,:,2) =
     2     2     2
     2     2     2
E3(:,:,3) =
     3     3     3
     3     3     3

>> E2=cat(2,ones(2,3),ones(2,3)*2,ones(2,3)*3) %借助cat函数构建多维数组
E2 =
     1     1     1     2     2     2     3     3     3
     1     1     1     2     2     2     3     3     3

>> E1=cat(1,ones(2,3),ones(2,3)*2,ones(2,3)*3) %借助cat函数构建多维数组
E1 =
     1     1     1
     1     1     1
     2     2     2
     2     2     2
     3     3     3
     3     3     3
>> e=[1,2;3,4;5,6]
e =
     1     2
     3     4
     5     6
>> F=repmat(e,[1,2,3])  %行这一维重复一遍,列这一维度重复两遍,页这一维度重复三遍
F(:,:,1) =
     1     2     1     2
     3     4     3     4
     5     6     5     6
F(:,:,2) =
     1     2     1     2
     3     4     3     4
     5     6     5     6
F(:,:,3) =
     1     2     1     2
     3     4     3     4
     5     6     5     6     
>> G=reshape(1:60,5,4,3)
G(:,:,1) =
     1     6    11    16
     2     7    12    17
     3     8    13    18
     4     9    14    19
     5    10    15    20
G(:,:,2) =
    21    26    31    36
    22    27    32    37
    23    28    33    38
    24    29    34    39
    25    30    35    40
G(:,:,3) =
    41    46    51    56
    42    47    52    57
    43    48    53    58
    44    49    54    59
    45    50    55    60
    
>> H=reshape(G,4,5,3)
H(:,:,1) =
     1     5     9    13    17
     2     6    10    14    18
     3     7    11    15    19
     4     8    12    16    20
H(:,:,2) =
    21    25    29    33    37
    22    26    30    34    38
    23    27    31    35    39
    24    28    32    36    40
H(:,:,3) =
    41    45    49    53    57
    42    46    50    54    58
    43    47    51    55    59
    44    48    52    56    60    

>> I=flip(H,1)    %数组翻转(第一维度上下翻转)
I(:,:,1) =
     4     8    12    16    20
     3     7    11    15    19
     2     6    10    14    18
     1     5     9    13    17
I(:,:,2) =
    24    28    32    36    40
    23    27    31    35    39
    22    26    30    34    38
    21    25    29    33    37
I(:,:,3) =
    44    48    52    56    60
    43    47    51    55    59
    42    46    50    54    58
    41    45    49    53    57

image-20210810134005928

>> J=shiftdim(H,1) % 将各维向左移动1位,使2*3*3数组变成3*3*2数组
J(:,:,1) =
     1    21    41
     5    25    45
     9    29    49
    13    33    53
    17    37    57
J(:,:,2) =
     2    22    42
     6    26    46
    10    30    50
    14    34    54
    18    38    58
J(:,:,3) =
     3    23    43
     7    27    47
    11    31    51
    15    35    55
    19    39    59
J(:,:,4) =
     4    24    44
     8    28    48
    12    32    52
    16    36    56
    20    40    60
>> K=shiftdim(H,2) % 将各维向左移动2位,使2*3*3数组变成3*2*3数组    
K(:,:,1) =
     1     2     3     4
    21    22    23    24
    41    42    43    44
K(:,:,2) =
     5     6     7     8
    25    26    27    28
    45    46    47    48
K(:,:,3) =
     9    10    11    12
    29    30    31    32
    49    50    51    52
K(:,:,4) =
    13    14    15    16
    33    34    35    36
    53    54    55    56
K(:,:,5) =
    17    18    19    20
    37    38    39    40
    57    58    59    60
%运算D=shiftdim(A,1)实现以下操作:D(j,k,i)=A(i,j,k),i, j, k分别是指各维的下标。对于三维数组,%D=shiftdim(A,3)的操作就等同于简单的D=A。

第3节 数据类型

1、逻辑型

运算优先级

>> a=[1 2 3; 4 5 6] % 创建测试矩阵
a =
     1     2     3
     4     5     6
>> B=a>5 % 返回逻辑下标
B =
  2×3 logical 数组
   0   0   0
   0   0   1

>> aa = true
aa =
  logical
   1
>> bb = false
bb =
  logical
   0 
>> c=true(size(a))
c =
  2×3 logical 数组
   1   1   1
   1   1   1
>> false([size(a),2])
  2×3×2 logical 数组
ans(:,:,1) =
   0   0   0
   0   0   0
ans(:,:,2) =
   0   0   0
   0   0   0   
>> a=[1 2 3;4 5 6]
a =
     1     2     3
     4     5     6
>> b=[1 0 0;0 -2 1]
b =
     1     0     0
     0    -2     1
>> A=a&b % 逻辑“与”
A =
  2×3 logical 数组
   1   0   0
   0   1   1
>> B=a|b % 逻辑“或”
B =
  2×3 logical 数组
   1   1   1
   1   1   1
>> C=~b % 逻辑“非”
C =
  2×3 logical 数组
   0   1   1
   1   0   0   
>> a=[1 1 0; 1 0 0;1 0 1]
a =
     1     1     0
     1     0     0
     1     0     1
>> A=all(a) % 每列元素均为非零时返回真
A =
  1×3 logical 数组
   1   0   0
>> D=all(a,2) % 每行元素均为非零时返回真
D =
  3×1 logical 数组
   0
   0
   0
   
>> B=any(a) % 每列元素存在非零时返回真
B =
  1×3 logical 数组
   1   1   1
>> C=any(a,2) % 每行元素存在非零时返回真
C =
  3×1 logical 数组
   1
   1
   1   
>> a=[0 -1 2]
a =
     0    -1     2
>> b=[-3 1 2]
b =
    -3     1     2
>> a> a>b % 对应元素比较大小
ans =
  1×3 logical 数组
   1   0   0
>> a<=b % 对应元素比较大小
ans =
  1×3 logical 数组
   0   1   1
>> a>=b % 对应元素比较大小
ans =
  1×3 logical 数组
   1   0   1
>> a==b % 对应元素比较相等
ans =
  1×3 logical 数组
   0   0   1
>> a~=b % 对应元素比较不相等
ans =
  1×3 logical 数组
   1   1   0    

2、字符串

>> a='matlab'
a =
    'matlab'
>> size(a)
ans =
     1     6
>> A='中文字符串输入演示'
A =
    '中文字符串输入演示'
>> A(3:5)
ans =
    '字符串'

>> S=['This string array '
'has multiple rows.']
S =
  2×18 char 数组
    'This string array '
    'has multiple rows.'
>> a=char('这','字符','串数组','','由5 行组成')
% 以字符最多的一行为准,而将其他行中的字符以空格补齐
a =
  5×6 char 数组
    '这     '
    '字符    '
    '串数组   '
    '      '
    '由5 行组成'
>> size(a)
ans =
     5     6     
>> str1 = 'hello';
str2 = 'help';
>> C = strcmp(str1,str2)
C =
  logical
   0
>> C = strncmp(str1, str2, 2) % 比较前两个字符
C =
  logical
   1
>> str3 = 'Hello';
>> D = strncmp(str1, str3,2) % 对大小写敏感
D =
  logical
   0
>> F = strncmpi(str1, str3,2) % 对大小写不敏感
F =
  logical
   1

>> A = 'fate';
B = 'cake';
A == B %使用(==)运算符来判断两个字符串中有哪些字符相等
ans =
  1×4 logical 数组
   0   1   0   1
>> a=1
a =
     1
>> b=num2str(a)
b =
    '1'
>> c=str2num(b)
c =
     1

3、结构数组

>> employee.name='henry';
employee.sex='male';
employee.age=25;
employee.number=12345;
employee
employee = 
  包含以下字段的 struct:

      name: 'henry'
       sex: 'male'
       age: 25
    number: 12345

>> employee(2).name='lee';
employee(2).sex='female';
employee(2).age=23;
employee(2).number=98765;
employee(2)
ans = 
  包含以下字段的 struct:

      name: 'lee'
       sex: 'female'
       age: 23
    number: 98765

>> employee % 查看employee结构数组
employee = 
  包含以下字段的 1×2 struct 数组:
    name
    sex
    age
    number

子域

>> green_house.name='一号房'; 
green_house.volume='2000 立方米'; 
green_house.parameter.temperature=...
[31.2 30.4 31.6 28.7;29.7 31.1 30.9 29.6]; %子域温度
green_house.parameter.humidity=...
[62.1 59.5 57.7 61.5;62.0 61.9 59.2 57.5]; %子域湿度
>> green_house.parameter % 显示域的内容
ans = 
  包含以下字段的 struct:

    temperature: [2×4 double]
       humidity: [2×4 double]
>> green_house.parameter.temperature % 显示子域中的内容
ans =
   31.2000   30.4000   31.6000   28.7000
   29.7000   31.1000   30.9000   29.6000        

>> USPres.name = 'Franklin D. Roosevelt'; 
USPres.vp(1) = {'John Garner'};
USPres.vp(2) = {'Henry Wallace'}; 
USPres.vp(3) = {'Harry S Truman'};
USPres.term = [1933, 1945]; 
USPres.party = 'Democratic'; % 创建包括4个域名的结构数组
presFields = fieldnames(USPres) % 使用fieldnames函数获取现有域名
presFields =
  4×1 cell 数组
    {'name' }
    {'vp'   }
    {'term' }
    {'party'}
>> orderfields(USPres) % 使用orderfields函数对域名按照字母顺序进行排序
ans = 
  包含以下字段的 struct:

     name: 'Franklin D. Roosevelt'
    party: 'Democratic'
     term: [1933 1945]
       vp: {'John Garner'  'Henry Wallace'  'Harry S Truman'}
>> mystr1 = getfield(USPres, 'name') % 获取结构的域内容
mystr1 =
    'Franklin D. Roosevelt'
>> mystr2= setfield(USPres, 'name', 'ted') % 设置结构的域内容
mystr2 = 
  包含以下字段的 struct:

     name: 'ted'
       vp: {'John Garner'  'Henry Wallace'  'Harry S Truman'}
     term: [1933 1945]
    party: 'Democratic'    
>> USPres.name = 'Franklin D. Roosevelt'; 
USPres.vp(1) = {'John Garner'};
USPres.vp(2) = {'Henry Wallace'}; 
USPres.vp(3) = {'Harry S Truman'};
USPres.term = [1933, 1945]; 
USPres.party = 'Democratic'; % 创建包括4个域名的结构数组
>> USPres(3,2).name='Richard P. Jackson' % 结构数组的扩展
USPres = 
  包含以下字段的 3×2 struct 数组:
    name
    vp
    term
    party
>> USPres(2,:)=[] % 通过对结构数组赋值为空矩阵来实现删除
USPres = 
  包含以下字段的 2×2 struct 数组:
    name
    vp
    term
    party    
% emmm,具体点开那个变量就懂了

4、元胞数组

元胞数组有下标,做循环更方便

结构数组有域名,编程更为方便

(1)创建元胞数组

使用{}

>> A = {[1 4 3; 0 5 8; 7 2 9], 'Anne Smith'; 3+7i, -pi:pi/4:pi}
A =
  2×2 cell 数组
    {3×3 double        }    {'Anne Smith'}
    {[3.0000 + 7.0000i]}    {1×9 double  }

>> header = {'Name', 'Age', 'Pulse/Temp/BP'} % 元胞数组的创建
header =
  1×3 cell 数组
    {'Name'}    {'Age'}    {'Pulse/Temp/BP'}

>> records(1,:) = {'Kelly', 49, {58, 98.3, [103, 72]}} % 嵌套元胞数组的创建
records =
  1×3 cell 数组
    {'Kelly'}    {[49]}    {1×3 cell}
(2)依次创建元胞数组
A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
A(1,2) = {'Anne Smith'};
A(2,1) = {3+7i};
A(2,2) = {-pi:pi/4:pi};
A(3,3) = {5}
A =
  3×3 cell 数组
    {3×3 double        }    {'Anne Smith'}    {0×0 double}
    {[3.0000 + 7.0000i]}    {1×9 double  }    {0×0 double}
    {0×0 double        }    {0×0 double  }    {[       5]}
>> str=A{1,2} % 返回字符型数组str,a{1,2}表示对应元胞的内容
str =
    'Anne Smith'
>> class(str) % 查看变量str的数据类型,结果确为字符型
ans =
    'char'
>> str2=A(1,2) % a(1,2)表示元胞数组中的一个元胞
str2 =
  1×1 cell 数组
    {'Anne Smith'}
>> class(str2) % 查看变量str2的数据类型,结果为元胞数组
ans =
    'cell'
>> [nrows, ncols] = cellfun(@size, A) % 将size函数应用于每一个元胞元素
nrows =
     3     1     0
     1     1     0
     0     0     1
ncols =
     3    10     0
     1     9     0
     0     0     1
>> cellplot(A) % 以图片表示元胞数组的基本结构     

5、日期时间

>> t = datetime(2017,8,28,6:7,0,0)
t = 
  1×2 datetime 数组
   2017-08-28 06:00:00   2017-08-28 07:00:00
>> t.Day
ans =
    28    28
>> t.Day = 27:28
t = 
  1×2 datetime 数组
   2017-08-27 06:00:00   2017-08-28 07:00:00
>> t.Format
ans =
    'uuuu-MM-dd HH:mm:ss'
>> t.Format = 'MMMdd日, yyyy年'
t = 
  1×2 datetime 数组
   8月27日, 2017年   8月28日, 2017年
   
>> t2 = datetime(2017,7,29,6,30,45)
t2 = 
  datetime
   2017-07-29 06:30:45   
>> d = t - t2
d = 
  1×2 duration 数组
   695:29:15   720:29:15  % 时分秒
>> d.Format = 'h'
d = 
  1×2 duration 数组
   695.49小时   720.49小时
>> d.Format = 'd'
d = 
  1×2 duration 数组
   28.979天    30.02天   

6、表格数组

>> T = readtable('patients.dat')  % 读取表格数据,matlab自带的一个数据文件
>> T(1:5,1:5)
ans =
  5×5 table
     LastName      Gender     Age             Location              Height
    __________    ________    ___    ___________________________    ______
    'Smith'       'Male'      38     'County General Hospital'        71  
    'Johnson'     'Male'      43     'VA Hospital'                    69  
    'Williams'    'Female'    38     'St. Mary's Medical Center'      64  
    'Jones'       'Female'    40     'VA Hospital'                    67  
    'Brown'       'Female'    49     'County General Hospital'        64  
>> T.Age    

创建表格数组

>> LastName = {'Smith';'Johnson';'Williams';'Jones';'Brown'};
%这里如果创建结构数组,就会报错:要串联的数组的维度不一致。 
Age = [38;43;38;40;49];
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];
T = table(LastName,Age,Height,Weight,BloodPressure)
T =
  5×5 table
     LastName     Age    Height    Weight    BloodPressure
    __________    ___    ______    ______    _____________
    'Smith'       38       71       176       124     93  
    'Johnson'     43       69       163       109     77  
    'Williams'    38       64       131       125     83  
    'Jones'       40       67       133       117     75  
    'Brown'       49       64       119       122     80
>> T.Properties.VariableNames
ans =
  1×5 cell 数组
    {'LastName'}    {'Age'}    {'Height'}    {'Weight'}    {'BloodPressure'}
% properties 类属性名称 
% VariableNames 列名称
% RowNames 行名称

表可以像普通数值矩阵那样通过小括号加下标来进行寻访。

除了数值和逻辑型下标之外,用户还可以使用变量名和行名来作为下标。例如本例中可以使用LastName作为行名,然后将这一列数据删除。

>> T.LastName
ans =
  5×1 cell 数组
    {'Smith'   }
    {'Johnson' }
    {'Williams'}
    {'Jones'   }
    {'Brown'   }
>> T.LastName = [];
>> size(T) % 查看当前表T的尺寸
ans =
     5     4
>> T(1:5,3:4)
ans =
  5×2 table
    Weight    BloodPressure
    ______    _____________
     176       124     93  
     163       109     77  
     131       125     83  
     133       117     75  
     119       122     80      

基于已有变量(身高和体重)用户可以创建新的变量BMI,也就是体重指数。然后还可以添加变量的单位和描述等属性

>> T.BMI = (T.Weight*0.453592)./(T.Height*0.0254).^2;
>> T
T =
  5×5 table
    Age    Height    Weight    BloodPressure     BMI  
    ___    ______    ______    _____________    ______
    38       71       176       124     93      24.547
    43       69       163       109     77      24.071
    38       64       131       125     83      22.486
    40       67       133       117     75      20.831
    49       64       119       122     80      20.426
%通过修改表属性 VariableUnits 来为表中的每个变量指定单位    
>> T.Properties.VariableUnits{'BMI'} = 'kg/m^2';
%创建索引
T.Properties.VariableDescriptions{'BMI'} = 'Body Mass Index';
%对数据做了备注,但是是不显示的
>> T
T =
  5×5 table
    Age    Height    Weight    BloodPressure     BMI  
    ___    ______    ______    _____________    ______
    38       71       176       124     93      24.547
    43       69       163       109     77      24.071
    38       64       131       125     83      22.486
    40       67       133       117     75      20.831
    49       64       119       122     80      20.426 
>> size(T) % 查看当前表的尺寸
ans =
     5     5    

第二章 MATALB数据可视化及图像句柄

第1节 基础绘图

1、概述

(1)绘图类型

Help ——> Types of MATLAB Plots /MATLAB绘图类型

(2)绘图步骤

(3)一般调用格式
Handle=FuntionName(data,’name’,’value’)
比如:h =plot(X,Y,name,value) 
(4)图形初步了解
1)二维曲线图
>> t=(0:pi/50:2*pi)';
k=0.4:0.1:1;
Y=cos(t)*k;
plot(t,Y)    %  绘制二维曲线图

2)李萨如图形
>> t=linspace(0,2*pi,80)';       %  在[0,2pi]之间产生80个等距的采样点
X=[cos(t),cos(2*t),cos(3*t)]+1i*sin(t)*[1, 1, 1]; %(80×3)的复数矩阵
plot(X)

>> axis square                  %  使坐标轴长度相同
>> h1=legend('1','2','3')            %  图例

h1 = 

  Legend (1, 2, 3) - 属性:

         String: {'1'  '2'  '3'}
       Location: 'northeast'
    Orientation: 'vertical'
       FontSize: 9
       Position: [0.7015 0.7746 0.1036 0.1262]
          Units: 'normalized'

  显示 所有属性

>> h1.Location='southoutside'             %将图例位置移到下面外面

h1 = 

  Legend (1, 2, 3) - 属性:

         String: {'1'  '2'  '3'}
       Location: 'southoutside'
    Orientation: 'vertical'
       FontSize: 9
       Position: [0.4661 0.0881 0.1036 0.1262]
          Units: 'normalized'

  显示 所有属性

>> h1.Orientation='horizontal'           %三个图例显示为水平方向的

h1 = 

  Legend (1, 2, 3) - 属性:

         String: {'1'  '2'  '3'}
       Location: 'southoutside'
    Orientation: 'horizontal'
       FontSize: 9
       Position: [0.3679 0.0952 0.3000 0.0476]
          Units: 'normalized'

  显示 所有属性

% legend函数还有如下用法,其他用法请查阅帮助文档
% legend('Location','southwest')
% legend('boxoff')
3)绘制椭圆

采用模型画一组椭圆

>> clear
>> th = [0:pi/50:2*pi]';
a = [0.5:.5:4.5];
X = cos(th)*a;
Y = sin(th)*sqrt(25-a.^2);
plot(X,Y),axis('equal'),xlabel('x'), ylabel('y')
>> title('A set of Ellipses')

2、点型线型

>> clear
t = 0:pi/20:2*pi;
>> plot(t,sin(t),'-.r*')
>> hold on  %将几条曲线绘制到同一个图上,否则会覆盖之前的曲线
>> plot(t,sin(t-pi/2),'--mo')
>> plot(t,sin(t-pi),':bs')
>> hold off

属性设置

>> figure                                        		%  生成新的绘图窗口
>> plot(t,sin(2*t),'-mo',...
    'LineWidth',2,...           			%  设置曲线粗细
    'MarkerEdgeColor','k',...   		%  设置数据点边界颜色
    'MarkerFaceColor',[.49 1 .63],...  	%  设置填充颜色,三原色的位置,0可以不打的
    'MarkerSize',12)                   	%  设置数据点型大小

3、坐标轴设置

(1)常用的坐标控制命令

>> x = 0:.025:pi/2;
plot(x,tan(x),'-ro')

>> axis([0  pi/2  0  5])

(2)轴控制指令

采用多子图表现时,图形形状不仅受“控制指令”的影响,而且受整个图面“宽高比”及“子图数目”的影响。

>> clear
>> t=0:2*pi/99:2*pi;
x=1.15*cos(t);y=3.25*sin(t);        %  y为长轴,x为短轴
>> subplot(2,3,1),plot(x,y),axis normal,grid on,   %grid on 设置网格线
title('Normal and Grid on')
>> subplot(2,3,2),plot(x,y),axis equal,grid on,title('Equal')  %坐标轴长度相等
>> subplot(2,3,3),plot(x,y),axis square,grid on,title('Square')  %绘图外面的框是正方形
>> subplot(2,3,4),plot(x,y),axis image,box off,title('Image and Box off')
>> subplot(2,3,5),plot(x,y),axis image fill,box off
title('Image and Fill')
>> subplot(2,3,6),plot(x,y),axis tight,box off,title('Tight')

(3)坐标轴标签设置
>> x = linspace(0,10);  % 0到10之间均匀取数
y = x.^2;
plot(x,y)

>> xticks([0 5 10])

>> xticklabels({'x = 0','x = 5','x = 10'})
>> xticklabels({'0天','5天','10天'})
>> grid on%画分网格线

>> clear
>> figure
>> t = 0:pi/20:2*pi;
plot(t,sin(t),'-.r*')
>> hold on
>> plot(t,sin(t-pi/2),'--mo')
>> plot(t,sin(t-pi),':bs')
>> hold off
>> set(gca,'Xtick',[pi/2,pi,pi*3/2,2*pi],'Ytick', [-1,-0.5,0,0.5,1])
% gca:当前图形的句柄

>> set(gca,'XTickLabel',{'$$\frac{\pi}{2}$$','$$\pi$$','$$\frac{3\pi}{2}$$','$$2\pi$$'},'YTickLabel', {'-1','-0.5','0','0.5','1'},'TickLabelInterpreter','latex')
% TickLabelInterpreter 解析

(4)图形标识
>> clf
>> clear
>> t=0:pi/50:2*pi;
y=sin(t);plot(t,y);
axis([0,2*pi,-1.2,1.2])
>> text(pi/2,1.02,'\fontsize{16}\leftarrow\fontname {隶书}在\pi/2\fontname{隶书}处\itsin(t)\fontname{隶书}极大值')
% fontsize 字号
% leftarrow 左箭头
% fontname 字体
% it指的是斜体

(5)双坐标轴
>> x = 0:0.01:20;                                        %  x坐标
y1 = 200*exp(-0.05*x).*sin(x);                  %  Y1
y2 = 0.8*exp(-0.5*x).*sin(10*x);                %  Y2
[AX,H1,H2] = plotyy(x,y1,x,y2,'plot');            %  绘制双坐标轴图形
set(get(AX(1),'Ylabel'),'String','Slow Decay')    %  纵轴标签1
set(get(AX(2),'Ylabel'),'String','Fast Decay')   %  纵轴标签2
xlabel('Time (\musec)')                            %  x标签
title('Multiple Decay Rates')                        %  图形标题
set(H1,'LineStyle','--')                           %  线形1
set(H2,'LineStyle',':')                            %  线形2

R2016a之后新版方式

>> figure
yyaxis left
plot(x,y1,'--')
xlabel('Time (\musec)')                            %  x标签
ylabel('Slow Decay')

yyaxis right
plot(x,y2,':')
ylabel('Slow Decay')
title('Multiple Decay Rates')                        %  图形标题

包括之后叠加新的曲线,只需要用上hold on命令就行,这种形式更方便

4、子图绘制

>> clf;clear
t=(pi*(0:1000)/1000)';
y1=sin(t);y2=sin(10*t);
y12=sin(t).*sin(10*t);
subplot(2,2,1)
plot(t,y1);
axis([0,pi,-1,1])
subplot(2,2,2)   %注意:绘图的时候是按照行来排列1234的
plot(t,y2)
axis([0,pi,-1,1])
subplot(2,2,[3 4])
plot(t,y12,'b-',t,[y1,-y1],'r:')
axis([0,pi,-1,1])
% subplot('position',[0.2,0.05,0.6,0.45])    
% 整个窗口左下角是(0,0),绘图的图片起点是(0.2,0.05)的位置
% 0.6表示的是宽度(即横轴长度),0.45表示的是长度(即纵轴长度)

5、二维图形

(1)双轴对数图形
>>  x = logspace(-1,2);       %  生成50个等对数间距的坐标
loglog(x,exp(x),'-s')
grid on

(2)条形图
>> Y = round(rand(5,3)*10);	%随机产生一个5×3矩阵,每个元素为1-10之间的整数
subplot(2,2,1)       		%设定绘图区域,在图形对象的左上角绘制
bar(Y,'group')       		%绘制纵向条形图
title 'Group'        		%添加标题Group
subplot(2,2,2)       		%在图形对象的右上角绘制
bar(Y,'stack')
title 'Stack'
subplot(2,2,3)       		%在图形对象的左下角绘制
barh(Y,'stack')      		%绘制横向条形图
title 'Stack'
subplot(2,2,4)       		%在图形对象的右下角绘制
bar(Y,7.5)
title 'Width = 7.5'

(3)区域图
>> figure    %先画1312,然后画5256,向上叠加
Y = [1, 5, 3;
     3, 2, 7;
     1, 5, 3;
     2, 6, 1];
area(Y)
grid on
set(gca,'Layer','top') % 将图纸的背景放到所画的图像的顶层
title 'Stacked Area Plot'      	%  图名

(4)饼形图
1)单个饼形图
>> X = [1 3 0.5 2.5 2];
pie(X)

>> explode = [0 1 0 1 0];
pie(X,explode)

>> figure
X = 1:3;
labels = {'Taxes','Expenses','Profit'};
pie(X,labels)

2)两个饼形图
>> X = [0.2 0.4 0.4];
labels = {'Taxes','Expenses','Profit'};
ax1 = subplot(1,2,1);
pie(ax1,X,labels)
title(ax1,'2012');

Y = [0.24 0.46 0.3];
ax2 = subplot(1,2,2);
pie(ax2,Y,labels)
title(ax2,'2013');

(5)直方图
>> figure
x = -4:0.1:4;
y = randn(10000,1);  %生成一组符合正态分布的数
histogram(y,x)   %绘制直方图

(6)stem杆图
>> figure
t = linspace(-2*pi,2*pi,10);         %  创建10个位于-2*pi到2*pi之间的等间隔的数
h = stem(t,cos(t),'fill','--');       %  以'--'绘制离散数据图,fill表示给蓝色圆圈填充上颜色
set(get(h,'BaseLine'),'LineStyle',':')  % 改变基准线的线型
set(h,'MarkerFaceColor','red')          % 填充的内容为红色

(7)阶跃图形
 x = linspace(-2*pi,2*pi,40); %  创建40个位于-2*pi到2*pi之间的等间隔的数
stairs(x,sin(x))                %  绘制正弦曲线的二维阶跃图形

(8)误差图
>> % 误差相同情况
x = 1:10:100;
y = [20 30 45 40 60 65 80 75 95 90];
err = 8*ones(size(y));
errorbar(x,y,err)

>> % 误差变化情况
x = 1:10:100;
y = [20 30 45 40 60 65 80 75 95 90]; 
err = [5 8 2 9 3 3 8 3 9 3];
errorbar(x,y,err)

>> % 水平方向误差
x = 1:10:100;
y = [20 30 45 40 60 65 80 75 95 90];
err = [1 3 5 3 5 3 6 4 3 3];
errorbar(x,y,err,'horizontal')

>> % 双方向误差
x = 1:10:100;
y = [20 30 45 40 60 65 80 75 95 90];
err = [4 3 5 3 5 3 6 4 3 3];
errorbar(x,y,err,'both')

>> % 双方向误差,没有线情况
x = 1:10:100;
y = [20 30 45 40 60 65 80 75 95 90];
err = [4 3 5 3 5 3 6 4 3 3];
errorbar(x,y,err,'both','o')

(9)极坐标图
>> theta = 0:0.01:2*pi;  %角度
rho = sin(2*theta).*cos(2*theta);
polarplot(theta,rho)

6、三维图形

(1)三维曲线图
>> t = 0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
grid on
axis square

(2)绘制函数的网格图
>> x=-4:.2:4;y=x;   % x:1*41  y:1*41
[X,Y]=meshgrid(x,y);  % X:41*41重复41行  Y:41*41 重复41列,将一维数据生成网格数据
Z=X.^2+Y.^2;   %点乘,计算的是相对应的元素之间的计算 
mesh(X,Y,Z)  %绘制网格图

(3)绘制peaks函数的三维网格图及其在底面投影的等高线图
>> [X,Y] = meshgrid(-3:.125:3);
Z = peaks(X,Y);
meshc(X,Y,Z); % 绘制网格图的同时,在底面加上等高线图
axis([-3 3 -3 3 -10 10])

(4)曲面图
>> [X,Y,Z] = peaks(30);
surfc(X,Y,Z)  %绘制曲面,加上等高线
colormap hsv  %设置颜色
axis([-3 3 -3 3 -10 10])

(5)三维柱状图
>> X=rand(5,5)*10;  %  产生5×5矩阵,其中每个元素为1~10之间的随机数
subplot(221),bar3(X,'detached'),title('detached');
subplot(222),bar3(X,'grouped'),title('grouped');
subplot(223),bar3h(X,'stacked'),title('stacked');
subplot(224),bar3h(X,'detached'),title('detached');

三维柱状图可能看起来更好看,但是会挡住后面数据的展示

(6)三维球体图
>> figure
subplot(2,2,1)
sphere(8)            %  括号中的数字指生成球体的面数,这里是指8×8
axis equal
subplot(2,2,2)
sphere(16)
axis equal
subplot(2,2,3)
sphere(24)
axis equal
subplot(2,2,4)
sphere(32)
axis equal

(7)三维饼形图
>> figure
x = 1:3;
labels = {'Taxes','Expenses','Profit'};
    
explode=[0 1 0 ]   %  突出显示向量x的第二个元素
pie3(x,explode,labels)

explode =

     0     1     0

(8)三维等高线图
>> [X,Y] = meshgrid([-2:.25:2]);   	%  生成维数相同的两个矩阵X,Y
Z = X.*exp(-X.^2-Y.^2);
contour3(X,Y,Z,40)           		%  绘制Z的等高线,40为等高线的数目
surface(X,Y,Z,'EdgeColor',[.8 .8 .8],'FaceColor','none')	%  绘制表面图
grid off                     								%  去掉网格线
view(-15,25)                								%  设定视角
colormap cool               								%  建立颜色图

(9)三维切片图

绘制x,y,z在 [-2,2]范围内的函数的分布(此时有四个维度,切出一个面来展示)

>> figure
[x,y,z] = meshgrid(-2:.2:2,-2:.25:2,-2:.16:2);
v = x.*exp(-x.^2-y.^2-z.^2);
xslice = [-1.2,.8,2]; 
yslice = 2; 
zslice = [-2,0];
slice(x,y,z,v,xslice,yslice,zslice)
colormap hsv

(10)三维直方图
>> figure
x = randn(10000,1);
y = randn(10000,1);
h = histogram2(x,y)

h = 

  Histogram2 - 属性:

             Data: [10000×2 double]
           Values: [28×26 double]
          NumBins: [28 26]
        XBinEdges: [1×29 double]
        YBinEdges: [1×27 double]
         BinWidth: [0.3000 0.3000]
    Normalization: 'count'
        FaceColor: 'auto'
        EdgeColor: [0.1500 0.1500 0.1500]

  显示 所有属性

(11)视点控制
>> [X,Y,Z] = peaks(30);  
subplot(121),surf(X,Y,Z)
view(3)                         %  默认的三维视角
subplot(122),surfc(X,Y,Z)
view(30,60) % 和x轴夹角为30度,和y轴夹角为60度

(12)光照控制
>> figure
[X,Y,Z] = peaks(30);
surfc(X,Y,Z)
colormap hsv
axis([-3 3 -3 3 -10 10])
light('Position',[-20,20,5])      %  光照控制,数字指的是角度

第2节 图形句柄(handle)

1、图形对象基本概念

Matlab的图形系统是面向对象的,图形对象之间的关系为父代与子代的关系。

MATLAB图形对象包括:

每个图形对象都拥有自己的句柄 ( handle )。所有能创建图形对象的matlab函数都可给出所创建图形对象的句柄。
Root 是关联计算机屏幕的一个图形对象。Matlab系统只有一个Root对象,它没有父对象,子对象是Figure。当启动Matlab时,Root对象就创建,用户无法再创建一个Root,也无法删除这个对象。

图形对象举例:

>> plot(rand(5))   %生成五条任意的折线
>> ax = gca  %返回当前轴对象的句柄

ax = 

  Axes - 属性:

             XLim: [1 5]           % x轴范围
             YLim: [0 1]
           XScale: 'linear'        %线型
           YScale: 'linear'
    GridLineStyle: '-'
         Position: [0.1300 0.1100 0.7750 0.8150]      %(0,0)位置,宽度以及高度
            Units: 'normalized'       % 单位:归一化
            
>> ax.Children   %查看子对象

ans = 

  5×1 Line 数组:

  Line
  Line
  Line
  Line
  Line
  
>> ax.Parent   %查看父对象

ans = 

  Figure (1) - 属性:

      Number: 1
        Name: ''
       Color: [0.9400 0.9400 0.9400]
    Position: [403 246 560 420]
       Units: 'pixels'    %单位:像素
       
>> af=gcf  %返回当前窗口对象的句柄

af = 

  Figure (1) - 属性:

      Number: 1
        Name: ''
       Color: [0.9400 0.9400 0.9400]
    Position: [403 246 560 420]
       Units: 'pixels'    
       
>> af.Parent  % 即根对象:显示器的屏幕

ans = 

  Graphics Root - 属性:

          CurrentFigure: [1×1 Figure]
    ScreenPixelsPerInch: 96
             ScreenSize: [1 1 1366 768]
       MonitorPositions: [1 1 1366 768]
                  Units: 'pixels'       

还可以指定父对象,比如上面图中可以将画的线组成一个群组对象

>> close all
>> clear
>> figure
>> hg = hggroup;  
>> plot(rand(5),'Parent',hg)
>> ax = gca

ax = 

  Axes - 属性:

             XLim: [1 5]
             YLim: [0 1]
           XScale: 'linear'
           YScale: 'linear'
    GridLineStyle: '-'
         Position: [0.1300 0.1100 0.7750 0.8150]
            Units: 'normalized'

  显示 所有属性

>> ax.Children

ans = 

  Group - 属性:

    Children: [5×1 Line]
     Visible: 'on'
     HitTest: 'on'

  显示 所有属性

>> ax.Children.Children

ans = 

  5×1 Line 数组:

  Line
  Line
  Line
  Line
  Line

MATLAB在用户调用绘图命令时总会创建一个轴和图形对象。在用户创建一个图形M文件的时候,尤其是别人在使用用户创建的程序时,最好使用命令来设置轴和图形对象。进行此设置可以解决如下两个问题。

(1)用户的M文件绘制的图形覆盖了当前图形窗口(用户单击图形窗口,该窗口就会变为当前窗口)。

(2)当前图形或许处于一种意外的状态,并没有像程序设置的那样显示。
专用函数

gcf 返回当前窗口对象的句柄 Get Current Figure
gca 返回当前轴对象的句柄 Get Current Axes
gco 返回当前图形对象的句柄 Get Current Object

句柄属性的设置与修改

get 获得句柄图形对象的属性和返回某些对象的句柄值
set 改变图形对象的属性
delete(h) 删除句柄为h的图形对象
直接通过属性赋值来修改
>> get(0)  %% 获取显示器属性
         CallbackObject: [0×0 GraphicsPlaceholder]
               Children: [1×1 Figure]
          CurrentFigure: [1×1 Figure]
     FixedWidthFontName: 'SimHei'
       HandleVisibility: 'on'
       MonitorPositions: [1 1 1366 768]
                 Parent: [0×0 GraphicsPlaceholder]
        PointerLocation: [390 57]
            ScreenDepth: 32
    ScreenPixelsPerInch: 96
             ScreenSize: [1 1 1366 768]
      ShowHiddenHandles: 'off'
                    Tag: ''
                   Type: 'root'
                  Units: 'pixels'
               UserData: []
               
>> set(gca,'YAxisLocation','right')  %将轴对象的Y轴改到右边


>> plot(rand(5))
ax = gca
>> ax.YAxisLocation='left'
>> ax.YAxisLocation='Right'

2、图形窗口设置

(1)图像窗口(Figure)

Figure对象是Matlab系统中显示的图形窗口。用户可建立任意多个Figure窗口。所有Figure对象的父对象都是Root对象,而其他所有Matlab图形对象都是Figure的子对象。

  • figure( ) 创建图形窗口
  • close( ) 删除图形窗口
  • clf( ) 图形图形窗口中的子对象
  • gcf 返回当前窗口对象的句柄
(2)创建图形窗口 :figure
  • figure 利用缺省属性值

相关文章