注:此笔记为B站上台大郭彦甫老师的教学视频的笔记,链接附在下面:
https://www.bilibili.com/video/BV1GJ41137UH?from=search&seid=2186999109437495567&spm_id_from=333.337.0.0
此笔记比较简略,适用于对编程语言已经有一定了解(例如已经至少掌握C++/python)的同学学习。对于python的numpy/matplotlib库熟悉会对Matlab的系统操作方法有很大帮助。
Matlab入门教学
Introduction
Matlab:Matrix Laboratory
- 高级编程语言
- 简单的可视化
- 目标:学习使用MATLAB,写代码,解决工程问题
内容
Lecture 1 基本操作与矩阵
Command Line:基本功能(as计算器)
-
Operator:±*/^()
-
cos,sin,ln,要用的符号自己查,matlab online help,内部search亦可
-
embedding functions:用变量存储计算结果,然后再对变量作用函数
-
matlab中新建变量无需声明类型,直接赋值即可,区分大小写没有数字
- matlab中的变量类型
- 一般默认double,别的之后再学
-
who,whos:查看此前定义的变量/+取值
-
关键字:i,j,Inf,eps(非常小),NaN,ans,pi/ build-in function
-
把一个变量从workspace中消除:clear XXX,如果不加XXX就全都清空了
-
format指令:变量值显示方法,如:format+long/short/shortE/…/rat(分数)
-
在输入指令的时候:
- 在最后加分号:不会在该行显示计算结果
- 按 ↑ \uparrow ↑的时候可查看上一条输入的指令
Array and Matrix
-
行向量:a=[1 2 3 4],列向量:a=[1;2;3;4](;:换行),空向量:[]
-
矩阵:A=[1 2 3; 4 5 6; 7 8 9]
-
Indexing:索引
- a(2):第2个数(从1开始计数),A(1,2):第1行第2列
- A(k):从上往下,从左往右数第k个;例如,A(2)=4,
可以输入列表:例如A([1 2; 3 4])=[A(1) A(2); A(3) A(4)]=[1 4; 7 2] - A([1 3], [1 3]):取第1,3行,第1,3列组成的submatrix
-
矩阵局部赋值:寻找索引之后赋值即可
-
colon operator:[i:k]=[i,i+1,…,k];[i:j:k]=[i,i+j,…,i+lj<=k],也可以和char混用
- 除此之外,还能表示全部的意思:A(3,:):取出矩阵A的第三行
- 清空第三列:A(3,:)=[]
-
串联数组:[A B]:行串联 [A;B]:列串联
Array Manipulation
-
矩阵基本运算:
- +;-
- *;/(乘以逆矩阵)
- .*:直接把每两个对应的元素乘在一起;./:同理,对应元素除在一起
- 矩阵和实数运算:对每个元素都和该实数做运算,eg:A+/-/*//a
- ‘:transpose,转置
-
特殊矩阵:
- eye(n):n*n单位矩阵
- zeros(n1,n2):零矩阵
- ones(n1,n2):纯1矩阵
- diag([a1,…,an]):对角矩阵
-
特殊函数:
- max(A):每个列的最大元素组成的行向量
- max(max(A)):最大元素
- min:完全同上
- sum(A):每个列的元素和组成的行向量;mean(A):同理
- sort(A):把每个列按从小到大排序;sortrows(A):把行看成一个整体,按字典序排序
- size(A):返回[行数 列数];length(A):max(行数,列数); width(A):min
Lecture 2 Matlab程序编写
Script Writing(脚本编写)
-
New Script: 新建一个程序,独立成一个视窗;F5/运行
-
fx:提醒要用的function的名称
-
调试:
-
注释:%,多行选中用右键command;%%XXXX%%:划分区块,可以只run一个区块
-
其它包括断点用法和C++一样;在端点处停止的时候可以看当前workspace的状态
-
选中右键:smart indent,自动缩进
-
-
执行
-
Matlab是一个脚本语言:按行的顺序执行程序;否则我们就要使用structured programming,例如循环
-
if,elseif,else; for,switch,case,otherwise; try,catch; while; break,continue,end,pause,return(和C++真的很像,但是条件判断后面要加end)
一些细节:
-
switch xxx
case xxx
statement
otherwise
statement
end
-
for n=start:increment:end,incre=1时可以省略
end
-
注意在执行新程序之前先把旧的workspace清空,防止变量名干扰
-
-
逻辑判定:<,<=,>,>=,==,~=,&&(只有这两个和Cpp不一样)||
-
输出:disp()
-
程序加速:预分配大小(经典操作)
-
计时:tic/toc
-
-
-
Tips:
- clear all:清除原来的所有变量;close all:关闭所有图像
- 换行号:…
- 在command界面按ctrl+C:终止当前运行的程序
函数
-
fuction y=name(x),x输入,y输出
-
local variables
-
新建一个脚本,在里面写上函数,然后保存到文件夹里面,就能用了
-
在编写函数脚本的时候注意输入是否可能是向量,如果是的话做运算的时候需要使用.*等算符
-
多个输入和输出:function [a1 a2 a3]=name(b1,b2,b3,b4 )
-
多类输入:类似C++的重载:
- nargin:判断输入的数量,如果不足可以补一个default
- nargout:同理
- varargin:判断输入的大小
- varagout:同理
-
function handle:指向函数的指针:
f=@(x) exp(-2*x);:输入x,对x执行exp(-2*x)
Lecture 3 Variables and Data access
常用的变量类型
-
强制类型转换:数据类型+() a=int8(10)/double(b)/…
-
numeric:int8, int32,…,uint8(unsigned),double
-
character:字母,s1=‘h’,ASCII
-
string:字符串,s1=‘wdnoifnow’
- 加长:s3=[s1 s2],可见字符串在mat里面的存储方式就是一个char数组
- 字符串切片:str(4),str([1 2 4 4])等,也可以通过切片直接对str对应位置赋值
- 注:str==‘a’会返回每个位置上是否等于a的一个逻辑数组
- 技巧:如果要把str里面的‘a’全换成‘z’,使用str(str==‘a’)=‘z’
-
structure(结构体)
- variable.subvar=:把variable看做一个结构体
- variable的indexing:variable(n).subvar(事实上创建variable的时候就默认是一个数组了)
- field:subvariables的统称,操作:删除:rmfield(var,subvarname)
-
cell(阵列)
-
在矩阵的每个单元里面放不同的数据类型,可以是矩阵
-
声明:{},两种用法,等价于:A(1,1)=&fewbfn
- A(1,1)={fewbfowie}
- A{1,1}=fewfiewfoi
-
实现:构造一个指针矩阵即可
-
读取:A(1,1):&fewbfn; A{1,1}:fewbfn,是不一样的
数据矩阵=>cell:num2cell;分块=>cell:mat2cell
-
-
多维数组
-
三维:row,col,layer三级索引,很复杂
-
辅助指令:cat() concatenation
A,B为待接矩阵,cat(1,A,B)=AB按行接([A;B]);cat(2,A,B)=AB按列接([A B]);cat(3,A,B)=AB按层接,以此类推
=>先建好各层的矩阵,然后按层搭建起来
-
reshape:把n*m的矩阵Areshape成i*j的矩阵,cell也能用
reshape(A,i,j)
-
-
数据类型检测:isxxx(var)
File Access(存储/读取文件)
-
load&save
-
save filename.mat (-ascii(加上则可以使用文本编辑器打开))
-
load data:load(‘filename.mat’,(’-ascii’加上则对应文本编辑器的格式)
-
-
excel files
-
xlsread(‘excelname.xlsx’ (,’B2:D4’:指定读取范围))
但是只会读取数字部分,文字的部分会自动去掉
-
xlswritre(‘filename.xlsx’,variable,sheet, ‘E2:E4’(指定写入位置)),这时候可以写入字符串
-
-
low-level File I/O
- 读取必需品:fid(file ID)& pointer
- fid=fopen(‘filename’,’permission’(r,w:读&写))
- 写:fprintf(fid,’格式’,varname),其中格式与Cpp的printf要求相同
- 检测结尾:feof(fid)
Lecture 4 绘图初阶
绘图原理
-
电脑看不懂函数
- 基本思维:插值+平滑/分段
-
h=plot(x,y):把所有点对(xi,yi)绘制出来
做新的plot的时候会默认覆盖原来的内容,除非使用指令
hold on +hold off,则在中间的所有plot都会保留在figure上面
-
图像的style调整:plot(x,y,’str’),str依次由以下部分组成
- Data markers:数据点的表示:‘.’,’*’,’+’,‘o’,’x’等
- Line types:线的描绘:‘-’,’–’,’:’等
- Color:颜色:黑k蓝b红r绿g黄y……
-
串联:plot(x,y,’bd-’,x,h,’gp:’,x,w,’ro-’,…)
-
legend():图标
legend(‘L1’,’L2’,’L3’):按串联顺序制造注记with name
-
title(), xlabel(), ylabel():给坐标轴和整个图起名字
数学符号命名:\pi or e^{-x}
插入文本:LATEX表示:‘$$\int_0^2 x2\sin(x)dx$$’,需要调用latex编译器:str=‘$$\int_02 x^2\sin(x)dx$$’,text(placex,placey,str,’Interpreter’,’latex’)
-
-
figure adjustment:关键:组件的调整
-
对象:figure, axis, line (plot)
-
属性:font, fontsize, linewidth, axislimit, tickposition, ticklabel
-
在画出的图上点击Edit编辑属性即可
-
要提供object的handle,然后modify properities
-
get:取出property
h=plot(x,y);get(h):取出line的性质
get(gca):取出axis的性质
-
set:改变property
set(gca/h, ‘propertyname’, modified value)
-
还可以直接在属性编辑器窗口里面改变数值,不过代码生成的图像相对比较连贯,属性编辑器比较时候做数据计算出来之后的一些微调
-
-
-
多图
-
figure,plot(x,y1); figure,plot(x,y2);
-
注意:这时候使用gca和gcf只能传回最新的图的属性
-
一个figure中画多个图:
-
subplot(m,n,x):图矩阵的row,col,第x个
-
axis equal:x,y间距等距
axis square:x,y跨度相等
axis normal:图看起来比较正
注:只能操作最新的
-
-
-
图像的存储:
-
saveas(gcf,’filename’,’formattype’);
位图:‘jpeg’,’png’
矢量图:‘pdf’,’eps’
-
Lecture 5 2d&3d pictures
常用图表类型:
-
对数图:
- x=logspace(a,b,space)
- semilogx(x,y)(x对数),semilogy(x,y)(y对数),Loglog(x,y)(x,y都是对数)
-
双y图:
- plotyy(x,y1,x,y2)
- 改变label:查罢
-
条形图:
- bar就完了,可以输入矩阵,得到平行条形图
- bar(y,’stacked’)
-
fill():在一个封闭点用直线连接围成的区域内填充某个颜色
-
color space:RGB配色:
[R G B],0~255
-
imagesc()
- 色彩构成另外一个维度
- 三维图=二维colorbar图:imagesc(z)+colorbar(颜色轴);调整色系colormap(Name), 是一个巨大的RGB数组
3D图
-
三维曲线:plot3(x,y,z1,str1,x,y,z2,str2,…)
-
三维曲面:
-
meshgrid:创建在给定范围内的x,y值,eg:[x,y]=meshgrid(a:space:b,c:space:d),返回的是两个矩阵,在对应点取得对应的数值
-
surf(x,y,z):用小正方形拟合曲面;mesh(x,y,z):用色块拟合曲面;contour(x,y,z):对z做切片;meshc/surfc:在下面多画一个contour
-
-
三维物体:
-
view(a,b):选取某个角度看三维物体
-
light(‘Position’,[a,b,c]):打光位置
-
patch(‘Verices’,v):以矩阵v指定的位置的凸包绘制多边形
-
Matlab的工程应用
Lecture 1 微积分
微分
-
多项式
- 表示:向量 p=[1 0 -2 -5]
- 求值:polyval(a,x); a是多项式向量,x是要求值的区域,可以是向量,此时返回的结果就是一个向量
- 求导:polyder§;积分:polyint§;乘法:conv(a,b)
-
数值微分
-
diff():计算一个vector之间前后数值的差异
diff([1 3 5 2 1])=[2 2 -3 -1]
-
一列点的横坐标x,纵坐标y,则slope=diff(y)./diff(x)即为这些点之间的斜率
-
给定f,求f在a:h:b上的数值微分:
m=diff(f(a:h:b+h))/h
数学表示:f’(x)=diff(fx)./diff(x),这样间距可以不同
注意diff会减少一个数量,因此plot的时候横坐标应该使用x(1:end-1)
-
-
数值积分
-
中点公式/梯形公式
-
中点公式:
- midpoint: mid=(x(1:end-1)+x(2:end))/2
- sum(h*f(mid))
-
梯形公式:
- h*trapz(f(x)), trapz:梯形,相当于做梯形后加起来
-
Simpson:
- 1/3(f0+4f1+f2)
-
Matlab内嵌函数
-
fuction handle(函数指针):
- 作用:在函数中作为输入,如xy_plot(input, x), 然后input @sin
- 使用:@sin(x)=sin(x)
-
数值积分函数:integral()
-
输入函数指针和积分区间即可
-
函数指针的建立:y=@x 1./(x.^3-2.*x-5);
-
多元积分:f=@(x,y) y.*sin(x)+x.*cos(y);
integral2(f,a,b,c,d),[a,b]是x的积分区间,[c,d]是y的积分区间
-
Lecture 2 方程式求根
Symbolic Approach(符号方法)
-
定义符号变量:syms x,也就是x不是变量,而是一个符号
-
这时候可以定义方程:y=sinx+x^2;
-
solve()函数:对于给定的方程求根:solve(y,x),前者是equation,后者是symbol,自动求解y=0时x的值,返回一个向量
-
多元方程组:syms x,y; eq1=…; eq2=…; A=solve(eq1,eq2,x,y);返回一个structure, A.x和A.y就是对应的各组解中x,y的值
-
含参方程组:syms x,arg1,arg2,… A=solve(eq1,…,x)(用别的参数表示x),其中equation不能直接用字符串表示(后来移除了这个功能)
-
含参微分:在含参数的情况下,diff(f,y/x)也能计算其微分,但是只能求偏导
-
含参积分:z=int(y)会求积分,但是后面的常数是随便加的,要减掉就使用z-subs(z,x,0)(在z中代入x=0)
-
-
数值求解
-
f2= @(x) (1.2*x+…)
fsolve(f2,0),后面的值是猜测的初值(牛顿法,比较难收敛)
fzero(f2,0)(二分法,在f和x轴相切时解不出来)
-
进阶:options=optimset(‘MaxIter’,val1, ‘TolFun’, val2)
fsolve/fzero(f,initval, options),可以设定初值条件
-
polynomial专用:roots(polynomial vector)
-
-
递归