logo头像
Snippet 博客主题

MATLAB

数据类型

​ 在MATLAB中有15种基本的数据类型

数据类型 说明
int8,int16,int32.int64 有符号整型
uint8,uint16,uint32,uint64 无符号整型
single 单精度浮点型
double 双精度浮点型
logical 逻辑型
char 字符串型
cell 单元数组型
struct 结构体型
function_handle 函数句柄型

​ 在命令行中声明了变量之后,我们可以调用whos语句查看当前已经声明的所有变量以及详细信息

1
2
3
4
5
6
7
8
9
10
11
12
clc;//清屏
a1=int8(6)
a2=int16(-20)
a3=uint32(100)
a4=uint64(200)
b1=single(3.5)
b2=12
c1=true
c2{1,1}=100
c3='hello'
c4.name='robin'
d=@cos

​ 调用whos语句观察变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Name      Size            Bytes  Class              Attributes

a 1x1 8 double
a1 1x1 1 int8
a2 1x1 2 int16
a3 1x1 4 uint32
a4 1x1 8 uint64
b 1x1 8 double
b1 1x1 4 single
b2 1x1 8 double
c 1x1 8 double
c1 1x1 1 logical
c2 1x1 120 cell
c3 1x5 10 char
c4 1x1 186 struct
d 1x1 32 function_handle

在声明了数据变量后,可以用‘clc’语句清空当前命令行中的所有内容,但是不会清除变量的声明,要清除变量的声明,需要使用‘clear all‘语句

在程序中,可以调用intmin()和intmax()得到有符号整数和无符号整数的取值范围

浮点数的取整

​ MATLAB中,对于浮点数有对应的取整函数,不同的函数具体实现结果也不一样

函数 说明
round() 向最接近的整数取整,如果小数为0.5,则取绝对值大的整数
fix() 向0取整
floor() 不大于该数的最接近整数
ceil() 不小于该数的最接近整数

​ 双精度浮点数(double)是MATLAB中默认的数据类型,如果输入某个数据后没有明确的指明类型,则默认为double双精度浮点数类型

不同数据类型之间的运算

​ 在MATLAB中,不同的数据类型之间也可以进行运算,比如:

1.浮点数和其他类型的数据进行运算时,返回的结果取决于运算中的其他数据类型。

2.单精度浮点型与逻辑型和字符型进行运算时,返回结果为单精度浮点型

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 a=single(123.4)

a =

single

123.4000

>> b1=a+true

b1 =

single

124.4000

>> b2=a+'a'

b2 =

single

220.4000

>> b3=a+10.5

b3 =

single

133.9000

>> c=double(678.9)

c =

678.9000

>> d1=c+false

d1 =

678.9000

>> d2=c+'hello'

d2 =

782.9000 779.9000 786.9000 786.9000 789.9000

>> d3=c+single(10.2)

d3 =

single

689.1000

>> d4=c+int32(100)

d4 =

int32

779

>>

​ 调用whos语句观察所有变量,即可观察到

1
2
3
4
5
6
7
8
9
10
11
Name      Size            Bytes  Class     Attributes

a 1x1 4 single
b1 1x1 4 single
b2 1x1 4 single
b3 1x1 4 single
c 1x1 8 double
d1 1x1 8 double
d2 1x5 40 double
d3 1x1 4 single
d4 1x1 4 int32

复数

函数 说明
complex() 创建复数,a为实,b为虚部
real(z) 得到复数z的实部
imag(z) 得到复数z的虚部
abs(z) 得到复数z的模
angle(z) 得到复数z的角度
conj(z) 得到复数z的共轭复数

创建复数有两种方法,一种是直接声明,一种是调用complex函数声明

1
2
3
4
5
clear all;
z1=3+5i
z2=4+5j
z3=complex(1,2)
z4=complex(1:4,2:5)

其中z4变量的声明之后,我们会发现z4变量的结果是这样的

1
2
3
z4 =

