Matlab经验集

本文档详细介绍了Matlab的使用,从基础操作到高级数学应用,包括矩阵操作、字符串处理、数据可视化和高级数学函数。涵盖了如何不显示结果、多行输入、数据读写、矩阵运算、字符串处理、二维和三维数据可视化等核心知识点,是Matlab初学者的全面教程。
摘要由CSDN通过智能技术生成

前言和目录

预留坑位

此为笔记文档

这里会记下一些没有填上的坑

  • patch属性是什么

  • 属性是什么

  • 二维和三维的隐函数怎么表示

  • 子级和父级是什么

  • 特殊的数据可视化方法,如heatmap、imagesc

  • 元胞

  • 多文件编程设计

  • syms函数句柄是什么

阅读注意

  • 里面百度文库的链接需要打开flash再进入

  • 本文使用的Matlab版本是R2019a,可能有的高阶功能不向下兼容,需要自行查阅资料

  • pdf版建议打开pdf的目录功能,markdownpdf的时候会自动根据标题生成目录

  • 在CSDN的版本由于图片转存太麻烦有的部分原本有图的我就没上传,但是大体不影响阅读,我会留下外网链接,里面将是pdf版

  • 不保证正确!如果发现错误请联系本人,本人将在更新过程中改正!

  • 本人ID:
    GitHub:BJTU-ChrisLee

    CSDN:BJTU_Chris_Lee

  • 预计之后会持续在CSDN更新,每次更新都会直接改一整篇文章(本文本质是个人的学习笔记),所以请跟进关注

  • 转载之类的请注明出处(个人CSDN的ID等),另外见版权声明部分


Matlab使用入门

基础操作

  • 怎么注释?
%...
%{
%}

怎么不每次显示结果?

在行末加上 ;

怎么多行输入?

用连行符 ...,不过字符串似乎不支持多行输入

怎么开新界面窗口?

figure函数 相关资料

disp函数可以简单发送信息

怎么关闭所有窗口/重置所有变量/清屏?

clear close函数 clear close等的用法

怎么暂停程序?

pause类函数 pause类用法

注意只有在操作端左边显示>>的时候才能输入

如果想要在编写代码的时候就确定一个调试点,可以设置一个keyboard函数,它允许程序暂停的同时进行值的调整

怎么从用户获得输入?

input函数:

v1=input('提示性语句:');
%如果想要在input里加上变量的话可以采用下面的方式
v2=input([str1,num2str(v3),str2]);%同样适用于`disp`函数
%即字符串在Matlab中是特殊处理的
%也可以结合disp:
disp([str1,num2str(v3),str]);
v4=input('')%不能缺失 ''

注意,所有的输入和声明赋值操作是一样的,具体见矩阵和字符串中相关内容

从文件输入方法在后面提及

全局变量怎么使用?

% in 'a.m':
global a;
a=0;
% to use a in 'b.m':
global a;

为什么看到很多函数原形带有字符串?

比如:

plot(x,y,'--gs','LineWidth',2,'MarkerSize',10,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]);

(该语句来自于plot的技术文档)

实际上可以类比C语言读文件时候的'rb'等控制符,为了易读,将可以更改的命令都做成了字符串,以便很明了地更改属性

有哪些需要特别注意的点?

  • Matlab所有的下标都是1开始索引的
  • Matlab中的字符串使用单引号包起来
  • Matlab中的Mat(矩阵)是重点,几乎所有操作都是以矩阵作为基础的
  • Matlab中char指字符串
  • Matlab中如果想一行输入多个变量需要使用空格分割,,表示的是一行多个表达式
  • Matlab逻辑运算符号中:
    • 等于/不等于:==~=
    • 且/或:&&||,这两者均有短路机制
    • 非:~
    • 还有一种逐位运算的逻辑运算符,将在矩阵的运算部分内容中说到

