1. 基础

1.1 重要cmd

clc清空命令行clear清空工作区
help 函数名 查函数使用教程
doc 函数名 查官方文档


1.2 语法

1.2.1 算术运算符

符号 作用
+- 矩阵中只要兼容就可加,五种兼容模式:大小相同、一方为标量常数、行数相同列向量、列数相同行向量、列向量+-行向量
*.* *就是正常的矩阵乘法,.*是对应元素相乘
/\.\ /左除(求A*x=Bx),\右除,.\对应元素相除
^.^ ^矩阵幂运算,.^对应元素幂运算

1.2.2 关系运算符:

==、~=(不等于)、>、<、>=、<=,对于矩阵符合兼容模式算法,返回logical元素矩阵

1.2.3 逻辑运算符

(and())&、(or())|、(not())~、xor()(比较逻辑值,比如xor(3,4)结果为0),对于矩阵符合兼容模式算法,返回logical元素矩阵
&&、||与&、|相同但只用于标量且具有短路功能

1.2.4 数学运算函数

函数名 作用
abs 绝对值
floor 往小舍
fix 去小数部分
ceil 往大入
round 四舍五入
mod
sqrt 开方
exp e的几次
log 以e为底数
log2() 以2为底数
三角函数名 对应的三角函数(可以在三角名后加d表示用角度制),反三角则是a+三角函数

1.2.5 判断浮点数相同

e.g.

1
2
C=0.5-0.4-0.1;
C==0 %结果是0
1
2
C=0.5-0.4-0.1;
abs(C-0)<=1e-12> %结果是1,用一个小的数字去容差判断

1.3 矩阵

1.3.1 创建矩阵

  • A=[a,b,c]创建行向量(,可换空格)

  • A=[a;b;c]创建列向量(;可换换行)

  • A=[a b c;e f g]创建多维矩阵

  • A=a:b:c,即从a到c,步长为b的矩阵

  • 用函数

1.3.2 索引

MATLAB索引从1开始。引用格式:

  • A(row_ind,col_ind)

  • A([a,b,c...])

  • A(a:b:c)(索引多个数据用)

  • 用end关键字

  • A(:,a)返回第a列所有元素

  • A(A>0)返回A中大于0的元素(逻辑值引用)

  • linspace()

1.3.3 修改删除元素

  • A(1)=0

  • A(a:b:c)=[]注意左右元素个数要相等

  • A(a:b:c)=x将所有选中索引全修改为一个常数

  • A(...)=[]删除

1.3.4 矩阵相关函数