1.0000 + 2.0000i 2.0000 + 3.0000i 3.0000 + 4.0000i 4.0000 + 5.0000i

​ 我们可以看出,z4中的“:”,相当于从1一直声明到4,类似于c语言中的for循环一样

数值显示格式

​ MATLAB中有专门的函数format(),确定数值类型的显示格式

format()函数格式 说明
format short或format(‘short’) 默认显示,保留小数点后4位
format long或format(‘long’) 有效数字16位
format long e 有效数字16位加3位指数
format short e 有效数字5位加3位指数
format bank或format(‘bank’) 保留两位小数位
format +或format(‘+’) 只给出正、负
format rational或format(‘rational’) 以分数形式表示
format hex或format(‘hex’) 16进制数
format long g 15位有效数
format short g 5位有效数

元胞数组

​ 元胞数组是MATLAB中特有的一种数据类型,并且matlab中的元胞数组中的元素下标是从1开始的,不同于一般的编程语言下标是从0开始的

Matlab中元胞数组的初始化

1
2
3
4
5
6
A =

1×6 cell 数组

[] [] [] [] [] []
此处即是初始化一个一行六列的元胞数组

eye语句

生成一个3*3的对角线上为1的单位矩阵

magic语句

​ magic在matlab中用来生成n阶幻方,比如三阶幻方就是1-9九个数字,组成一个3*3的矩阵,使得该矩阵无论横、竖还是斜三个方向上的三个数的和总是相同的。

​ magic(n)生成一个n阶幻方,九十八1-n^2排成一个n*n的矩阵,使得矩阵的每行、每列,以及主副对角线上面的n个数之和都相等

结构体Struct

​ 结构体类似于python的字典,接下来我们初始化一个结构体

1
2
3
4
books = struct('name',{{'Machine Learning','Data Mining'}},'price',[30 40])
books.name
books.name(1)
books.name{1}

​ 运行结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
books = 
包含以下字段的 struct:
name: {'Machine Learning' 'Data Mining'}
price: [30 40]

ans =
1×2 cell 数组
'Machine Learning' 'Data Mining'
ans =
cell
'Machine Learning'
ans =
Machine Learning

MATLAB中的矩阵操作

矩阵的定义与构造在matlab中有很多种方式,基本的方式如下

1
A=[1 2 3 5 8 5 4 6] %此处是直接定义并初始化一个矩阵

此外,还有一种比较独特的方式,通过步长从某一个数值开始,一直将最后的满足小于上界的数填入矩阵中

1
2
B=1:3:9
B=1:2:9

结果如下

1
2
3
4
5
6
7
8
9
10
11
>> B=1:3:9

B =

1 4 7

>> B=1:2:9

B =

1 3 5 7 9
1
2
C=repmat(B,3,1) %竖向重复B矩阵3次,横向只重复一次
D=ones(4,4) %初始化一个全1矩阵,其规格为四行四列

矩阵的四则运算

我们先假定有两个已经初始化完毕的矩阵且他们的行列数都相同

1
2
3
4
5
6
7
8
A=[1 2 3 4;5 6 7 8]
B=[1 1 2 2;2 2 1 1]
C=A+B%两个矩阵相加,对应的元素两两相加
D=A-B
E=A*B'%B的单引号代表将B转置
F=A.*B
G=A/B
H=A./B

通过计算之后,我们可以得出如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
C =

2 3 5 6
7 8 8 9
D =

0 1 1 2
3 4 6 7
E =

17 13
41 37
F =

1 2 6 8
10 12 7 8
G =

1.8333 -0.1667
3.1667 1.1667

矩阵的下标

关于矩阵的下标,有如下几种操作

首先我们创建一个幻方:

1
2
3
4
5
6
7
A=magic(5)

A = 17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

接下来通过几种对矩阵A下标进行操作的方式,分别创建出几个分矩阵

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
B=A(2,3)

B = 7

C =
4 6 13 20 22

>> D=A(:,4)
D =
8
14
20
21
2