遇到不知道的怎么办?

  1. 百度 面向百度的Matlab编程
  2. 对于看不懂的函数,输入help cmd查看官方帮助文档(实际上本文很多东西都是直接help来的

两大数据结构——矩阵和字符串

矩阵有哪些操作?

矩阵的输入和声明

直接声明

A=[1,2,3;2,3,4]
A = 
     1     2     3
     2     3     4

从用户获得输入,注意,输入格式与在代码中输入是一样的

A=input('input A:')
%input
[1,2,3;...
2,3,4]
%end of input
A = 
     2     3     4
     2     4     5

注意,下列方法获得的也是个向量/矩阵,这对理解Matlab怎么操作函数有很重要的意义

A=1:2:5
A = 
     1     3     5
A=1:3:5
A = 
     1     4
A=1:3
A = 
     1     2     3
A=[1:2:5,1:3:5]
A = 
     1     3     5     1     4
A=[[1:2:5]',[1:3:7]']%'是转置,这里涉及了子矩阵的组合,见‘重构矩阵的方法’一节
A = 
     1     1
     3     4
     5     7
A=input('input A:')
%input
1:1:3
%end of input
A = 
     1     2     3

可以猜测,实际上a:step:b指的是从ab,步长为step的向量,也可以知道这种向量和[1,2,3]这种向量并没有不同之处,这很重要!直接关系能不能正确理解后面的函数!

获取矩阵信息的函数
  • 获得行列数

    [rows,cols]=size(A);
    szA=size(A);%szA是一个二维行向量
    maxrc=length(A);%各个维度的元素数的最大值(2*3*4的三维矩阵即4)
    
  • 获得维度,注意维度类比是x、y坐标的意思

    dimA=ndims(A);
    
  • 获得非0元素个数

    cnt_nzero=nnz(A);
    
  • 声明矩阵的常用方法

    sz是指一个n维向量代表每个维度的元素数

    A=ones(sz);%全为1的矩阵
    B=zeros(sz);%全为0的矩阵
    C=rand(sz);%产生在(0,1)区间均匀分布的随机阵
    D=eye(sz);%产生单位阵
    E=randn(sz)%产生均值为0,方差为1的标准正态分布随机矩阵
    

    特殊矩阵 见链接中的 二-3

  • 线性索引和坐标的转化

    这在位运算中会涉及到,这里只是介绍

    摘抄自此

    可以使用单个下标A(k) 表示matlab矩阵中的元素,MATLAB不会以矩阵和数组在MATLAB命令行窗口中的显示形状存储矩阵和数组,而是会将矩阵和数组存储为单个元素列。这种单个列由矩阵中的所有列组成,没一列都附加到最后一列。

    因此,矩阵 A

    A = [2 6 9; 4 2 8; 3 5 1]
    A =
        2     6     9
        4     2     8
        3     5     1
    

    实际上是以序列形式存储在内存中:2,4,3,6,2,5,9,8,1,注意这里是按照先列后行的方式排布

    矩阵A中位于第3行,第2列的元素(值=5)也可以标识为实际存储序列中的第6个元素。要访问此元素,可以使用标准的A(3,2)语法,也可以使用A(6)。

    如果提供多个下标,Matlab将会基于分配给数组的维度计算存储列的索引。例如,假定 A 之类的二维数组的大小为 [d1 d2],其中 d1 表示数组中的行数,d2 表示列数。如果提供两个表示行-列索引的下标 (i, j),则偏移为

    (j-1) * d1 + i
    

    给定表达式 A(3,2),MATLAB 会将 A 的存储列的偏移计算为 (2-1) * 3 + 3,即 6。从头开始数六个元素即会到达值 5

    主要运用的就是find函数,所以只对find函数简要介绍

    find(x)返回一个包含数组 X 中每个非零元素的线形索引的向量

    A=[1,0,3;0,4,0;5,0,6]
    (find(A))' %转置是为了看起来方便些
    ans = 
         1     3     5     7     9
    (find(A<3))'%这里涉及了矩阵的位运算
    ans =
         1     2     4     6     8
    

    这里也可以看出Matlab优先处理列向量

重构矩阵的方法
  • 直接提取法

    行的范围:row_a->row_b,列的范围:col_a->col_b

    sonA=A(row_a:row_b,col_a:col_b)
    

    如果想要提取全部行/列的话

    sonA=A(row_a:row_b,:)%获得了A的row_a->row_b行的全部列
    

    如果不知道具体多少行/列也不想多用变量的话

    sonA=A(row_a:row_b,col_a:end)
    

    如果你想的话,甚至可以从row_b->row_a翻转矩阵

    son_rev_A=A(row_b:-1:row_a,1:end)
    %获得A全部列调转row_a->row_b行之后的矩阵,这里也可以猜出A(:,:)格式的本质是什么
    

    还记得吗,a:step:b实际上是一种向量,所以下面的方法获得矩阵也是可以的

    这里pos使用的是线性索引

    A=[1,0,3;0,4,0;5,0,6];
    pos=[1,2;3,4]
    A(pos)
    ans = 
         1     0
         5     0
    pos=[1:2:3;2,5]
    A(pos)
    ans = 
         1     5
         0     4
    

    可以猜测直接提取法的本质:

    A(B)将返回与B大小一致的矩阵,其中的元素为B上每一个位置对应的线性索引对应的A的值

  • reshape函数

    目测不是很好用,如果上面的方法无法满足需求时可以 点击这个链接 了解具体怎么用,当然,也可以help reshape

  • 组合矩阵法

    获得A,B构成的矩阵,这里的例子要求A的行数与B的行数一致(与数学上的分块的要求一样)

    C=[A(1:2,1),B(1:2,:)]
    
矩阵的简单操作函数

只记录几个常用的,其他如求上三角、求转置、翻转等 参阅这个链接

  • 取整函数fix ceil floor

    %fix将X的每个元素朝零方向四舍五入为最近的整数
    A=fix(10*rand(1,10));%产生1*10的每个元素均为0-9之间随机整数的矩阵
    %ceil将X的每个元素四舍五入到大于或等于该元素的最接近整数
    %floor将X的每个元素四舍五入到小于或等于该元素的最接近整数
    
  • 计算矩阵的秩/行列式/特征值/迹/逆等

    r=rank(A);%矩阵的秩
    d=det(A);%矩阵的行列式
    v=eig(A);%矩阵的特征值,这里的v是一个列向量
    t=trace(A);%矩阵的迹,这里A必须是方阵
    A=inv(A);%矩阵的逆
    

    需要查找其他的求值函数(如求约化阶梯阵)时可以百度和help cmd

  • 求矩阵的转置

    B=A'
    B=A.'
    

    两者的在涉及复数时的区别请参阅help '

  • 求对角线元素

    与求迹不同,这里不需要A是方阵,会逐个取 A(i,i) 元素

    B=diag(A)
    
矩阵的运算

注意,matlab几乎一切皆矩阵,所以矩阵的运算会伴随使用Matlab的全过程,一定要思考每一个函数与矩阵是否有关系

求单个矩阵部分/整体的和/均值/最大值

A=[1,2,3;4,5,6;7,8,9]为例,不考虑多维数组,需要讨论多维数组的情况请help cmd

  • sum和max

    对于向量,[num,index]=max(A)返回元素最大值和下标

    %A=[1,2,3,4,5]
    [num,index]=max(A(1:end,1))
    num =
         1
    index =
         1
    

    对于矩阵,直接看代码

    %A=[1,2,3;4,5,2;3,3,4]
    [y,u]=max(A)
    y =
         4     5     4
    u =
         2     2     3
    [y,u]=max(A,2)
    
    

    对于矩阵,sum(A) 将返回包含每列总和的行向量

    sum(A)
    ans = 
    		12 		15 		18
    

    如果想要部分区域的,可以提取矩阵再求和

    sum(A(1:2,2:end))
    ans = 
    	7 		9
    

    如果想要全部的,可以sum(sum())

    sum(A(1:2,2:end))
    ans = 
    	16
    

    实际上是一个复合过程

  • mean求均值

    对于向量,mean(A) 返回元素均值

    mean(A(1:end,1))
    ans = 
    	4
    

    对于矩阵,mean(A) 返回包含每列均值的行向量

    这里不再demo,与sum函数类似

求多个矩阵的和/差/积/

这里有很多复杂的小点,比如很多数学上不支持的运算是有结果的,遇到疑问请help cmd

A=[1,1,2;2,3,4;3,4,5]B=[-1,-1,2;1,2,3;2,3,4] 为例

  • 计算A*B

    注意要满足矩阵相乘的法则,即A_rows==B_cols

    A*B
    ans = 
         4     7    13
         9    16    29
        11    20    38
    
  • 计算A-B

    这里AB维度不同也没事,具体为什么请help -

    A-B
    ans = 
         2     2     0
         1     1     1
         1     1     1
     
    A(1:2,1)-B(1,1:2)
    ans = 
         2     2
         3     3
    

    注意,也可以对部分元素相减的

    A(1:3)=B(1:3)-1%这里用的是线性索引
    A = 
        -2     1     2
         0     3     4
         1     4     5
    
  • 求解线性方程组x*A=Bx

    注意AB的列数要一致

    A/B(1,1:end)
    ans = 
        0.3333
        0.5000
        0.5000
    
  • 求解AB中元素逐个相除的结果

    注意数值输入AB必须具有相同的大小或兼容的大小,例如,AM*N 矩阵,B是标量或 1*N 行向量,具体请help ./

    A./B
    ans = 
       -1.0000   -1.0000    1.0000
        2.0000    1.5000    1.3333
        1.5000    1.3333    1.2500
    
    A
    ans = 
         1     1     2
         2     3     4
         3     4     5
    B(1,1:end)
    ans = 
        -1    -1     2
    A./B(1,1:end)
    ans = 
       -1.0000   -1.0000    1.0000
       -2.0000   -3.0000    2.0000
       -3.0000   -4.0000    2.5000
    

    其他类型除法可以help / 后根据提示的内容查阅

  • 矩阵的逻辑运算

    注意,没有要求行列相同,返回的都是logical数组

    下面的讨论针对AB矩阵

    A=[1,2,3;0,4,0;5,0,6]
    B=[0,1,0;3,3,5;0,6,4]
    
    • 按位取且:都不为0则返回1

      A&B
      ans = 
         0   1   0
         0   1   0
         0   0   1
      
    • 按位取或:只要有一个不为0就取1

      A|B
      ans = 
         1   1   1
         1   1   1
         1   1   1
      
    • 按位逐个取异或:均为0/均不为0-取0,一个为0一个不为0-取1

      xor(A,B)
      ans = 
         1   0   1
         1   0   1
         1   1   0
      
    • 按位比较:即矩阵的大小关系是指各个元素的大小关系

      A<3
      ans = 
         1   1   0
         1   0   1
         0   1   0
      
    • 其他的逻辑运算可以help &来查找,关于logical数组也直接help logical了解,不详细介绍

Matlab是怎么处理字符串的?

在MATLAB中,字符串是用单撇号括起来的字符序列。MATLAB将字符串当作一个行向量,每个元素对应一个字符,其标识方法和数值向量相同。也可以建立多行字符串矩阵。字符串是以ASCII码形式存储的。abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵。相反,char函数可以把ASCII码矩阵转换为字符串矩阵。与字符串有关的另一个重要函数是eval,其调用格式为: eval_r(t) 其中t为字符串。它的作用是把字符串的内容作为对应的MATLAB语句来执行

以上引用自 链接文章第五点 ,下就常用函数和基础功能进行介绍

字符串的声明和输入

声明和从用户获得输入,与矩阵的类似,不再详细解释

str='this is test string'
str=input('input str:')
%input
'This Is Test Too'
%end of input
str = 
    'This Is Test Too'

可以通过num2str函数将数组转化成字符串:

num2str(100)
ans = 
    '2'

允许申请多维字符串

strC=['Hello';'World']
ans = 
    'Hello'
    'World'
num2str([1,2;3,4])
ans = 
    '1  2'
    '3  4'
子串和母串操作

注意将字符串看成矩阵

  • 使用小串和变量构建大串

    strA='Hello';
    strB='World';
    [strA,num2str([1,2,3]),strB]
    ans = 
        'Hello1  2  3World'
    %很蹩脚的例子,不过很能反应特点
    
  • 也可以将多维字符串连接起来

    [[strA;strB],num2str([1,2;3,4]),[strA;strB]]
    ans = 
        'Hello1  2Hello'
        'World3  4World'
    
  • 获得指定下标构成的子串

    strA(1:2:5)%用的是线性索引
    ans = 
        'Hlo'
    

    当然也可以针对多维字符串取下标,将它想象成矩阵就行,但是要注意用的是线性索引

    strC=[strA;strB];
    strC([1:3:5;2:2:5])
    ans = 
        'Ho'
        'Wo'
    
字符串常用函数
  • 判断是否相等

    strcmp(s1,s2),相等返回1,不相等返回0。另外注意这与C语言中的strcmp判断字典序不一样

  • 查找子串

    strfind(str,pattern),在str中找pattern,返回的是下标索引,经过测试应该不能在多维字符串中搜索

  • 替换子串

    newStr = strrep(str,old,new),将 str 中出现的所有 old 都替换为 new

  • eval函数可以执行字符串中的命令

  • 其他的函数参见:前人总结的链接

应用举例

str='This Is Test Too'为例

  • 获得反串

    str(1,end:-1:1)
    ans = 
        'ooT tseT sI sihT'
    

    从中,结合前面 ‘重构矩阵的方法’ 可以看出,字符串就是一个1*N的向量,这点与C语言处理方式很像

  • 查找大写字母并转换成小写

    1. 线性索引:字符串(1*N向量)中的线形索引就是指下标(从1开始,与C语言不通)

    2. 字符串的逻辑运算:与矩阵一样,因为实际上字符串就是1*length的矩阵

      str=='T'
      ans = 
         1   0   0   0   0   0   0   0   1   0   0   0   0   1   0   0
      
    3. find函数

      help find中提到,find(x)返回一个数组 X 中每个非零元素的线性索引的向量,与矩阵中的类似

      由于根据help find

      • 如果 X 为向量,则 find 返回方向与 X 相同的向量
      • 如果 X 为多维数组,则 find 返回由结果的线性索引组成的列向量
      • 如果 X 不包含非零元素或为空,则 find 返回一个空数组

      在字符串处理中,find(x)将返回一个行向量

      find(str=='T')
      ans = 
           1     9    14
      

      在上一点中可以看到,只有这三个线性索引对应位置str的值是‘T’

      所以想要找到str中的大写字母下标就很简单了

      pos=find(str>='A' & str<='Z')%这里的&就是逐位取和了
      pos = 
           1     6     9    14
      

      解释一下,这里实际上发生的是:

      1. str>='A'str<='Z'分别操作,返回两个logical向量
      2. 两个返回的向量按位取且,即得到新的向量,只有两个向量的某个同时取1时,新的向量那个位置才为1
      3. find函数找到新的向量中的1并且返回下标向量给pos
    4. 转换

      这里实际上是部分元素减法,与部分矩阵减法是一样的

      str(pos)=str(pos)-'A'+'a' %Matlab中用的也是ASCII码
      

初级数据可视化

怎么从excel、txt文件中提取信息/向文件中输出信息,以及注意事项

简单的读取法则
  • 从excel中提取:xlsread(filename),涉及提取部分/涉及中文/等问题时,help xlsread
  • 从txt中提取:importdata(filename),同样,涉及问题时help inportdata,值得注意的是,从txt中提取文件时可以指定分隔符,也可以由系统猜测(并输出)分隔符
  • 向excel写入:xlswrite(filename,mat),使用时help xlswrite
涉及复杂表格读取时
  • 从excel中同时提取字符串和数字:importdata,会产生一个cell属性的textdata和一个doublemat
  • 另外,实际上可以点击左边文件后在界面的上方找到生成函数。。。
  • 关于table属性:这里有详细介绍
简单的写入方法
  • 向excel中写入:xlswrite,具体怎么做help xlswrite,注意有时候会拉出.csv文件,即使已经有且指定了.xlsx文件了,并且会覆盖原文件
  • 怎么从多张表中读取数据后写入一张表:

怎么做二维数据可视化?

plot的使用和基础知识

即给出点的数据,怎么用坐标轴的形式显示出来

  • 运用plot画出简单函数

    以下面一连串代码为例,将会实现

    • 设置xy向量来表示函数取点
    • 设置曲线属性的方法
    • hold on来在一张图上画函数
    • 标注图名和xy坐标
    • 怎么在一个figure里画多张图

    定义xy,在Matlab中的函数实际上都是用点画出来的

    注意,这里sin(x) cos(x) tan(x)得到的实际上是一个矩阵,矩阵元素逐一相乘必须用.*

    而画图实际上就是把x对应y变成点在图上画出

    x1=linespace(-2*pi,2*pi);
    y1=sin(x).*cos(x);
    x2=linespace(-2*pi,2*pi);
    y2=sin(x).*tan(x);
    

    一个函数画两条线,这里的fg1是一个line数据

    如果想要知道更多关于fg1可以设置的东西,如每隔多少数据标点,颜色,打星等等,可以help line点击line属性解决

    fg1=plot(x1,y1,x2,y2)
    fg1(1).LineWidth=2;
    fg1(2).Marker='*';
    

    使用下面的语句也可以达到同样的效果,但是注意,需要标注时plot只能画一条线

    fg1=plot(x1,y1,'LineWidth',2)
    hold on;
    fg2=plot(x2,y2,'Marker','*')
    hold off;%别忘了hold off
    

    下面的函数可以标注图,经测试,对以上两种方法都适用

    xlabel('x轴')
    ylabel('y轴')
    title('TEST')
    grid on;%显示单元格
    

    如果想要画分图的话,需要用到subplot函数,以下案例来自help plot

    ax1 = subplot(2,1,1);% top subplot
    plot(ax1,x1,y1)
    title(ax1,'TOP')
    ylabel(ax1,'sinx*cosx')
    ax2 = subplot(2,1,2);% bottom subplot
    plot(ax2,x2,y2)
    title(ax2,'Bottom Subplot')
    ylabel(ax2,'sinx*tanx')
    

    当然,也可以通过获得plot返回值的方法改变曲线特性,这里就不赘述了

  • 参数方程画法

    这里选择圆 $(x-1)2+(y-3)2=4 $ 来做图

    圆的方程可以写成:$\begin{cases}x=2\cos t\ +1&\ y=2\sin t\ +3&\end{cases} $ ,根据plot实际上就是一个个点连起来的思想,可以如下编写:

    t=linspace(0,2*pi);
    x=2*cos(t)+1;
    y=2*sin(t)+3;
    plot(x,y)
    

    画出来的圆有点扁,可以通过axis equal让沿每个坐标方向使用相等的数据单位

  • 分段函数画法

    可以利用hold on来画

    例如,如果要画$\begin{cases}e^{x}&-3<x<0\ \cos x&0<x<3\end{cases} $

    x1=linspace(-3,0);
    y1=exp(x1);%注意matlab没有自然对数e,如果真的需要请用exp(1)表示
    plot(x1,y1,'b')
    hold on;
    x2=linspace(0,3);
    y2=cos(x2);
    plot(x2,y2,'b')
    hold off;
    grid on;
    

    理论上可以把y分成两份对应,不过过于复杂了就不演示了

    后面会介绍更好的画法

  • 奇奇怪怪的技巧

    • plot([x1;x2],[y1;y2])可以画出类似直方图的感觉
    • 备用
其他的plot类函数
  • fplot精确画一元函数

    以 $y=x\sin \frac{1}{x} $ 为例

    如果plot的话是不好取点的,因为这个函数在 $\lim_{x\rightarrow 0} $ 的时候是一个震荡函数,会丢失很多细节,这时使用自带的fplot函数就很有帮助了

    y=@(x)sin(1./x);
    fplot(y,[minx,miny])
    

    需要控制更多内容,如相对误差、线形

    当然用fplot画参数方程也是可以的

    x=@(t)cos(3*t);
    y=@(t)sin(2*t);
    fplot(x,y,[tmin,tmax])%对于这个曲线建议设成[0,2*pi]
    

    也可以画分段函数,还是以$\begin{cases}e^{x}&-3<x<0\ \cos x&0<x<3\end{cases} $ 为例

    fplot(@(x) exp(x),[-3 0],'b')
    hold on
    fplot(@(x) cos(x),[0 3],'b')
    hold off
    grid on
    
  • ezplot不推荐用的函数

    help ezplot界面中说

    (不推荐)易用的函数绘图函数

    那就简单看一下吧。。。

    画隐函数,以 x 2 − y 4 = 0 x^{2}-y^{4}=0 x2y4=0为例

    ezplot('x^2-y^4')
    

    不太懂为什么不建议使用

其他坐标系下的绘图

注意的点:

  • 如果使用了hold on命令,可以在同一张图中绘不同坐标系的图

  • polar绘制极坐标系下的图

    绘制$r=e^{\sin t}+2\sin 4t-\left( \cos \frac{t}{5} \right)^{6} $图像

    t=linspace(0,24*pi,100);%这里maxt越大图像越诡异。。。不管了
    r=exp(sin(t))+2*sin(4*t)-(cos(t/5)).^6;
    ax1=subplot(2,1,1);
    ax2=subplot(2,1,2);
    plot(ax1,t,r);
    polar(ax2,t,r)
    

    这里也可以利用[x,y]=pol2cart(t,r)画出在直角坐标系下的图

     [x,y]=pol2cart(t,r);
     plot(x,y)
    
  • semilogysemologxloglog绘制对数坐标的图

    plot几乎一样,不再赘述,有需要help cmd

  • plotyy双y坐标绘图

    plot还是基本上一样,有需要help plotyy

  • 双坐标轴绘图

    直接参考链接

三维绘面

图源自《matlab:从入门到精通》

分割平面上的点

一般使用meshgrid去分割点,与linspace作用一致(虽然实际上可以不用linspace去分割)。根据help meshgrid的提示,实际上[X,Y] = meshgrid(v)作用是X 是一个矩阵,每一行是V 的一个副本;Y 也是一个矩阵,每一列是 V 的一个副本

这么分布可以让其他元素和xy一一对应,在后面一个例子中会体现这么做的用处

三维绘图函数

常用的有四种:mesh surf surfc surfl

参考链接

直接看图:

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;%eps是一个精度范围,详情help eps
Z = sin(R)./R;

ax1=subplot(2,2,1);
ax2=subplot(2,2,2);
ax3=subplot(2,2,3);
ax4=subplot(2,2,4);

mesh(ax1,X,Y,Z);
surf(ax2,X,Y,Z);
surfc(ax3,X,Y,Z);
surfl(ax4,X,Y,Z);

title(ax1,'mesh');
title(ax2,'surf');
title(ax3,'surfc');
title(ax4,'surfl');

具体需求请help cmd,另外注意可以通过下面行为产生无颜色的图像

%紧接着上面的代码
shading interp;
colormap(gray);

另外对于surfl:(命令中的’l’表示这是一个光照表面 lighted surface)命令显示三维光照物体的表面,可以使用这个命令产生没有线条的三维图像

实际上这里的函数不是万能的,比如复杂的无法用$z=f\left( x,y\right) $表示的三维图形就不好表示了,具体的处理方法见后面的高级可视化

另外,这里使用的都是绘面,而plot3实际上是绘制线的!

图的标注

实际上在上个三维绘图的比较中就可以看到子图的操作方法了,这里再拓展一些,探究一下Matlab到底怎么实现控制图的信息的

subplot包含了什么,axes是什么

上面的比较代码中,我们看到先声明了ax=subplot(2,2,1);,这里解释一下:

  • subplot(m,n,p)的用法:将当前图窗划分为 m*n 网格,并在 p 位置创建笛卡尔坐标区(这里分图的顺序是先行后列)
  • ax的类型Axes有什么用:Axes 属性可控制 Axes 对象的外观和行为。通过更改属性值,您可以修改坐标区的特定方面,例如:ax.Title.String = 'My Title'; ax.Title.FontWeight = 'normal';分别改变了标题的内容和字体粗细(在help Axes中说到了如何用两行字符命名,可以查阅)

关于画子图的问题,见链接

怎么改变图中的信息

推荐使用ax.的方式访问以及更改,具体到需要改变什么的时候可以help axes点击Axes属性来了解

有时候有点函数也可以输入ax以达到指定在某个图中进行某功能的目的,例如help legend中的“在特定坐标区上添加图例”

实际上所有的图都是通过改变Axes属性来改变图的内容的,那在单个图的标注中为什么没有看到ax这种东西出现呢?(实际上只有执行ax=gca;才能看到带Axes属性的变量)因为title类似的函数默认针对gca(当前图窗的当前坐标区或图,通常是最后创建的图窗或用鼠标点击的最后一个图窗)操作,所以才不需要ax辅助。但是在子图的标注中如果通过gca就全乱套了,所以一般是通过ax控制的,也就是上面的比较代码中显示的那样

所以如果不确定,执行ax=gca来改变单图信息,以和多图情况统一

其他图形标注函数
  • 填充函数:fill(x,y,c);

    执行了感受下效果就行,具体要求help fill

    x=linspace(-2*pi,2*pi);
    y=x.*sin(x);
    fill(ax);
    
  • 图中标注函数:text(x,y,'str')

    同样,知道有这么个东西就行,用的时候直接help text查询可以更改的值

    不过要注意,建议使用text的返回值,不然可能没地方改内容

    %接上代码
    text(0,0,'<-----zero','Rotation',90);
    

    另外gtext可以直接用鼠标标注

  • 增加图例的函数:legend()

    具体参照技术文档help legend

  • help plot可以帮助了解更多细节

  • 待填坑

    目前只找到这么多,如果以后发现更多的可以更新

特殊图形

只会指明有哪些函数,并贴出示意图,具体怎么操作请help cmd

另外实际上Matlab绘图页已经给出了一些图的样子了,可以用那个做参考

  • 条形图:barbar3
  • 面积图:area
  • 饼图:pie
Y=[45 6 8;7 4 7;6 25 4;7 5 8;9 9 4;2 6 8];
%下面两个语句选择一个执行
subplot(2,2,1)
bar(Y)
title('图1')
subplot(2,2,2)
bar3(Y), title('图2')
subplot(2,2,3)
bar(Y,2.5)
title('图3')
subplot(2 , 2, 4)
bar(Y,'stack'),title('图4')

area(Y)
grid on
colormap summer
set(gca,'layer','top')
title('面积图')
  • 柱状图:hist(直角坐标下)rose(柱坐标下)

  • 误差棒图:errorbar

  • 火柴杆图:stemstem3

  • 阶梯图:stairs

  • 罗盘图:compass

  • 羽毛图:feather

  • 箭头图:quiverquiver3


过渡内容

部分名词解释

函数句柄、匿名函数和sym属性

来源:

CSDNdalao总结的匿名函数的相关

CSDNdalao总结的syms的相关

顺便,说一下英文

  • 函数句柄:funtion handle

sym类型表示的函数以及匿名函数的区别:

  • 实际上sym是一种可以看作字符串表示的函数,但是内部的变量需要先命名,并且不采用矩阵运算符表示

    syms x y
    a=1;
    z=a*(x+y)
    %{
    z =
    x + y
    %}
    ezplot(z);
    

    显示的是 x + y = 0 x+y=0 x+y=0的图像,即使后来clear xclear a也不会失效,所以和xya本身没关系

  • 而匿名函数则可以看作一个function,输入就在@()的括号里面

    y=@(x)integral(@(t)sin(t),0,x);
    fplot(y)
    y(pi)
    %{
    ans =
        2.0000
    同时显示图像
    %}
    

    这里 y = ∫ 0 x s i n t d t y=\int_{0}^{x}sint\rm{dt} y=0xsintdt,使用了两个函数句柄,实际上很多Matlab的函数都要求输入函数句柄,可以理解成C语言中的传函数指针进另一个函数

部分函数了解

  • gca见模块“图的标注-怎么改变图中的信息”

  • axis equal使笛卡尔坐标系gca坐标轴相等

  • grid on使gca显示坐标区间

  • intergral(@()f,a,b)表示 ∫ a b f d t \int_{a}^{b}f\rm{dt}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值