前言和目录
预留坑位
此为笔记文档
这里会记下一些没有填上的坑
patch
属性是什么属性是什么
二维和三维的隐函数怎么表示
子级和父级是什么
特殊的数据可视化方法,如heatmap、imagesc
元胞
多文件编程设计
syms
、函数句柄
是什么
阅读注意
-
里面百度文库的链接需要打开flash再进入
-
本文使用的Matlab版本是R2019a,可能有的高阶功能不向下兼容,需要自行查阅资料
-
pdf版建议打开pdf的目录功能,
markdown
转pdf
的时候会自动根据标题生成目录 -
在CSDN的版本由于图片转存太麻烦有的部分原本有图的我就没上传,但是大体不影响阅读,我会留下外网链接,里面将是pdf版
-
不保证正确!如果发现错误请联系本人,本人将在更新过程中改正!
-
本人ID:
GitHub:BJTU-ChrisLeeCSDN: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逻辑运算符号中:
- 等于/不等于:
==
、~=
- 且/或:
&&
、||
,这两者均有短路机制 - 非:
~
- 还有一种逐位运算的逻辑运算符,将在矩阵的运算部分内容中说到
- 等于/不等于:
遇到不知道的怎么办?
- 百度
面向百度的Matlab编程 - 对于看不懂的函数,输入
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
指的是从a
到b
,步长为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
这里
A
、B
维度不同也没事,具体为什么请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=B
的x
注意
A
、B
的列数要一致A/B(1,1:end) ans = 0.3333 0.5000 0.5000
-
求解
A
、B
中元素逐个相除的结果注意数值输入
A
和B
必须具有相同的大小或兼容的大小,例如,A
是M*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数组
下面的讨论针对
A
、B
矩阵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*N
向量)中的线形索引就是指下标(从1开始,与C语言不通) -
字符串的逻辑运算:与矩阵一样,因为实际上字符串就是
1*length
的矩阵str=='T' ans = 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
-
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
解释一下,这里实际上发生的是:
str>='A'
和str<='Z'
分别操作,返回两个logical
向量- 两个返回的向量按位取且,即得到新的向量,只有两个向量的某个同时取1时,新的向量那个位置才为1
find
函数找到新的向量中的1并且返回下标向量给pos
- 如果
-
转换
这里实际上是部分元素减法,与部分矩阵减法是一样的
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
和一个double
的mat
- 另外,实际上可以点击左边文件后在界面的上方找到生成函数。。。
- 关于
table
属性:这里有详细介绍
简单的写入方法
- 向excel中写入:
xlswrite
,具体怎么做help xlswrite
,注意有时候会拉出.csv文件,即使已经有且指定了.xlsx文件了,并且会覆盖原文件 - 怎么从多张表中读取数据后写入一张表:
怎么做二维数据可视化?
plot
的使用和基础知识
即给出点的数据,怎么用坐标轴的形式显示出来
-
运用
plot
画出简单函数以下面一连串代码为例,将会实现
- 设置
x
和y
向量来表示函数取点 - 设置曲线属性的方法
hold on
来在一张图上画函数- 标注图名和
x
、y
坐标 - 怎么在一个figure里画多张图
定义
x
、y
,在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 x2−y4=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)
-
semilogy
、semologx
和loglog
绘制对数坐标的图和
plot
几乎一样,不再赘述,有需要help cmd
-
plotyy
双y坐标绘图与
plot
还是基本上一样,有需要help plotyy
-
双坐标轴绘图
三维绘面
图源自《matlab:从入门到精通》
分割平面上的点
一般使用meshgrid
去分割点,与linspace
作用一致(虽然实际上可以不用linspace
去分割)。根据help meshgrid
的提示,实际上[X,Y] = meshgrid(v)
作用是X
是一个矩阵,每一行是V
的一个副本;Y
也是一个矩阵,每一列是 V
的一个副本
这么分布可以让其他元素和x
、y
一一对应,在后面一个例子中会体现这么做的用处
三维绘图函数
常用的有四种: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绘图页已经给出了一些图的样子了,可以用那个做参考
- 条形图:
bar
、bar3
- 面积图:
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
-
火柴杆图:
stem
、stem3
-
阶梯图:
stairs
-
罗盘图:
compass
-
羽毛图:
feather
-
箭头图:
quiver
、quiver3
过渡内容
部分名词解释
函数句柄、匿名函数和sym
属性
来源:
顺便,说一下英文
- 函数句柄:
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 x
、clear a
也不会失效,所以和x
、y
和a
本身没关系 -
而匿名函数则可以看作一个
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}