>> [m,n]=find(A>20)%找出矩阵中大于20的数的下标,m代表行数,n代表列数
m =
2
1
5
4
3
n =
1
2
3
4
5

基本操作

1.每一个语句之后要加分号,如果不加分号就会直接输出语句执行结果

2.注释语句ctrl+R

3.取消注释语句ctrl+T

4.clear:清除工作区的所有变量

5.clc:清除命令行的所有文本信息

帮助的使用

help

1
2
3
help %"帮助"总览
help elfun %关于基本函数的“帮助”信息
help exp %指数函数exp的详细信息

特殊矩阵

所有元素为1的矩阵

1
ones(n),ones(size(a)),ones(m,n)

所有元素为0的矩阵

1
zeros(n),zeros(m,n)

随机数矩阵

1
rand(m,n)

产生m*n矩阵,其中的元素是服从[0,1]上均匀分布的随机数

1
normrnd(mu,sigma,m,n)

产生m*n矩阵,其中的元素是服从均值为mu,标准差为sigma的正态分布的随机数

1
exprnd(mu,m,n)

产生m*n矩阵,其中的元素是服从均值为mu的指数分布的随机数

1
poissrnd(mu,m,n)

产生m*n矩阵,其中的元素是服从均值为mu的泊松(Poisson)分布的随机数

1
unifrnd(a,b,m,n)

产生m*n矩阵,其中的元素是服从区间[a,b]上均匀分布的随机数

绘图命令(制图)

plot命令

例:plot([1,3],[2,9],’r’)

image

我们可以看到,横轴对应第一个向量[1,3],纵轴对应第二个向量[2,9],且制图线色为红色(red)

函数绘制

1
fplot(fun,lims)

字符串fun:指定函数名的函数

lims:x轴区间

image

首先书写函数文件

1
2
3
4
5
6
function y=Afun1(x);
if x<1
y=x+1;
else
y=1+1/x;
end
image

对于函数y=tanx以及y=x^2+y^2/4=1类似的图形,可以用ezplot函数进行绘制

1
2
ezplot('tan(x)')
ezplot('x^2+y^2/4=1')

绘制函数样例2

1
2
3
4
5
clear all;
t=0.01:0.01:2*pi;
y=sin(t);
figure;%创建一个函数画布
plot(y);%绘制图像

结果

image-20220911143755087

子图绘制

Matlab中,采用函数subplot()进行子图绘制。该函数能够将几个图形在同一个图形窗口中绘制出来,且采用不同的坐标系

样例:

1
2
3
4
5
6
7
>> x=-pi:pi/10:pi
>> figure
>> subplot(2,1,1)
>> plot(x,sin(x),'r--')
>> subplot(2,1,2)
>> plot(x,cos(x),'b:*')
%假定plot函数一般使用式为plot(x,y),则再matlab中,x代表横坐标的范围,y代表纵坐标的范围

结果

image-20220911151103495

subplot(m,n,p)

​ 该函数将当前图形窗口分为m*n个片区,并将其从左往右从上至下排列,p决定将图形绘制在几号片区,不同的绘图片区相互独立,可以绘制完全不一样的图像

1
2
3
4
%对绘制的坐标系加上边框
box off&box on
%对绘制的坐标系设置网格线
grid on&gird off

1.set(gca,’xtick’,0:100:2500)

1
功能: 设置X轴坐标范围0到2500,显示间隔是100;        

2.set(gca,’ytick’,0:100:2500)

1
功能: 设置X轴坐标范围0到2500,显示间隔是100;    

注意set语句要放在绘图语句后面才起作用!

数据光标

​ Matlab中,通过数据光标功能,可以观察鼠标移到位置的横纵坐标情况,具体方式如下

1
2
datacursormode on%打开图形数据光标功能
datacursormode off%关闭图形数据光标功能

效果如下

image-20220911155830812

叠加图绘制

matlab中,在已经绘制好的函数图上再绘制新的函数时,需要采用函数hold启动或者关闭图形保持功能

image-20220911151339549

三维图形

绘制三维曲线

