MATLAB
数据类型
在MATLAB中有15种基本的数据类型
数据类型 | 说明 |
---|---|
int8,int16,int32.int64 | 有符号整型 |
uint8,uint16,uint32,uint64 | 无符号整型 |
single | 单精度浮点型 |
double | 双精度浮点型 |
logical | 逻辑型 |
char | 字符串型 |
cell | 单元数组型 |
struct | 结构体型 |
function_handle | 函数句柄型 |
在命令行中声明了变量之后,我们可以调用whos语句查看当前已经声明的所有变量以及详细信息
1 | clc;//清屏 |
调用whos语句观察变量
1 | Name Size Bytes Class Attributes |
在声明了数据变量后,可以用‘clc’语句清空当前命令行中的所有内容,但是不会清除变量的声明,要清除变量的声明,需要使用‘clear all‘语句
在程序中,可以调用intmin()和intmax()得到有符号整数和无符号整数的取值范围
浮点数的取整
MATLAB中,对于浮点数有对应的取整函数,不同的函数具体实现结果也不一样
函数 | 说明 |
---|---|
round() | 向最接近的整数取整,如果小数为0.5,则取绝对值大的整数 |
fix() | 向0取整 |
floor() | 不大于该数的最接近整数 |
ceil() | 不小于该数的最接近整数 |
双精度浮点数(double)是MATLAB中默认的数据类型,如果输入某个数据后没有明确的指明类型,则默认为double双精度浮点数类型
不同数据类型之间的运算
在MATLAB中,不同的数据类型之间也可以进行运算,比如:
1.浮点数和其他类型的数据进行运算时,返回的结果取决于运算中的其他数据类型。
2.单精度浮点型与逻辑型和字符型进行运算时,返回结果为单精度浮点型
3.单精度浮点型不能和整数型进行运算,如果需要运算必须先将单精度型转换为双精度型
1 | a=single(123.4) |
调用whos语句观察所有变量,即可观察到
1 | Name Size Bytes Class Attributes |
复数
函数 | 说明 |
---|---|
complex() | 创建复数,a为实,b为虚部 |
real(z) | 得到复数z的实部 |
imag(z) | 得到复数z的虚部 |
abs(z) | 得到复数z的模 |
angle(z) | 得到复数z的角度 |
conj(z) | 得到复数z的共轭复数 |
创建复数有两种方法,一种是直接声明,一种是调用complex函数声明
1 | clear all; |
其中z4变量的声明之后,我们会发现z4变量的结果是这样的
1 | z4 = |
我们可以看出,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 | A = |
eye语句
生成一个3*3的对角线上为1的单位矩阵
magic语句
magic在matlab中用来生成n阶幻方,比如三阶幻方就是1-9九个数字,组成一个3*3的矩阵,使得该矩阵无论横、竖还是斜三个方向上的三个数的和总是相同的。
magic(n)生成一个n阶幻方,九十八1-n^2排成一个n*n的矩阵,使得矩阵的每行、每列,以及主副对角线上面的n个数之和都相等
结构体Struct
结构体类似于python的字典,接下来我们初始化一个结构体
1 | books = struct('name',{{'Machine Learning','Data Mining'}},'price',[30 40]) |
运行结果如下
1 | books = |
MATLAB中的矩阵操作
矩阵的定义与构造在matlab中有很多种方式,基本的方式如下
1 | A=[1 2 3 5 8 5 4 6] %此处是直接定义并初始化一个矩阵 |
此外,还有一种比较独特的方式,通过步长从某一个数值开始,一直将最后的满足小于上界的数填入矩阵中
1 | B=1:3:9 |
结果如下
1 | >> B=1:3:9 |
1 | C=repmat(B,3,1) %竖向重复B矩阵3次,横向只重复一次 |
矩阵的四则运算
我们先假定有两个已经初始化完毕的矩阵且他们的行列数都相同
1 | A=[1 2 3 4;5 6 7 8] |
通过计算之后,我们可以得出如下结果:
1 | C = |
矩阵的下标
关于矩阵的下标,有如下几种操作
首先我们创建一个幻方:
1 | A=magic(5) |
接下来通过几种对矩阵A下标进行操作的方式,分别创建出几个分矩阵
1 | B=A(2,3) |
基本操作
1.每一个语句之后要加分号,如果不加分号就会直接输出语句执行结果
2.注释语句ctrl+R
3.取消注释语句ctrl+T
4.clear:清除工作区的所有变量
5.clc:清除命令行的所有文本信息
帮助的使用
help
1 | help %"帮助"总览 |
特殊矩阵
所有元素为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’)

