1. 前言
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
读研以来,耳边不时听到“matlab”,被老师和同学普遍推崇。今天,郝同学就来学习一下matlab的基础操作。
2. 基础设置
显示类型
计算圆面积时,面积的结果显示,默认是short类型(保留小数点后4位),我们可以通过设置为long类型,来显示更精确的结果。
1)通过命令设置format long
,这种设置方式临时性的。
2)通过界面设置
File,Preferences,Command Window,Numeric format选择long,之后Apply即可。
清屏
清屏命令:clc
清数据
清数据命令:clear
修改变量
在workspace中,双击变量,可以在图形化界面修改变量值。
绘图
在workspace中,单击变量,然后点击plot。
查看变量信息who
,whos
,whos a
重新执行命令
在command history中,找到一条命令,右键选择evaluate selection。
保存变量save a
,保存变量到当前工作路径,文件名为a.mat。
加载数据文件load a
或者load a.mat
。
编辑器窗口edit
,打开编辑窗口,新建matlab程序。
图像窗口figure
GUI窗口guide
添加搜索路径
File,Set Path,Add Folder。
设置初始路径
右键matlab快捷方式,在快捷方式选项卡中,修改起始位置。
查找函数路径which sin
3. 设置默认编码
中文时,Matlab默认编码格式为GB2312。使用sublime打开文件,显示乱码,郝同学想把Mablab默认编码修改为UTF-8。
1、在Matlab安装目录下的bin目录下(例如D:\Program Files\MATLAB\R2010b\bin
),找到lcdata.xml文件。
2、在matlab中,输入命令feature('locale')
,查看当前使用的编码。
3、编辑lcdata.xml,找到如下一段:
1 | <locale name="zh_CN" encoding="GB2312" xpg_name="zh_CN.GB2312"> |
修改为:
1 | <locale name="zh_CN" encoding="UTF-8" xpg_name="zh_CN.UTF-8"> |
然而,修改后重启,matlab依然使用GBK编码。而且,把.m文件转换成UTF-8格式后,Matlab中会出现乱码。
无奈,从另一个方面入手,让sublime支持GBK编码文件,安装插件ConvertToUTF8即可。
4. Matlab语言基础
4.1. 变量和常量
matlab遵循弱类型语言的变量初始化和赋值语法,和python基本相同。
输入数据x = input('请输入数据')
,输入数据后,数据存入x。
默认赋值
如果输入数值,没有赋值给变量,那么默认赋值给内置的ans变量。
4.2. 基本数据结构
输入行矩阵a = [1 2 3]
或a = [1,2,3]
输入列矩阵b = [1 2 3]'
或b = [1,2,3]'
或b = [1;2;3]
输入2*2矩阵c = [1 2; 3 4]
输入特定值矩阵d(2,3) = 8
,生成2*3的矩阵,第二行第三列的元素为8,其他元素为0。
内置函数生成矩阵ones(4)
,生成4*4的矩阵,所有元素为1。
ones(4,3)
,生成4*3的矩阵,所有元素为1。
zeros(4)
,生成4*4的矩阵,所有元素为0。
zeros(4,3)
,生成4*3的矩阵,所有元素为0。
eye(4)
,生成4*4的单位矩阵。
eye(4,3)
,生成4*3的矩阵,前三行前三列组成单位矩阵,第四行为0。
magic(4)
,生成4*4的魔方数组。
冒号表达式生成矩阵3:9
,生成3到9的行向量,增量为1。
3:2:9
,生成3到9的行向量,增量为2。
(3:9)'
,生成3到9的列向量,增量为1。
读取矩阵数据a = [1 2 3]
,a(2)
,读取第二个数据。
c = [1 2; 3 4]
,c(1,2)
,读取第一行第二列的数据。
c(:,2)
,读取二列的数据。
c(1,:)
,读取第一行的数据。
k = [1 2 3;4 5 6;7 8 9;10 11 12]
,k(2:4,2)
,读取第二列中第二行到第四行的数据。
拼接矩阵m = [c,c]
,横向拼接两个c矩阵。
n = [c:c]
,纵向拼接两个c矩阵。
矩阵函数size(n)
,返回行列数。
length(n)
,返回行数和列数中的较大者。
4.3. 空数组和子数组
空数组nullmatrix = []
,创建空数组。
子数组magicmatrix = magic(4)
,child = magicmatrix(3,[2,4])
child = magicmatrix(3,2:end)
magicmatrix(3,2) = 3
,单个元素赋值。
等差数列linspace(1,99,50)
,生成1到99的50个数,等差为2。
等比数列logspace(1,3,3)
,生成10 100 1000三个数。
数组变形1:1:9
,reshape(ans,3,3)
,按列排列变形成为方数组。
4.4. 时间变量
data
,clock
,year(now)
,month(now)
,day(now)
,day(today)
4.5. 算术运算符
标量运算
正常加减乘除,和python基本相同。需要注意的是5/6
代表5除以6,5\6
代表6除以5。
5^2
和power(5,2)
都是代表5的平方。
矩阵运算A=[1 2 3; 4 5 6; 7 8 9]
,B=magic(3)
A+B
,A-B
,A*B
,A+3
,A*3
inv(B)
,求B矩阵的逆矩阵。
A/B
和A*inv(B)
相同。
A.*B
,对应位置相乘。
4.6. 运算函数
matlab的运算函数包括幂次方、指数与对数函数、三角与反三角函数等等。
幂次方
幂次方的符号就是常用的^记号。指数部分可以是任意数。2^2
,2^(-1)
,2^(1/2)
,2^(1.25)
指数与对数
科学与工程领域惯用「标准指数函数」,也就是以e为底的指数函数。其中,e是一个无理数,大约等于2.71828。Matlab并不提供e这个常数,而是以函数exp()来计算以e为底的指数函数。exp(1)
Matlab 分别提供三个函数 log()、log10()和log2(),分别表示以e为底的对数(自然对数),以10为底
的对数(常用对数),以2为底的对数。log(exp(2))
,log10(100)
,log2(4)
,答案都是2。
三角与反三角函数
六个三角函数在Matlab 中对应的函数分别为:
正弦:sin()
余弦:cos()
正切:tan()
余切:cot()
正割:sec()
余割:csc()
六个反三角函数在Matlab 中对应的函数分别为:
反正弦:asin()
反余弦:acos()
反正切:atan()
反余切:acot()
反正割:asec()
反余割:acsc()
需要注意的就是使用三角函数时,角度的单位是“弧度”。
复数
Matlab 的所有运算符号、所有函数,都懂得如何做复数计算。sqrt(-1)
abs(3+4i)
4.7. 微积分
极限
求极限是微积分的基础,求极限的函数limit。limit(f,x,a)
,x趋近于a时,f 的极限。limit(f,x,a,'left')
,x左趋近于a时,f 的极限。limit(f,x,a,'right')
,x右趋近于a时,f的极限。
微分diff(f,t,n)
,求f 对独立变量t的n次微分值。
积分int(f,'t',a,b)
,求f 对独立变量t 在积分区间[a,b]的积分值。
级数
自变量v在[a,b]之间取值时,对通项s求和,用函数symsum(s,v,a,b)
。
4.8. 方程求解
代数方程solve(f)
solve(f,a)
常微分方程dsolve('常微分方程式','初始条件','自变量')
5. 可视化
5.1. 二维平面图形
5.1.1. 折线图
plot(x,y)函数,x,y是维度相同的序列或向量。
1 | x=[0 1 2]; |
用300段折线画出sin(x)在[-pi,pi]区间内的折线图。
1 | x = linspace(-pi, pi, 301); |
如果要画多条曲线,也可以用plot函数。
1 | x=0:pi/10:2*pi; |
图形是以公共的x元素为横坐标值,y1、y2为纵坐标值绘制曲线图的。如果想要图形更加完美,我们可以用一些特殊的图形函数对它进行修饰。
1 | xlabel('独立变量X'); |
如果只给plot()一个参数,例如plot(y),而y是一个n维向量或列,则它的效果就相当于plot((1:n), y)。
1 | y = [ 1 4 0 2 3 5]; |
5.1.2. 多重折线图
Matlab在一张图片上可以重复制图。基本上,画一张图的指令,将会自动清除前一张图。但是,如果下了指令hold on,将不会清除前一张图,而是重复画上去。下了hold on指令的所有图将会重迭在一张图片里,直到你下了hold off为止。
我们以 300 个折线段,在一张图片中,画出以下三个函数在[-pi, pi]区间内的曲线图:
sin(x),cos(x),x。
1 | x = linspace(0, 2*pi, 301); |
我们还可以采用图形窗口分割的方法,在同一个视图窗口中画出多个小图形。这时要用到subplot(n,m,k)。如果写subplot(2,2,1),即就是把图形窗口分割成2行2列,在第1个位置(第1行第1列)画图。
1 | x = linspace(0, 2*pi, 301); |
Matlab对数据是按列存储和计算的。
5.2. 三维立体图形
5.2.1. 三维曲线图
plot3函数调用格式:plot3(x1,y1,z1,x2,y2,z2,…)。其中x1,y1,z1,x2,y2,z2…等分别为维数相同的向量,分别存储着曲线的三个坐标值。
绘制方程在t=[0,2π]的空间方程。
\begin{cases}
x=t \
y=sin(t) \
z=cos(t)
\end{cases}
1 | t=0:pi/10:2*pi; |
5.2.2. 三维网格图和曲面图
Matlab在绘制三维网格图与曲面图时,往往先将要绘制图形的定义区域分成若干网格,然后计算这些网格节点上的二元函数值,最后才能使用mesh和surf函数绘制相应的图形。生成网格矩阵使用meshgrid函数,其调用格式为:
1 | [U, V]=meshgrid(x,y) |
函数说明:利用向量x和y生成网格矩阵U和V,以便mesh和surf等函数用来绘图。其中x、y分别是长度为n和m升序排列的行向量。
生成的方法是将x复制n次生成网格矩阵U,将y转置成列向量后复制m次生成网格矩阵V。坐标(uij,vij)表示xoy平面上网格节点的坐标,第三维坐标zij=f(uij,vij)。
例:给定向量x=[1 2 3 4],y=[10 11 12 13 14],试由向量x、y生成网格矩阵。
1 | x=[1 2 3 4]; %输入向量x |
Matlab提供了一个peaks函数,可产生一个凹凸有致的曲面,包含了三个局部极大点及三个局部极小点。在matlab中输入peaks()
、peaks(5)
就可以看到效果。
例:在 -4<x<4,-4<y<4
上绘制 $z=x^2+y^2$ 的三维网格图。
1 | [x,y]=meshgrid(-4:4, -4:4); %定义网格数据向量x,y |
5.2.3. 观察点
函数view(azinmuth,elevation)
azinmuth:方位角。观察点与坐标原点的连线在水平面上的投影和y轴负方向的夹角。(在水平面上)
elevation:仰角。观察点与坐标原点的连线和水平面的夹角。(与水平面垂直)
使用循环和观察点设定来实现动画效果。
6. Matlab程序设计
6.1. 命令文件
Matlab提供两种源程序文件格式:命令文件和函数文件。这两种文件的扩展名相同,均为“.m”,又称为“M文件”。
命令文件的执行方式:在提示符后键入命令文件的文件名。
命令文件适合于用户做需要理解得到结果的小规模运算。
6.2. 函数文件
函数文件由function语句引导。
其格式为:
1 | function [返回变量列表]=函数名(输入变量列表) |
1、新建一个求阶乘的函数文件myFunc.m:
1 | function value = myFunc(n); |
2、重写求阶乘的函数文件myFunc2.m:
1 | function value = myFunc2(n); |
3、重写求阶乘的函数文件myFunc3.m:
1 | function value = myFunc3(n); |
4、新建传入数值显示结果的函数文件showNum.m:
1 | function showNum(input_var); |
7. 源码分享
https://github.com/voidking/matlab-start.git
8. 书签
Matlab视频教程
http://www.51zxw.net/list.aspx?cid=456
我的学习资料
http://pan.baidu.com/s/1bp1oyXT
Mathjax与LaTex公式简介
http://mlworks.cn/posts/introduction-to-mathjax-and-latex-expression/