函数名 作用
linspace(a,b,n) 创建a到b共n个元素的矩阵,等差分布,n默认100
logspace(a,b,n) 创建10^a 到10^b共n个元素的矩阵,等比分布,n默认50
zeros(n) 创建n行n列的全0矩阵
ones(n) 创建n行n列的全1矩阵
eye(n) 创建单位矩阵
length 数组最大维度的长度
numel 返回矩阵元素个数
rand(m,n) 创建m行n列的均匀分布于0到1的矩阵,m可缺省
randi([a,b],m,n) 创建m行n列的均匀分布于0到1的矩阵,m可缺省
randn(m,n) 创建m行n列的标准正态分布于矩阵,m可缺省
diag(v,k)or diag(A,k) 将向量v的元素对角分布在第k条对角线上,k=0主对角,>0上,<0下方,k缺省0;或返回矩阵A第k对角线上元素
blkdiag(A,B,C…) 将输入的矩阵A、B…对角化分布
size(A,dim) 返回A矩阵在dim维度上的元素个数,dim缺省1即沿行方向
logical(A) 将A矩阵转换为逻辑值矩阵
isnan(A) 判断A中元素是否为NaN,并返回逻辑值矩阵(比如将矩阵A中的NaN替代成其他元素平均值,可以用A(isnan(A))=mean(A(~isnan(A)))
all() 判断数组元素是否全为非零值(可指定维度),返回逻辑值矩阵
any() 判断数组元素是否至少有一个非零值(可指定维度),返回逻辑值矩阵
[row_ind,col_ind,v]=find(A) 查找非零元素并返回索引,当只有一个回参时,返回线性索引,v为由非0元素组成的向量

1.4 程序流程控制

1.4.1 条件语句

1.4.1.2 if-elseif-else-end语句:
1
2
3
4
5
6
7
8
if x>=90 && x<=100 %不需要分号或冒号
dj=1
elseif x<90 && x>=60
dj=2
else
dj=3
end %有if就一定要有end
dj

在MATLAB中可以用ctrl+i来格式化选中代码

1.4.1.3 switch-case-otherwise-end语句
1
2
3
4
5
6
7
8
9
10
11
season=randi([1,4])
switch season
case 1
disp("春季");
case 2
disp("夏季");
case 3
disp("秋季");
otherwise
disp("冬季");
end

如果case后跟的是元胞数组,只要开关变量和数组中任意一个元素相等即可

1.4.2 循环语句

1.4.2.1 for-end语句
1
2
3
for ii=[3;4;5;6;7]%向量或矩阵,如果是矩阵,遍历的元素是每一列向量
%循环体
end

还可以:

1
2
3
for ii=3:7
%循环体
end
1.4.2.2 while-end语句
1
2
3
4
m=1;
while y<=10
m=m+1;
end

注意:如果死循环后可以按ctrl+c退出

1.4.2.3 break和continue

和C一样,不赘述

1.4.3 其他

1.4.3.1 try catch语句

try的代码块是可能引发故障的语句,若故障,则执行catch块的代码

1
2
3
4
5
try
A+B
catch
disp("大小不兼容")
end
1.4.3.2 tic/toc

可以输出tic和toc之间程序的运行时长

1
2
3
4
5
6
7
tic
sum=0;
for i=1:7
sum=sum+i;
disp(sum);
end
toc

命令行窗口会自动输出运行时间

1.4.3.3 pause
  • pause:使程序停止,待用户按下任意键继续

  • pause(n):使程序停止n秒

1.4.3.4 input
  • input(‘提示’),如果要输入字符串需要自己加引号

  • input(‘提示’,‘s’),不需要自己加引号,专门接受文本

1.4.3.5 warning/error

warning(“txt”):自定义生成警告文本
warning on/off:开启或关闭警告功能
error(“txt”):自定义生成报错文本

区别:warning的信息是橘红色,error是红色;warning后的代码还会运行,error直接退出程序


1.5 文本处理

MATLAB使用的编码是UTF-16,所以文本对应的编码是unicode码

1.5.1 一些语法

1.5.1.1 文本中的加减

char+char是拼接
char-char是unicode码相减
char+数字同C,但会将字符串转换为对应的Unicode码,需要用char(str)z转换回来

1.5.1.2 储存形式

MATLAB中的字符串是以字符向量储存的,多段文本按字符数组储存

1.5.1.3 插入换行

c_new=[c1,char[10],c2]
c_new=[c1,newline,c2]

1.5.2 文本处理相关函数:

函数名 作用
strcmp 比较字符向量是否相同(区分大小写)
strcmpi 比较字符向量是否相同(不区分大小写)
strncmp 比较前n个字符是否相同(区分大小写)
strncmpi 比较前n个字符是否相同(不区分大小写)
erase(str,match) 删除str字符串的子字符串match
numel(str)/length(str) 统计字符向量中字符的数量

1.6 元胞数组

用于存储不同数据类型的数据容器,用{}括起来,形式上与矩阵相似,可以储存矩阵甚至元胞数组

1.6.1 常见数据类型:

  • 数值:包括整型和浮点

  • 文本:包括字符(char)和字符串(string)

  • 逻辑(logical):布尔变量true/false

  • 元胞数组(cell)

  • 结构体数组(struct):

  • 分类数组(categorical):保存分类型变量

  • 日期时间(datetime):保存日期、时间的数据

  • 表格(table):保存表格形式数据

  • 函数句柄:可引用和间接调用函数

查看变量类型可以用class(a)查看

1.6.2 引用

1.6.2.1 ()引用

形式和索引查找一样,但不是直接返回该元素,而是返回一个对应大小的元胞数组

1.6.2.2 {}引用

形式和索引查找一样,直接返回该元素

1.6.2.3 链式引用
1
2
3
cc={[1,2,3;4,5,6],'abc'};
cc{1}[2] %对应的即是2
cc{2}[3] %对应的就是c
1.6.2.4 嵌套的cell引用

形如cc{a}{b}[c]


1.7 函数

1.7.0 例子

例子:

1
2
3
4
5
6
7
function result = factorial_function(n)
if n == 0 || n == 1
result = 1;
else
result = n * factorial_function(n - 1);
end
end

1.7.1 定义语句

第一行为定义语句,function为关键字(必需),result为输出参数(可选),factorial_function()为函数名(必需),n为输入参数(可选,无输入时括号可省略)

记忆方式:y = f(x):y是输出,f是函数名,x是输入

1.7.2 函数内容

以下缩进部分为函数的内容,注意在这个区域建立的变量储存在的时该函数工作区,独立于基础工作区。

MATLAB的函数是写在一个单独的文件里的,创建的函数名需要和文件名一致。如果一个文件里有多个函数,则第一个函数为主函数,与文件名相关联。

1.7.3 end语句

MATLAB的函数定义以end语句结尾


2 进阶

2.1 数据绘图

直接上参考模板:

2.1.1 单组数据画散点图

1
2
3
4
5
6
7
x = [1 2 3 4 5];
y = [5 4 6 2 7];
scatter(x, y, 50, 'r');
%% 第三个参数代表散点的大小,取[]表示默认大小;第四个参数是颜色,如'r'表red
xlabel('x轴');
ylabel('y轴');
title('自定义散点图');

2.1.2 单组数据画连续图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
clc
clear

% Import data
data=xlsread("data.xlsx");

% Parameter setting
xLabel="X";
yLabel='Y';
Title='Y-X曲线';
X=data(:,1);
Y=data(:,2);

% Plot
figure;
hold on;
box on;
plot(X,Y,'Marker','x','Color',[255 0 0]/255,'LineWidth',1,'Marker','o','MarkerSize',3.5,'MarkerFaceColor',[255 140 0]/255);
xlabel(xLabel);
ylabel(yLabel);
title(Title);

% set the span of x and y
xticks(1:5:100);
yticks(1:5:100);

% Make sure the center is at the origin
ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';

% set the font
set(gca,'FontName','Times New Roman','FontSize',10);

2.1.3 多组数据画图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
clc
clear

%% Import data
data=xlsread("data.xlsx");

%% Parameter setting
fontSize=28;
lineWidthBox=1.5;
lineWidth=2.5;
symbol=['o','s','d','^','v','>','<'];
markerSize=7;
pictureSize=[200,200,950,650];
fileName="figure2.tif";
pictureResolution='-r800';
color=[[0 0 139]/255;[0 139 139]/255;[105 105 105]/255;[192 0 0]/255;[255 140 0]/255;[0 191 255]/255];
%% RGB颜色坐标,取值0-255列举几个颜色:[0 0 177]/255深蓝色;[0 139 139]/255青色;[105 105 105]/255灰色;[192 0 0]/255红色;[255 140 0]/255橙色;[0 191 255]/255]浅蓝色
coordinateRange=[[0 50];[0 4]];
xLabel='Time [s]';
yLabel='Velocity [m/s]';

%% Plot
figure
hold on
box on
set(gca,'LineWidth',lineWidthBox)
for i=1:6
plot(data(:,1),data(:,i+1),'.-','Color',color(i,:),'LineWidth',lineWidth,'Marker',symbol(1,i),'MarkerSize',markerSize,'MarkerFaceColor',color(i,:))
end
legend('Group A','Group B','Group C','Group D','Group E','Group F','Location', 'eastoutside')
legend('boxoff')
set(gca,'XLim',coordinateRange(1,:),'YLim',coordinateRange(2,:));%% set the Upper and lower limits of x and y

xlabel(xLabel)
ylabel(yLabel)
set(gca,'FontName','Times New Roman','FontSize',fontSize)

%% Output
set(gcf,'Position',pictureSize)
print('-djpeg',fileName,pictureResolution);