1
plot3(x,y,z)

这里x,y,z都是n维向量,分别表示该曲线上点集的横坐标、纵坐标、竖坐标

例:在区间[0,10pi]画出参数曲线x=sint,y=cost,z=t,并分别标注

1
2
3
t=0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
xlabel('sin(t)'),ylabel('cos(t)'),zlabel('t')

图像

image

对数和半对数坐标系绘图

​ 在Matlab中,可以采用函数semilogx()进行绘图,其中x轴采用对数坐标,y轴采用等比例刻度坐标。该函数的调用方式和函数plot相同,唯一不同的是x轴采用对数坐标

Matlab代码

1
2
3
4
5
6
>> x=0:0.1:8;
>> y=log10(x);
>> subplot(1,2,1)
>> plot(y);
>> subplot(1,2,2);
>> semilogx(x,y)

结果

image-20220911161526359

二元函数

例:函数z=sin(xy)/xy

Matlab程序

1
2
3
[x,y]=meshgrid([-3:0.2:3]);
z=(sin(x.*y)+eps)./(x.*y+eps);
surf(x,y,z)

图像

image

旋转曲面

image

Matlab程序如下

1
2
3
x=0:10:600;
[x,y,z]=cylinder(30*exp(-x/400).*sin((x+25*pi)/100)+130);
surf(x,y,z)

图像

image

image

Matlab程序

1
2
3
4
5
6
>> alpha=[0:0.1:2*pi]
>> beta=[0:0.1:2*pi]
>> x=@(alpha,beta)4*cos(alpha);
>> y=@(alpha,beta)(5+4*sin(alpha)).*cos(beta);
>> z=@(alpha,beta)(5+4*sin(alpha)).*sin(beta);
>> ezsurf(x,y,z)

图像

image

柱状图

​ 通过函数bar()绘制柱状

Matlab与高等数学

P.s 在matlab与高等数学中,对于极限以及导数等,对其中例如x的变量需要做符号变量定义

1
syms x

求极限

Matlab中,求极限的命令为

1
2
3
4
5
limit(expr,x,a)
limit(expr,a)
limit(expr)
limit(expr,x,a,'left')
limit(expr,x,a,'right')

其中,limit(expr,x,a)表示求符号表达式expr关于符号变量x趋近于a时的极限;limit(expr)表示求默认变量趋近于0时的极限

例如:

image

结果

1
2
1.ans=1
2.ans=exp(a)

求导数

Matlab中,同样还可以求导数,命令为

1
2
3
4
5
6
diff(expr)
diff(expr,v)
diff(expr,sym('v'))
diff(expr,n)
diff(expr,v,n)
diff(expr,n,v)

其中,diff(expr)表示求表达式expr关于默认变量的1阶导数;diff(expr,v,n)和diff(expr,n,v)都表示求表达式expr关于符号变量v的n阶导数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> syms x
>> dy=diff(log((x+2)/(1-x)),3);
>> dy=simplify(dy)

dy =

-(18*(x^2 + x + 1))/(x^2 + x - 2)^3

>> pretty(dy)
2
(x + x + 1) 18
- ---------------
2 3
(x + x - 2)

求极值

image
1
2
3
>> syms x
>> y=x^3+6*x^2+8*x-1;dy=diff(y);
>> dy_zero=solve(dy),dy_zero_num=double(dy_zero)

结果

1
2
3
4
5
6
7
8
9
10
dy_zero =

- (2*3^(1/2))/3 - 2
(2*3^(1/2))/3 - 2


dy_zero_num =

-3.1547
-0.8453

求不定积分

Matlab求符号函数不定积分命令:

1
2
int(expr)
int(expr,v)

代码

1
2
syms x
I=int(1/(1+sqrt(1-x^2)))

级数求和

Matlab求级数和命令为:

1
2
r=symsum(expr,v)
r=symsum(expr,v,a,b)

其中,expr为级数的通项表达式;v是求和变量;a和b分别是求和变量的起始点和终止点,若没有指明a和b,则a的默认值为0,b的默认值为v-1

