基本操作与矩阵操作
命令行
- 作用:输入操作命令,输出结果。
- 运算规则: 常见的四则运算规则(
+
-
*
/
^
)。 help
命令: 命令行输入。
1 | help 需要查询的函数名 |
ln
代表指令:log
。
变量
- 可以在工作区观察每个变量的数值。
- 变量的开头不能是数字。
who
查看当前变量,whos
查看当前变量具体性质。- 特殊变量和常量:
i
和j
表复数,Inf
无限大,eps
无限小,pi
表示圆周率 (pai)。 - 变量命名具有高优先级。
- 变量类型。(使用CTRL+点击可跳转)
数组(向量与矩阵)
- 行向量:
[1 2 3 4]
,列向量:[1;2;3;4]
,矩阵:[1 21 6; 5 17 9; 31 2 7]
,这里的;
可类似于换行符号。 - 数组索引:向量
a(1)
矩阵A(1,2)
orA(2)
每一列按列数下去。 Colon Operator
:A=j:k
(j到k逐次增加);A=j:i:k
(j到k按i增加)。- 矩阵合并的操作:使用
A=[B C]
B C行往后合并;A=[B;C]
B和C列往后合并。 - 矩阵四则运算:同线性代数的四则运算。特殊的有
A/B
相当于A × B的逆矩阵;A.*B
矩阵的各个元素相乘;A./B
矩阵的各个元素相除;A+实数
A的各个元素都相加这个实数,A/实数
相当于A./实数
,每个元素都除以这个实数;A^2
表示矩阵相乘,A.^2
表示A的各个元素都平方;A'
表示A的转置。
结构化程序与自定义函数
MATLAB程序(.m文件)
- 注释代码:
%
,代码分部分:%%
- 以下为MATLAB基本编程语句:所有指令都以
end
为结束- 选择函数
if, elseif, else
;switch, case
; - 循环函数
for
;while
; break
跳出循环。
- 选择函数
- 以下为MATLAB逻辑运算符:运算结果为
true
orflase
- 小于
<
;小于等于<=
;大于>
;大于等于>=
; - 恒等于
==
;不等于~=
; - 与
&&
;或||
。
- 小于
- 以下为编程的一些技巧:
clear all
清除所有变量;close all
关闭所有窗口;clc
清空命令行窗口;;
命令行持续编写代码,但不执行;- 程序执行时,按下
ctrl c
,程序终止执行。
函数
函数书写规则
1 | function output = FunctionName(v1,v2,v3...) |
output为输出变量,FunctionName为函数名,()内的为函数变量
变量与档案储存
变量
数值
- 整型:int8, uint8(8代表数值所占比特数,u代表无符号数) int16, uint16, int32, uint32, int64, uint64
- 浮点数(可认为是小数):single(32位浮点值,也叫单精度变量),double(默认的变量类型,64位浮点值,也叫双精度分量)。
- 比如将一个数字转为double类型,则使用
y=double(x)
,x是转换前,y是转换后。
逻辑
分为0(false)和1(true),为逻辑运算符(使用CTRL+点击可跳转)的输出结果。
字符
- 定义:
s1='h'
表示s1是一个字符,s2='hex'
表示s2是一个字符串,是多个字符。 - 字符串合并:
s1='example'
和s2='string'
,合并:s3=[s1 s2]
,注意:s3=[s1;s2]
,s1
与s2
并排放置,此时,s1
与s2
的字符串长度要求一致。 - 字符串索引:
s1='string'
,那么s1(3)为r。str(100001(逻辑输出))=‘a’则,第一位和第六位变为a。 - 字符串比较:使用
strcmp
函数(CTRL+点击可跳转)
结构体
定义:结构体是一个存储
{键: 值}
的数据结构,使用.
来访问结构体中的字段。类似于结构体里面为一个成员,成员有不同的属性值。组成
1
struct(field1,value1,…,fieldN,valueN) % field为键,value为值
field
为属性名,value为属性值,属性值可以为任何变量类型。创建结构体
直接创建 :直接对结构体变量名.字段名赋值(字段的命名规则和变量一样)
1
2
3
4s(1).name = 'LiSi';
s(1).gender = 'Male';
s(2).name = 'LiSi';
s(2).gender = 'female'; % 示例为创建了一个结构体对应两个变量使用
struct()
函数1
s2 = struct('name', '李四', 'gender', 'male'); % filed1为name, value1为李四
不同成员的属性赋值:
struct(n)
struct为结构体名称,n为n个不同成员。结构体常用函数
结构体的嵌套:结构体内部可以再包含结构体。课程中此处的结构体应该包含两个
filed
:data和nest,其中data为数字,nest为结构体。可以使用多个圆点去访问结构体中的结构体变量的值。
元胞数组
定义:元胞数组是一个可以容纳不同类型元素的数据结构,使用
{}
像定义矩阵一样定义元胞数组。赋值
- 单位索引赋值:
A(m,n)={k}
,m和n表示为位于元胞数组m行n列位置,k为元素的值,k可为任何类型,矩阵也可。 - 内容索引赋值:
A{m,n}=k
m,n,k的含义同上。
- 单位索引赋值:
访问
- 单位索引:
A(1,1)
得到A中的(1,1)位置的数据类型 - 内容索引:
A{1,1}
得到A中的(1,1)位置的数据内容
- 单位索引:
常用函数
magic(n)
:产生nxn的[魔方矩阵](魔方矩阵_百度百科 (baidu.com))(CTRL+点击可跳转)num2cell
:将数组转换为相同大小的元胞数组,此时的元胞数组中元素为1x1的矩阵。mat2cell
:可以在转换的时候指定元胞数组各元胞的尺寸。1
2mat2cell(a,[1 1 1],3) % a为需要操作的数组,[1 1 1]表示行怎么划分,3表示列怎么划分。这里表示化成三个1x3的子数组
mat2cell(a,[2 1],[1 2]) % 表示把a矩阵(3x3)化成2x1,2x2,1x1,1x2的矩阵,然后组成元胞数组
高维数组
定义:将数组扩展到从一维(向量),二维(矩阵),三维(行row,列columm,层layer)
赋值
使用
{}
定义三位元胞数组,如A{r,c,l}=value
r,c,l为对应行列层,value为对应位置的值,可以是任何类型。使用
cat()
函数在指定维度上对元胞数组进行拼接。1
2
3C=cat(1,A,B) %从行的维度对A和B进行拼接
C=cat(2,A,B) %从列的维度对A和B进行拼接
C=cat(3,A,B) %从层的维度对A和B进行拼接
常用函数
reshape()
:改变数组的行列数1
C=reshape(A,m,n) %A为lxk的数组,C为mxn的数组,其中mxn=lxk
文件读写
可以读取的文件类型有:MATLAB数据(.mat),Excel表格(.xls或者.xlsx)文件,空格分隔的数字(.txt)。
MATLAB数据
- 存储:save()函数
save(filename,variables)
将变量variables
以二进制形式存入文件中。save(filename,variables,'-ascii')
将变量variables
以文本形式存入文件中。
- 读取:load()函数
load(filename)
从二进制形式文件中读取数据。load(filename,'-ascii')
从文本形式文件中读取数据。
- 注意:这里的文件名要在文件和代码在同一目录下才能读取,若不在同一目录下,需要在此处改为文件路径。同时,这里的参数,
filename
和variables
都是字符串格式,若不指定variables
参数,则将当前工作区内所有变量存入文件中。
Excel表格数据
- 读取:xlsread(),2019a开始后matlab不建议使用,以新函数代替。现在改用为:
- readmatrix() 从文件中读取矩阵,格式:
M=readmatrix('filename.xlsx','Sheet','sheetname','Range','rangenumber')
,中Sheet
,Range
这两个是固定格式。或者直接M = readmatrixd('filename.xlsx')
读取文件中所有数据。 - readcell() 从文件中读取元胞数组
- readtable 基于文件创建表
- readmatrix() 从文件中读取矩阵,格式:
- 存储:xlswrite(),2019a开始后matlab不建议使用,以新函数代替。现在改用为:
- writematrix 将矩阵写入文件:可以
writematrix(M, 'filename')
将矩阵 M 储存的数据写入表格 04Score.xls,也可以writematrix(M,'filename', 'Sheet', 1, 'Range', 'E2:E4')
规定范围写入指定表格,注意参数列表中 sheet后的参数可以是表格名也可以是第 x 个表格。 - writematrix 将矩阵写入文件
- writecell将元胞数组写入文件
- writematrix 将矩阵写入文件:可以
文本数据
使用和写入excel相同的函数写入文本,就是指定的参数不一样,例如:writematrix写入文本。
- 直接
writematrix(M)
则默认以逗号分隔各元素写入 M.txt 文件中; - 指定分隔符则使用
writematrix(M, 'filename.txt', 'Delimiter', ' ');
‘Delimiter’是固定格式; - matlab 支持使用 ``;
\t
;,
;;
;|
(对应的字符名称为
space、tab、comma、semi、bar)作为分隔符。
低阶文件处理IO函数
使用fopen()
函数打开文件或获得有关打开文件的信息。
- 无论是写入还是读取都要先获得fileID
fileID = fopen(filename,permission)
将打开由 permission 指定访问类型的文件。permission 为文件访问类型:'r'
(默认)读取 ,'w'
写入。 - 操作完毕后务必使用
fclose(fileID)
函数关闭文件,否则 matlab 将一直占用文件。 - 使用
feof(fid)
检查是否到达文件结尾,到达结尾返回 true。
初阶绘图
基础绘图
plot()基本使用
plot(x,y)
,x和y都是向量,要求长度一致。plot(y)
,此时x默认1,2,3,4...
设置曲线性质:
plot(x,y,'linespec')
,linespec
可以设置线型、标记符号和颜色。
设置多条曲线性质:plot(x1,y1,'line1',x2,y2,'line2',...)
- 需要保持多条图在一张图中(在一张图中显示多条曲线):
hold on
开始保持,hold off
取消保持。
添加图例(在图右上角显示每条曲线代表意义)
1 | plot('line1','line2','line3','line4'); |
添加标题和坐标轴
- 添加标题:
title('str')
; - 添加坐标轴题注:xlabel()、ylabel()、zlabel()为 x y z 轴添加题注。
添加文本、线条和箭头
- 文本:
text(x,y,str)
; - 线条:
line(x,y)
; - 箭头:
annotation(lineType, x, y)
创建一个在当前图窗中的两个点之间延伸的线条或箭头注释,将 lineType 指定为 line(线条)、arrow(箭头) 或 doublearrow(双向箭头),将 x 和 y 分别指定为 [x_begin, x_end] 和 [y_begin, y_end] 形式的二元素向量。
改变坐标轴的显示值
1 | xticks([1 2 3 4]) |
更改图形属性
图形属性
画出的一个图主要包括 Figure Axes Line 三个 Object
获取图形句柄
图形句柄本质上就是一个浮点数,可以唯一确定一个图形对象.下面几个函数用于获取图形句柄.
函数 | 作用 |
---|---|
gca() | 获取当前坐标轴的句柄 |
gcf() | 获取当前图像的句柄 |
allchild(handle_list) | 获取该对象的所有子对象的句柄 |
ancestor(h,type) | 获取对象最近的type类型的祖先节点 |
delete(h) | 删除某对象 |
findall(handle_list) | 获取该对象的后代对象 |
通过图形句柄改变图形属性
改变坐标轴属性
1
2
3
4
5
6
7
8
9
10% 改变坐标轴字体大小
set(gca, 'FontSize', 25);
% 改变X轴坐标轴显示
set(gca, 'XTick', 0:pi/2:2*pi);
set(gca, 'XTickLabel', 0:90:360);
% 把X轴显示改为自己想要显示的值
set(gca, 'FontName', 'symbol');
set(gca, 'XTickLabel', {'0', 'p/2', 'p', '3p/2', '2p'});改变线型
1
2
3
4h = plot(x,y);
set(h, 'LineStyle','-.', ...
'LineWidth', 7.0, ...
'Color', 'g');
保存图片
使用saveas(fig,filename)
命令可以将图形对象保存到文件中,其中fig
为图形句柄,filname
为文件名。
1 | saveas(gcf, 'myfigure.png') |
高阶绘图
进阶二维绘图
对数图
logspace(-1,1,100)
:x取10^-1 到10^1中的100个变量。semilogx(x,y)
: x坐标轴是对数坐标系,即使用 x 轴以 10 为基数的对数刻度和 y 轴的线性刻度创建一个绘图。semilogy(x,y)
:y坐标轴是对数坐标系,即使用 y 轴以 10 为基数的对数刻度和 x 轴的线性刻度创建一个绘图。loglog(x, y)
:x、y坐标都是对数坐标系。set(gca,'XGrid','on')
:加网格。
一图双Y轴
方法一:
plotyy()
以左、右不同纵轴绘制两条曲线。[AX,H1,H2] = plotyy( )
:返回给AX
两个坐标区(Axes)的句柄(handle),AX(1)
表示左边的坐标区的handle,AX(2)
表示右边的坐标区的handle。返回给H1
和H2
每个绘图中Line对象的handle.1
2
3
4
5
6
7
8
9x = 0:0.01:20;
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
[AX,H1,H2] = plotyy(x,y1,x,y2);
set(get(AX(1),'Ylabel'),'String','LeftY-axis')
set(get(AX(2),'Ylabel'),'String','RightY-axis')
title('Labeling plotyy');
set(H1,'LineStyle','--');
set(H2,'LineStyle',':');方法二:使用
yyaxis()
分别激活左右两个坐标轴,分别设置。1
2
3
4
5
6
7
8
9
10
11
12
13
14x = 0:0.01:20;
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
yyaxis left;
p1 = plot(x,y1);
ylabel('LeftY-axis')
title('Labeling plotyy');
p1.LineStyle = '--';
yyaxis right;
p2 = plot(x,y2);
ylabel('RightY-axis')
p2.LineStyle = ':';清除左侧曲线命令:
1
2yyaxis left;
cla;
直方图
hist(y)
默认十个等间隔区间,并返回每个范围内的Y的元素个数作为一行向量。hist(y,x)
划分x个等间隔区间。这里的Y就是对应着纵坐标。1
2
3
4
5
6
7
8
9
10
11x = [1 2 5 4 8];
y = [x;1:5];
subplot(1,3,1);
bar(x);
title('A bargraphof vector x');
subplot(1,3,2);
bar(y);
title('A bargraphof vector y');
subplot(1,3,3);
bar3(y);
title('A 3D bargraph');
条形图
bar()
创建一个条形图。如果y是向量,y中每个向量对应一个条形,如果y是矩阵,则根据y中的行进行分组。bar3()
画3D图。1
2
3
4
5
6
7
8
9
10
11x = [1 2 5 4 8];
y = [x;1:5];
subplot(1,3,1);
bar(x);
title('A bargraphof vector x');
subplot(1,3,2);
bar(y);
title('A bargraphof vector y');
subplot(1,3,3);
bar3(y);
title('A 3D bargraph');bar(y,'stacked')
为堆叠条形图,为了可以展示总和为多少。barh(y)
为水平条形图。
1 | x = [1 2 5 4 8]; |
饼状图
pie(a)
使用a中的数据绘制饼状图,sum(a)≥0,则按比例绘制;sum(a)<1,则仅按比例绘制部分饼图。pie(a,explode)
将对应explode元素设置为1,使该部分偏移出去。pie3()
绘制3D饼图。pie(x,{'Taxes','Expenses','Profit'})
使用{}
设置标签。
1 | a = [10 5 20 30]; |
极坐标图
polar(theta,r)
其中theta
表示极角,r
表示半径- 在最新版本中推荐使用:polarplot()
1 | x = 1:100;theta = x/10; |
箱线图与取样图
1 | x = linspace(0, 4*pi, 40); |
填充图
- 使用
plot()
是画线,而使用fill()
是画线且涂色 fill(x,y,ColorSpec)
填充 x 和 y 指定的二维多边形(颜色由 ColorSpec 指定)axis square off
是``axis square(使当前区域为正方形)和
axis off`(使数轴不可见)两个命令的组合命令text()
添加文本信息
配色
RGB
- 在进行颜色设置时,matlab似乎不支持使用0
255的数组来表示[R G B],将0255的数组每一项均除以255, 转换为0~1来表示即可
1 | G = [46 38 29 24 13]; |
将数据可视化为图像
meshgrid
函数用来生成网格矩阵- surf():画曲面图
box on
显示坐标轴轮廓
1 | [x, y] = meshgrid(-3:.2:3,-3:.2:3); |
imagesc(z)
将矩阵z中的元素数值按大小转化为不同颜色,并在坐标轴对应位置处以这种颜色染色;- 使用
colorbar
指令调出如图所示的颜色条; - 使用
colormap()
来改变可视化图像的颜色;
三维绘图
3D点或者线图
plot3(X,Y,Z)
在 3-D 空间中绘制坐标。要绘制一组由线段连接的坐标,请指定XYZ为相同长度的向量。
要在同一组轴上绘制多组坐标,请至少将 XYZ,其中至少一个指定为矩阵,并将其他坐标指定为向量。
曲面图
[X,Y]=meshgrid(x,y)
:基于向量 x 和 y 中包含的坐标返回二维网格坐标。也就是说前面给出的x、y只是一个向量,而画网图需要x、y两个范围围出来的面上的所有点,meshgrid(x,y)则给出这个面上所有的点。surf(X,Y,Z)
创建三维曲面图,该图面是具有纯边色和实心脸色的三维曲面。该函数将矩阵中的值绘制为由 和 定义的 x-y 平面中网格上方的高度。表面的颜色根据 指定的高度而变化。(绘制网格并填充颜色)mesh
和surf
的区别:surf会把颜色贴在上面。
矩阵等值线图
- contour:等高线/轮廓
- 在contour后面加数值可以让contour画线更加紧密;例如
contour(Z,[-.45:.05:.45]);
- 我们还可以在图上把数值标上去,用clabel指令:
clabel(C,h);
- 也可以给contour涂颜色,
contourf()
,f是fill的意思。
网格曲面图下及曲面图下的等高线图
视点控制以及打光设置
view(Az,El)
其中Az为方位角,El为高度角;也可以输入三个参数,view(x,y,z),其中(x,y,z)是直角坐标系中一个矢量。1
2
3
4
5
6
7
8sphere(50);
shading flat;
light('Position',[1 3 2]);%添加灯光,让球更立体
light('Position',[-3 -1 3]);
material shiny;
axis vis3d off;%不显示三维坐标系
set(gcf,'Color',[1 1 1]);
view(-45,20);%这个可以决定角度可以旋转查看球体:使用图形界面的三维旋转选项,这时左下角会出现观察的球坐标角度表示。
定义
light
的打光位置和颜色:1
2
3
4
5
6
7
8
9
10[X, Y, Z] = sphere(64);
h = surf(X, Y, Z);
axis square vis3d off;
reds = zeros(256, 3);
reds(:, 1) = (0:256.-1)/255;
colormap(reds);
shading interp;
lighting phong;
set(h, 'AmbientStrength', 0.75, 'DiffuseStrength', 0.5);
L1 = light('Position', [-1, -1, -1]);
绘制多边形
patch()绘制一个或多个填充多边形区域
1
2
3
4
5
6
7
8
9
10
11
12v = [0 0 0; 1 0 0 ; 1 1 0; 0 1 0; 0.25 0.25 1; 0.75 0.25 1; 0.75 0.75 1; 0.25 0.75 1];
f = [1 2 3 4; 5 6 7 8; 1 2 6 5; 2 3 7 6; 3 4 8 7; 4 1 5 8];
subplot(1,2,1);
patch('Vertices', v, 'Faces', f, 'FaceVertexCData',hsv(6),'FaceColor','flat');
view(3);
axis square tight;
grid on;
subplot(1,2,2);
patch('Vertices', v, 'Faces', f, 'FaceVertexCData',hsv(8),'FaceColor','interp');
view(3);
axis square tight;
grid on;