Matlab学习笔记

注:此笔记为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列
    • 矩阵在Matlab中的存储方式实际上是列向量相连的形式,因此也可以进行线性索引: A(k):先从上往下,再从左往右数第k个;例如,A(2)=4,A(4)=2
      线性索引不是很直观,但在操作与矩阵形状无关时有用,例如,求矩阵的元素和:x=sum(A( : )),将矩阵的所有元素乘2:A( : )=A( : )*2(虽然更加方便的做法是直接使用A=A*2)
    • 可以输入列表:例如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混用

    • 除此之外,colon两侧省略单侧则表达到头,省略两侧则表示全部: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的矩阵A reshape成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 x^2\sin(x)dx$$’,需要调用latex编译器:str=‘$$\int_0^2 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

image-20210731123817552

常用图表类型:

  • 对数图:

    • 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( p );积分:polyint( p );乘法: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)

  • 递归

你可能感兴趣的:(学习笔记,matlab,学习笔记)