例如:

1
2
3
syms n
f1=(2*n-1)/2^n;
s1=symsum(f1,n,1,inf)

求单变量非线性函数在区间上的最小值

fminbnd函数

求minf(x)

例如:求函数f(x)=(x-3)^2-1,0<=x<=5

编写M函数fun6.m

1
2
3
4
function f=fun6(x);
f=(x-3)^2-1;
%然后输入
[x,y]=fminbnd('fun6',0,5);

求多变量非线性函数在区间上的最小值

Matlab标准式

image

image

  1. 编写M函数fun7.m定义目标函数

    1
    2
    function f=fun7(x,s);
    f=sum((x-0.5).^2);
  2. 编写M函数fun8.m定义约束条件如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function[c,ceq,k1,k2,s]=fun8(x,s);
    c=[];ceq=[];
    if isnan(s(1,1))
    s=[0.2,0;0.2,0];
    end;
    %取样值
    w1=1:s(1,1):100;
    w2=1:s(2,1):100;
    %半无穷约束
    k1=sin(w1*x(1)).*cos(w1*x(2))-1/1000*(w1-50).^2-sin(w1*x(3))-x(3)-1;
    k2=sin(w2*x(2)).*cos(w2*x(1))-1/1000*(w2-50).^2-sin(w2*x(3))-x(3)-1;
    %画出半无穷约束的图形
    plot(w1,k1,'-',w2,k2,'+');
  3. 调用函数fseminf

    1
    2
    x0=[0.5;0.2;0.3];%如果初始值去的不合适,可能得不到可行解
    [x,y]=fseminf(@fun7,x0,2,@fun8)

求函数取极小-极大值时的x值

fminimax函数

Matlab标准式

image

其Matlab命令为

1
[x,fval]=fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
image
  1. 编写M函数fun9.m定义向量函数如下

    1
    2
    3
    4
    5
    6
    function f=fun9(x);
    f=[2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304
    -x(1)^2-3*x(2)^2
    x(1)+3*x(2)-18
    -x(1)-x(2)
    x(1)+x(2)-8];
  2. 调用函数fminimax

    1
    [x,y]=fminimax(@ fun9,rand(2,1))

插值拟合

Matlab代码

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
%一维多项式插值
x=0:0.2:2;
y=(x.^2-3*x+5).*exp(-3*x).*sin(x);
xi=0:0.03:2;
yi_nearest=interp1(x,y,xi,'nearest');%临近点插值
yi_linear=interp1(x,y,xi);%默认为线性插值
yi_spine=interp1(x,y,xi,'spine');%三次样条插值
yi_pchip=interp1(x,y,xi,'pchip');%分段三次Hermite插值
yi_v5cubic=interp1(x,y,xi,'v5cubic');%MATBLAB5中三次多项式插值
figure;
hold on;
subplot(2,3,1);
plot(x,y,'ro');%绘制数据点
title('已知数据点');
subplot(2,3,2);
plot(x,y,'ro',xi,yi_nearest,'b-');%绘制临近点插值的结果
title('临近点插值');
subplot(2,3,3);
plot(x,y,'ro',xi,yi_linear,'b-');%绘制线性插值的结果
title('线性插值');
subplot(2,3,4);
plot(x,y,'ro',xi,yi_spine,'b-');%绘制三次样条插值的结果
title('三次样条插值');
subplot(2,3,5);
plot(x,y,'ro',xi,yi_pchip,'b-');%绘制分段三次Hermite插值的结果
title('分段三次Hermite插值');
subplot(2,3,6);
plot(x,y,'ro',xi,yi_v5cubic,'b-');%绘制MATLAB5中三次多项式插值结果
title('MATLAB5中三次多项式插值的结果')

image-20220915165620735

插值方法 运算时间 占用内存 光滑程度
临近点插值
线性插值 稍长 较多 稍好
三次样条插值 最长 较多 最好
三次Hermite插值 较长 较好