zoukankan      html  css  js  c++  java
  • matlab基本使用指南

    资源下载: 点击链接 提取码:ujbb

    一、MATLAB介绍与使用

    1.1 matlab功能

    • 数值和符号计算
    • 绘图
    • 一种语言体系
    • 工具箱(toolbox)(功能性、科学性)

    1.2 文件

    分类:

    • 命令文件(脚本文件)
    • 函数文件

    区别:

    • 命令文件没有输入,没有返回;
    • 命令文件可以有对工作空间的变量操作,结果返回工作空间,而函数文件中的变量为局部变量,函数执行完毕,变量被清除;
    • 命令文件可以直接运行,函数文件见需要调用的形式运行(除了特殊的函数文件指外);

    函数文件 (M文件)

    基本结构:

    • function [ 输出形参 ] = 函数名 ( [ 输入形参 ] ) (中括号内容可省)
    • [注释说明]
    • [函数体]

    关于函数文件名:

    • 通常和函数名一致,如果不一致,那么忽略函数名,调用时使用函数文件名

    注释:

    多行注释:选中要注释的若干语句,编辑器菜单Text-<Comment,或者快捷键Ctrl+R
    取消注释:选中要取消注释的语句,编辑器菜单Text-<Uncomment,或者快捷键Ctrl+T
    

    函数参数可调标识变量:

    nargin
    nargout
    varargin
    varargout
    可以完成传递参数的可调功能,类似于高级语言中的函数重载和多态;
    前两者为输入输出参数个数,后面两个可以代表未知的输入输出变量;
    

    例如:

    % 函数
    % nargout的使用
    function [a,b]=fun(c,d,e,f)
    
    if nargout==2
        a=c+d+e+f
        b=c*d*e*f
    else
        a=c+d+e+f
    end
    
    % 结果
    >> fun(1,2,3,4)
    ans =
        10
    >> [a,b]=fun(1,2,3,4)	
    b =
        24
    
    % varargin使用
    function re=fun(a,b,varargin)
    if nargin == 2
        re=a+b;
    elseif nargin==3
        c=varargin(1);  % varargin为cell数组,对其的引用为改为{}即可正确运行
        re = a + b + c;
    else
        error('wrong'); % 一般会写具体的错误信息 便于查找
    end
    
    >>  fun(1,2,3)
    varargin =
      1×1 cell 数组
        {[3]}
    未定义与 'cell' 类型的输入参数相对应的运算符 '+'。 %出现错误的原因是varargin为cell数组,对其的引用为{}
    出错 fun (line 7)
        re = a + b + c;
    
    >>  fun(1,2,3)
    ans =
    	  6
    

    1.3 全局变量

    ​ 使用global声明,可以提供不同的M文件访问同一个变量。
    ​ 不同的函数之间访问同一个变量,可以通过返回参数来设置,或者使用全局变量。在GUI中,也可以通过其他方式完成(GUI数据,app数据等);

    1.4 程序调试

    1、根据错误提示确定错误内容

    2、断点和单步

    二、数据操作

    2.1 变量和语句

    变量命名

    • 字母开头,包括字母、数字、下划线,区分大小号;
    • 不声明,不定义,拿来即用

    语句

    • 回车则表示一句结束,末尾无分号,则输出该句执行的结果,末尾有分号,只执行,不输出;
    • 注释以%开头丧示;
    • 一行写不开,用…续行,否则默认这一句已经完毕;

    工作空间中驻留的变量查看

    • 工作窗口显示
    • 命令方式: who whos

    清除变量

    • clear命令

    保存数据

    • save命令save[文件名][变量名][-append][-ascii]

    数据输出

    • format函数使用 format 格式符
    • 之影响数据输出格式,不影响计算和存储
    • 默认输出格式为short格式

    2.2 数据类型

    2.2.1 数值型数据

    建立

    a=1 %建立double型数据a,值为1

    转换

    b=uint(a); %a转化为uint8类型(无符号整型,8位)复制到b中,执行结果a类型不变

    2.2.2 字符串

    建立

    使用 ’ ’ 括起来的字符

    str='this is a string'

    c='a'

    操作

    1、获取字符ascii值

    double('a')或者abs('a')

    2、ascii转化为字符输出

    char(63)

    3、执行字符串内容

    eval('t=1') %将字符串't=1'作为matlab语句执行,即将1复制给变量t

    4、字符串和数值的互换

    在matlab中的输入默认为字符串类型,若要将其变成数值,可str2num('1234')

    将数值变成字符串num2str(1234)

    不过,2016a版本的matlab好像会根据你的输入自动区分了

    2.2.3 结构体

    建立

    % input
    a.x1=1
    a.x2=2
    % output
    a = 
      包含以下字段的 struct:
        x1: 1
        x2: 2
    

    结构体操作

    1、判断是否为结构体

    isstruct( )

    2、返回所有成员的成员名

    filenames()

    2.2.4 单元

    建立

    使用{ }括起来建立

    a={1,'str',[11 12 13 14]};

    三、矩阵

    3.1 矩阵建立

    3.1.1 普通矩阵的建立

    1、直接输入法

    • 在命令窗口直接输入矩阵元素;
    • 按行输入矩阵元素,同一行元素使用空格或者逗号隔开,不同行元素使用分号或者回年作为间隔;
    >> a=[1 2 3]
    a =
         1     2     3
    >> a=[1,2,3,4]
    a =
         1     2     3     4
    >> a=[1,2,3;4,5,6]
    a =
         1     2     3
         4     5     6
    

    2、M文件建立矩阵

    在m文件中输入类似于直接输入法的语句,运行文件即可;

    3.1.2 特殊矩阵的建立

    1、零矩阵建立

    >> zeros(4)
    ans =
         0     0     0     0
         0     0     0     0
         0     0     0     0
         0     0     0     0
    >> zeros(3,4)
    ans =
         0     0     0     0
         0     0     0     0
         0     0     0     0
    

    2、幺矩阵建立

    同0矩阵,把zeros改成ones即可;

    3、单位矩阵建立

    >> eye(10,10) %若只有一个参数,默认方阵
    ans =
         1     0     0     0     0     0     0     0     0     0
         0     1     0     0     0     0     0     0     0     0
         0     0     1     0     0     0     0     0     0     0
         0     0     0     1     0     0     0     0     0     0
         0     0     0     0     1     0     0     0     0     0
         0     0     0     0     0     1     0     0     0     0
         0     0     0     0     0     0     1     0     0     0
         0     0     0     0     0     0     0     1     0     0
         0     0     0     0     0     0     0     0     1     0
         0     0     0     0     0     0     0     0     0     1
    

    主对角线元素为1;

    4、随机矩阵

    >> rand(10,2)
    ans =
        0.1576    0.6557
        0.9706    0.0357
        0.9572    0.8491
        0.4854    0.9340
        0.8003    0.6787
        0.1419    0.7577
        0.4218    0.7431
        0.9157    0.3922
        0.7922    0.6555
        0.9595    0.1712
        
    >> randn(10,2)  %服从正态分布
    ans =
        0.8884   -0.1022
       -1.1471   -0.2414
       -1.0689    0.3192
       -0.8095    0.3129
       -2.9443   -0.8649
        1.4384   -0.0301
        0.3252   -0.1649
       -0.7549    0.6277
        1.3703    1.0933
       -1.7115    1.1093
    % 从a到b之间分布的随机数
    % s=a+(b-a)*rand
    >> 0+10*rand(10,2)
    ans =
        2.7603    7.5127
        6.7970    2.5510
        6.5510    5.0596
        1.6261    6.9908
        1.1900    8.9090
        4.9836    9.5929
        9.5974    5.4722
        3.4039    1.3862
        5.8527    1.4929
        2.2381    2.5751
    % 产生均值为u,方差为s的正态分布的随机矩阵
    % y=u + sqrt(s)*randn(10,2)
    >> y=0.6 + sqrt(5)*randn(10,2)
    y =
       -1.9669    2.4791
        0.8345   -1.3857
        2.2150    0.8238
        6.3813   -0.6176
       -0.8912    1.2787
        1.0189   -0.7424
        0.4155    1.6956
       -3.7224    2.2533
       -0.3816    4.4279
       -3.4130    0.1659
    

    5、模仿矩阵

    magic(n,m)

    ❗ Hibert矩阵和Toeplitz矩阵以后用到了再说;

    3.1.3 冒号表达式建立向量

    start:step:stop %以start开始,end结尾的步长为step的向量

    3.1.4 linspace建立向量

    linspace(start,end,num) %从start开始,end结尾的含有num(默认100)个元素的向量

    3.2 矩阵操作

    3.2.1 索引矩阵

    可以使用矩阵元素的行标和列标或者矩阵元素的位置索引来索引矩阵元素;

    >> a=[1,2,3;4,5,6;7,8,9]
    a =
         1     2     3
         4     5     6
         7     8     9
     
    >> a(2,3) %输出第二行第三列的元素
    ans =
         6
         
    >> a(6)  %matlab以行为单位显示,但存储以列为单位,多以第6个元素为8
    ans =
         8
    
    >>[m,n]=find(a==8)%查找值为8的元素所在位置
    m = 
    	3
    n =
    	2
    >>ind=find(a==8)
    ind =
    	6
    

    ❗ 序列和下标的转换(需要用到时再补充)

    3.2.2 重排矩阵

    % reshape(a,n,m)函数  将矩阵a重排为n行m列的矩阵
    >> b=reshape(a,9,1)   % <=> b=a(:)
    b =
         1
         4
         7
         2
         5
         8
         3
         6
         9
    

    3.2.3 矩阵的转置

    c=a'

    >> c=a'
    c =
         1     4     7
         2     5     8
         3     6     9
    

    3.2.4 矩阵的拆分

    >> d=a(1:2,2:3) %d为a矩阵第1、2行第2、3列的四个元素; <=> d=a([1 2],[1,2])
    d =
         2     3
         5     6
    

    结尾可用end表示

    3.2.5 删除矩阵

    >> a=[1,2,3;4,5,6;7,8,9]
    a =
         1     2     3
         4     5     6
         7     8     9
    
    >> a(8)=[]  %删除第8个值
    a =
         1     4     7     2     5     8     3     9
    
    >> a=[1,2,3;4,5,6;7,8,9]
    a =
         1     2     3
         4     5     6
         7     8     9
    
    >> a(1,:)=[]  %删除第一行
    a =
         4     5     6
         7     8     9
    

    矩阵扩展需要时再查询

    3.2.6 矩阵压缩

    >> a=[1 2 3 3 3 4 4 4 5 5 5]
    a =
      1 至 10 列
         1     2     3     3     3     4     4     4     5     5
      11 列
         5
         
    >> unique(a) %用于取非重复值
    ans =
         1     2     3     4     5
    

    3.3 矩阵和向量运算

    % 1、矩阵相加
    >> A=[1,0,0,0;3,1,0,0;-5,2,1,0;7,3,2,1]
    A =
         1     0     0     0
         3     1     0     0
        -5     2     1     0
         7     3     2     1
    
    >> B=[1,2,3,4;2,3,4,5;3,4,5,6;4,5,6,7]
    B =
         1     2     3     4
         2     3     4     5
         3     4     5     6
         4     5     6     7
    
    >> k=3
    k =
         3
    
    >> A+B
    ans =
         2     2     3     4
         5     4     4     5
        -2     6     6     6
        11     8     8     8
        
    % 2、乘以常数
    >> k*A
    ans =
         3     0     0     0
         9     3     0     0
       -15     6     3     0
        21     9     6     3
    % 3、矩阵的行列式
    >> det(A)
    ans =
         1
    % 4、矩阵的逆
    >> inv(A)
    ans =
        1.0000         0         0         0
       -3.0000    1.0000   -0.0000   -0.0000
       11.0000   -2.0000    1.0000    0.0000
      -20.0000    1.0000   -2.0000    1.000
    % 5、内积
    A*B'  <=> dot(A,B)
    >> B
    B =
         1     2     3     4
         2     3     4     5
         3     4     5     6
         4     5     6     7
    
    >> A
    A =
         1     0     0     0
         3     1     0     0
        -5     2     1     0
         7     3     2     1
    
    >> dot(A,B)
    ans =
        20    26    17     7
    
    

    向量可以看作1*n 矩阵或者 n*1 矩阵,因此向量的加法和数乘等运算和矩阵是一样的;

    3.4 线性方程组求解

    >> A=[1,2,3;1,4,9;1,8,27]
    A =
         1     2     3
         1     4     9
         1     8    27
    
    >> b=[5,-2,6]
    b =
         5    -2     6
    
    >> x=inv(A)*b
    错误使用  *         % 为什么这里会错误,因为这里赋值的b是行向量,而线性方程组右边的应该是列向量;
    内部矩阵维度必须一致。
     
    >> b=b'   %对b进行转置
    b =
         5
        -2
         6
    
    >> x=inv(A)*b    % <=> x=A  (A除以b)
    x =
       23.0000
      -14.5000
        3.6667
    

    3.5 矩阵的特征值

    % 使用eig函数
    >> A=[1 0 i;0 2 0;-i 0 1]
    A =
       1.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 1.0000i
       0.0000 + 0.0000i   2.0000 + 0.0000i   0.0000 + 0.0000i
       0.0000 - 1.0000i   0.0000 + 0.0000i   1.0000 + 0.0000i
     
    >> eig(A)  % 特征值
    ans =
         0
         2
         2
    
    >> [E,D]=eig(A)
    E =  
       0.0000 + 0.7071i   0.0000 + 0.7071i   0.0000 + 0.0000i
       0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 1.0000i
      -0.7071 + 0.0000i   0.7071 + 0.0000i   0.0000 + 0.0000i
    
    D =    % 特征矩阵
         0     0     0
         0     2     0
         0     0     2
    

    3.6 向量和矩阵的范数

    衡量距离

    >> A = [0 3 3;-1 8 6; 2 -14 -10]
    A =
         0     3     3
        -1     8     6
         2   -14   -10
    
    >> norm(A,1) % 1范数
    ans =
        25
    
    >> norm(A,2) % 2范数
    ans =
       20.4523
    
    >> norm(A,inf) %无穷范数
    ans =
        26
     
    >> norm(A,'fro') %  f范数
    ans =
       20.4695
    

    3.7 矩阵分析

    3.7.1 函数矩阵-求导

    >> syms x   % 定义符号x  把它当作一个代数对待
    >> A = [sin(x) exp(x) 1;cos(x) x^2+1 log(x)]
    A =
    [ sin(x),  exp(x),      1]
    [ cos(x), x^2 + 1, log(x)]
     
    >> diff(A) % 1阶求导
    ans =
    [  cos(x), exp(x),   0]
    [ -sin(x),    2*x, 1/x]
    
    >> diff(A,2)  % 2阶求导
    ans =
    [ -sin(x), exp(x),      0]
    [ -cos(x),      2, -1/x^2]
    

    四、绘图

    4.1 二维高层绘图

    4.1.1 plot函数

    plot(x,y); % 要求x和y为相同长度的向量

    特殊用法:

    1、x为向量,y为矩阵,其中一维与x长度相同,则绘制多条不同色彩的曲线(颜色怎么确定?)

    x=0:0.01:2*pi;
    y1=sin(x);
    y2=cos(x);
    y3=0.002*exp(x);
    z=[y1;y2;y3];
    plot(x,z)
    

    image-20200906132543933

    2、x和y为同维的矩阵,以对应列绘制不同色彩的曲线;

    x1=0:0.01:2*pi;
    x2=-pi:0.01:pi;
    x=[x1;x2]';  % 默认按列绘制图像,所以要进行转置,使其按行绘制图像;
    y1=sin(x1);
    y2=cos(x2);
    y=[y1;y2]';  % 默认按列绘制图像,所以要进行转置,使其按行绘制图像;
    plot(x,y)
    

    image-20200906133127471

    3、plot有一个参数,若x为实数向量,则绘制折线图,若x为复数向量,则以实部和虚部为横纵坐标绘图;

    ❗ 用到了再查;

    4、多个输入参数;

    plot(x1,y1,x2,y2) % 绘制x1y1图像以及x2,y2图像

    5、曲线选项;

    plot(x,y,'r') % 更改颜色
    plot(x,y,'*') % 更改点的样式
    plot(x,y,'--') % 更改线的样式
    plot(x,y,'r*--') 
    

    4.1.2 图形标注

    x=linspace(0,2*pi,100);
    y1=sin(x);
    y2=cos(x);
    plot(x,y1,x,y2)
    xlabel('x')
    ylabel('y')
    title('正弦')
    text(2,0.3,'这是标注')
    text(5,0.5,'x^2')   % Latex字符,^代表上标,_代表下标
    text(4,0.4,'x_2')
    legend('sin','cos')
    

    image-20200906134916558

    4.2.3 坐标轴控制

    axis equal % 正方形的坐标轴
    axis auto
    axis on
    axis off
    axis([xmin xmax ymin ymax])
    xlim([xmin xmax])
    ylim([ymin ymax])
    

    4.2.4 图形保持

    hold on
    plot(x,y1)
    plot(x,y2)
    hold off
    

    4.2.5 窗口分割

    x=0:0.1:2*pi;
    y1=sin(x);
    y2=cos(x);
    y3=tan(x);
    y4=exp(x);
    subplot(2,2,1)  % 绘制四个小图形中的第一个
    plot(x,y1)
    subplot(222)
    plot(x,y2)
    subplot(223)
    plot(x,y3)
    subplot(224)
    plot(x,y4)
    

    image-20200906135556256

    4.2 二维底层绘图

    4.2.1 line函数

    % h=line([-pi:0.1:pi],sin([-pi:0.1:pi]));
    h=line('XData',[-pi:0.1:pi],'YData',sin([-pi:0.1:pi]),...
        'LineWidth',1,'LineStyle',':','Color','r')
    

    image-20200906140401170

    set(h,'LineWidth',2,'Marker','p','MarkerSize',10);

    image-20200906140429704

    plot绘制的图形也是line对象,可以通过line对象的修饰方法后期修饰;

    4.2.2 底层标注

    h=line('XData',[-pi:0.1:pi],'YData',sin([-pi:0.1:pi]),...
        'LineWidth',1,'LineStyle',':','Color','r')
    set(h,'LineWidth',2,'Marker','p','MarkerSize',10);
    ht=text(0,0,'sinx')
    set(ht,'String','cos')
    set(ht,'FontSize',20)
    

    image-20200906140800493

    4.2.3 底层坐标轴控制

    归一化 vs 像素

    hf = figure;
    ha = axes('Parent',hf,'Units','normalized','Position',[.1 .1 .6 .5])
    

    image-20200906141326964

    修饰:

    • Box属性
    • GridLineStyle属性
    • Position属性
    • Units属性
    • XLabel、YLabel和ZLabel属性
    • Xlim、Ylim和Zlim属性

    需要知道哪个属性可用get(xxx)来获得属性信息

    五、符号运算

    5.1 符号计算基础

    5.1.1 符号常量、符号变量

    a=sym('a');
    % or
    syms a;
    % or
    c=sym('3')
    

    5.1.2 符号表达式

    f1 = '3*x + 6';  % 类型是'char',但能做符号表达式的相关运算
    % or
    syms x
    f2 = 3*x + 6;
    

    表达式运算可以直接使用符号四则运算 +-*/

    符号表达式化简

    >> syms x y
    >> s = (x^2 + y^2)^2 + (x^2-y^2)^2;
    >> simplify(s)
    ans =
    2*x^4 + 2*y^4
    

    符号和数值的转换

    c = sym('3')
    eval(c)
    numberic(c)
    

    因式分解和展开、合并同类项

    >> syms a b x y
    >> f1=a^3-b^3;
    >> factor(f1) % 因式分解
    ans =
    [ a - b, a^2 + a*b + b^2]
    
    >> f2=(3*x^2+8*y^2)*(-x^2+3*y)
    f2 =
    (- x^2 + 3*y)*(3*x^2 + 8*y^2)
     
    >> expand(f2) % 展开同类项
    ans =
    - 3*x^4 - 8*x^2*y^2 + 9*x^2*y + 24*y^3
    
    >> f3=3*x^2+4*x^2+5*x^2*y
    f3 =
    5*x^2*y + 7*x^2
     
    >> collect(f3) % 合并同类项
    ans =
    (5*y + 7)*x^2
    

    符号函数值的求解

    >> syms x
    >> f1 = x^3 -9
    f1 =
    x^3 - 9
     
    >> subs(f1,3)
    ans =
    18
    

    符号极限、符号微分、符号积分

    >> y = (sin(x+a)-sin(x-a))/x;
    >> limit(y,0)  % 符号极限
    ans =
     
    piecewise(in(real(a)/pi, 'integer') & (sinh(imag(a)) == 0 | in(real(a)/pi - 1/2, 'integer')), 0, in(real(a)/pi, 'integer') & 0 < cos(real(a))*sinh(imag(a)) | in(real(a)/pi, 'integer') & cos(real(a))*sinh(imag(a)) < 0 | sinh(imag(a)) ~= 0 & ~in(real(a)/pi - 1/2, 'integer'), limit((sin(a - x) + sin(a + x))/x, x, 0))
    
    >> y2 = sqrt(1+exp(x));
    >> diff(y2) % 符号导数
    ans =
    exp(x)/(2*(exp(x) + 1)^(1/2))
    >> diff(y2,2) % 二阶导数
    ans =
    exp(x)/(2*(exp(x) + 1)^(1/2)) - exp(2*x)/(4*(exp(x) + 1)^(3/2))
    
    >> y3=(3-x^2)^3;
    >> int(y3)  % 不定积分  
    ans =
    - x^7/7 + (9*x^5)/5 - 9*x^3 + 27*x
    
    >> y4 = abs(1-x);
    >> int(y4,1,2)  % 定积分
    ans =
    1/2
    

    ❗ 符号级数求和、泰勒展开用到了再查

    符号方程求解

    >> solve(x+x*exp(x)-10)
    ans =
    1.6335061701558463841931651789789
    
    >> eval(solve(x+x*exp(x)-10))
    ans =
    
        1.6335
    

    方程组求解

    >> [x,y]=solve('1/x^3+1/y^3-28','1/x+1/y-4','x,y')
    x =
       1
     1/3
     
    y =
     1/3
       1
    

    微分方程求解

    >> dsolve('Dy-(x^2+y^2)/x^2/2','x')
    ans =
                              x
     -x*(1/(C5 + log(x)/2) - 1)
    

    ADD 命令窗口常用命令

    clc  清空命令行
    help  查找/查阅相关内容   用法:help  xxxxx
    class(a)  输出变量a的类型
    edit  启动编辑器,并新建一个空白文件
    

    ADD 编辑器窗口常用快捷键

    ctrl + G 直接跳至某行
    F5 保存并运行程序
    ctrl + R  快速注释
    ctrl + T 快速取消注释
    Tab 自动补全
    
  • 相关阅读:
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    PHP serialize() 函数
    PHP print_r() 函数
  • 原文地址:https://www.cnblogs.com/Luweir/p/14147312.html
Copyright © 2011-2022 走看看