我们可以看到,横轴对应第一个向量[1,3],纵轴对应第二个向量[2,9],且制图线色为红色(red)
函数绘制
1 | fplot(fun,lims) |
字符串fun:指定函数名的函数
lims:x轴区间
首先书写函数文件
1 | function y=Afun1(x); |

对于函数y=tanx以及y=x^2+y^2/4=1类似的图形,可以用ezplot函数进行绘制
1 | ezplot('tan(x)') |
绘制函数样例2
1 | clear all; |
结果

子图绘制
Matlab中,采用函数subplot()进行子图绘制。该函数能够将几个图形在同一个图形窗口中绘制出来,且采用不同的坐标系
样例:
1 | >> x=-pi:pi/10:pi |
结果

subplot(m,n,p)
该函数将当前图形窗口分为m*n个片区,并将其从左往右从上至下排列,p决定将图形绘制在几号片区,不同的绘图片区相互独立,可以绘制完全不一样的图像
1 | %对绘制的坐标系加上边框 |
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 | datacursormode on%打开图形数据光标功能 |
效果如下

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

三维图形
绘制三维曲线
1 | plot3(x,y,z) |
这里x,y,z都是n维向量,分别表示该曲线上点集的横坐标、纵坐标、竖坐标
例:在区间[0,10pi]画出参数曲线x=sint,y=cost,z=t,并分别标注
1 | t=0:pi/50:10*pi; |
图像

对数和半对数坐标系绘图
在Matlab中,可以采用函数semilogx()进行绘图,其中x轴采用对数坐标,y轴采用等比例刻度坐标。该函数的调用方式和函数plot相同,唯一不同的是x轴采用对数坐标
Matlab代码
1 | >> x=0:0.1:8; |
结果

二元函数
例:函数z=sin(xy)/xy
Matlab程序
1 | [x,y]=meshgrid([-3:0.2:3]); |
图像

旋转曲面

Matlab程序如下
1 | x=0:10:600; |
图像

Matlab程序
1 | >> alpha=[0:0.1:2*pi] |
图像

柱状图
通过函数bar()绘制柱状
Matlab与高等数学
P.s 在matlab与高等数学中,对于极限以及导数等,对其中例如x的变量需要做符号变量定义
1 | syms x |
求极限
Matlab中,求极限的命令为
1 | limit(expr,x,a) |
其中,limit(expr,x,a)表示求符号表达式expr关于符号变量x趋近于a时的极限;limit(expr)表示求默认变量趋近于0时的极限
例如:

结果
1 | 1.ans=1 |
求导数
Matlab中,同样还可以求导数,命令为
1 | diff(expr) |
其中,diff(expr)表示求表达式expr关于默认变量的1阶导数;diff(expr,v,n)和diff(expr,n,v)都表示求表达式expr关于符号变量v的n阶导数
1 | >> syms x |
求极值

1 | >> syms x |
结果
1 | dy_zero = |
求不定积分
Matlab求符号函数不定积分命令:
1 | int(expr) |
代码
1 | syms x |
级数求和
Matlab求级数和命令为:
1 | r=symsum(expr,v) |
其中,expr为级数的通项表达式;v是求和变量;a和b分别是求和变量的起始点和终止点,若没有指明a和b,则a的默认值为0,b的默认值为v-1
例如:
1 | syms n |
求单变量非线性函数在区间上的最小值
fminbnd函数
求minf(x)
例如:求函数f(x)=(x-3)^2-1,0<=x<=5
编写M函数fun6.m
1 | function f=fun6(x); |
求多变量非线性函数在区间上的最小值
Matlab标准式
编写M函数fun7.m定义目标函数
1
2function f=fun7(x,s);
f=sum((x-0.5).^2);编写M函数fun8.m定义约束条件如下
1
2
3
4
5
6
7
8
9
10
11
12
13function[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,'+');调用函数fseminf
1
2x0=[0.5;0.2;0.3];%如果初始值去的不合适,可能得不到可行解
[x,y]=fseminf(@fun7,x0,2,@fun8)
求函数取极小-极大值时的x值
fminimax函数
Matlab标准式
其Matlab命令为
1 | [x,fval]=fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) |

编写M函数fun9.m定义向量函数如下
1
2
3
4
5
6function 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];调用函数fminimax
1
[x,y]=fminimax(@ fun9,rand(2,1))
插值拟合
Matlab代码
1 | %一维多项式插值 |
插值方法 | 运算时间 | 占用内存 | 光滑程度 |
---|---|---|---|
临近点插值 | 快 | 少 | 差 |
线性插值 | 稍长 | 较多 | 稍好 |
三次样条插值 | 最长 | 较多 | 最好 |
三次Hermite插值 | 较长 | 多 | 较好 |