• 【转载】Matlab基本用法小结


    目录:
    一、 说明
    二、数据类型及基本输入输出
    三、流程控制
    四、循环
    五、数组、数组运算和矩阵运算
    六、M脚本文件和M函数文件、函数句柄
    七、文件
    八、数据和函数的可视化
    一、说明
    看了奚啸翔同学写的Fortran基本用法小结后觉得Fortran的语法既有matlab的特色也有C的
    特色。于是就套用了奚啸翔同学文章的格式,写了这篇matlab基本用法小结。目的是想和
    Fortran的语法有个对比,学起来更快。其实学过C、Fortran和matlab中任何一个的同学要
    学其他两种语言的语法都是非常容易上手的,一天就能搞定了。有兴趣的同学还可以看看
    百合Fortran版上的C、Fortran、matlab语法对比,一定能有不少收获。
    此外,尽管这三种语言的语法有很多相近的地方,matlab作为数学软件有其强大的图形用
    户界面操作、数据和函数的可视化和数值计算功能,且自带很多现有的函数和工具包。而
    本文只涉及一些比较系统的基本操作,在最后附带介绍一些基本的数据和函数的可视化命
    令。建议要用的时候再利用matlab自带的帮助文档来搜索有用的函数和工具包。matlab的
    函数和命令都是比较人性化的,比如想要搜索读取fits文件的函数,搜索fits就能够搜到
    fitsread函数;需要将读出的fits数据重新做图,搜索image就可以找到imagesc函数。从
    书和别人的文档都只能学到有限的比较系统的操作,看帮助文档能发现更多的东西并整理
    出自己的使用方法。
    最后要说明的是,C必须用循环才能做到的事情Fortran和matlab用矩阵和数组运算就能做
    到,相对效率提高了很多;而对于一些运算量非常大的程序还是推荐用Fortran,因为相比
    之下matlab的运算速度比Fortran慢很多;而网上很多现有的天文软件包都是用fortran写
    的(比如由宇宙学参数计算模拟数据的CAMB程序和宇宙模型可能性预测LIKELIHOOD程序)
    ,虽然matlab也有很多天文软件包,但相对fortran还是逊色不少。
    二、数据类型及基本输入输出
    1、数据类型,声明及赋初值
    matlab中存储的数据类型(class)有以下几种:
    而实际上matlab不需要对变量做声明,当它发现一个新的变量名时,将默认将其为双精度
    浮点类型(double)并分配内存空间。(这比C和 Fortran方便了许多,但在完成大运算量的
    程序时就显得浪费存储空间了)
    当需要把变量a从double转为其他类型的时候,比如要转为int16型,可以使用以下命令:
    a=int16(a)
    当需要创建一个字符型变量x并对其赋初值时,用以下格式:x='字符串';
    注意:
    (1)在命令后加“;”表示不在command window中显示结果,而对上例来说如果不加“;”
    则会显示所赋字符串内容。
    (2)所有的命令必须在英文输入状态下,如果使用中文输入状态下全角的“;”,将被处
    理为非法字符。
    其中logical,cell和structure为逻辑,元胞和构架数组类型,将在后面的数组部分提到
    ;function handle为函数句柄类型,将在后面的“M脚本文件和M函数文件、函数句柄”部
    分提到;java类供JAVA API应用程序接口使用,本文不进行说明。
    最后说明一下,matlab也支持复数操作,赋值的时候直接输入即可,比如:a=1+2i;
    2、基本输入输出
    输入:v=input('message')              %将用户输入的内容赋给变量v
    v=input('message','s')            %将用户输入的内容作为字符串赋给变量v
    keyboard                       %用户可以从键盘输入任意多个指令
    v=yesinput('prompt',default,possib)
    %prompt为文字提示,default为缺省设置“值”,possib为设置值的范围。
    %该指令无法在notebook中运行。
    输出:disp(a)                  
    %显示变量a的内容,另一种显示变量内容的方法是输入变量名,但是这样显示的结果带有
    “a=”。
    三、流程控制
    1、运算符
    (1)关系操作符
    ==    ~=    >    >=   <    <=   
    (2)涉及相互关系的集合运算符
    &      |      ~         xor
    % xor 相异元素返回1,相同元素返回0
    2、IF
    (1) 基本 :
    if 逻辑判断式
    ……
    end
    (2)  多重判断:
    if 逻辑判断式
    ......
    else if 逻辑判断式
    ......
    else  逻辑判断式
    ......
    end
    end
    end
    3、switch-case结构
    和C的switch语句一样
    switch 变量
    case数值1 
    ……          
    case数值2
    ……
    case 数值k  %当变量等于数值k的时候,执行本组命令,然后跳出该结构。
    ……
    otherwise
    ……     %该命令可以不存在,在变量不等于前面所有的检测值的时候,执行此组命
    令。
    end case
    4、try-catch结构
    try      %只有当matlab执行本组命令发生错误时,后一组命令才会被执行
    ……
    catch
    ……     %如果此组命令执行又出错,matlab将终止该结构。
    end
    %可以调用lasterr函数查询出错原因。如果函数的运行结果为一个空串,则表明这组命令
    被成功执行了。
    四、循环
    1、while
    while 表达式
    ……
    end
    2、for
    for x=数值    
    ……   
    ……   
    end
    %其中的数值可以是数组;或者是类似下面的表达“1:4”,表示从1到4循环;还可以是“
    1:0.1:4”,表示以0.1为步长从1到4循环。
    五、数组、数组运算和矩阵运算
    1、 数值数组
    matlab中数组不需要声明。
    (1)对一维数值数组赋初值
    逐个元素输入:
    x=[1  2  pi/2]
    冒号生成:
    x=1:0.1:4
    定数线性采样法:
    x=linspace (a,b,n)   
    %相当于第一个数为a,最后一个数为b,以n为采样点数等间距采样。
    x=logspace(a,b,n)
    %相当于第一个数为10a,最后一个数为10b,以n为采样点数等间距采样。
    (2)对一维数值数组的寻访
    x(3)                %寻访第三个元素
    x([1 2 3])           %寻访第1,2,3个元素
    x(1:3)              %寻访第1到3个元素
    x(3:-1:1)            %由前三个元素倒排成子数组
    x(find(x>0.5))      %由大于0.5的元素构成的子数组
    (3)对二维数值数组赋初值
    逐个赋值:
    x=[1,2,3; 3,4,6; 7,8,9]    
    %“;”为二维数组“行”的分隔符号,而“,”和空格为同一行元素的分隔符。
    整列赋值:
    x(:,[4,5])=4    %第4、5列赋值为4
    元素重排:
    A=reshape(1:9,3,3)     
    %将1到9重新排列成一个(3*3)矩阵,注意matlab是列“优先”,即先排第一列再排第二
    列,而不是按行来排。
    (4)二维数组元素的标识和寻访
    “全下标”标识:
    A(3,5)      %第3行第5列元素
    “单下标”标识:
    对于一个(m*n)维数组A中第r行第c列元素,其“单下标”表示为:A(l)
    %这里l=(c-1)*m+r
    2、数组运算和矩阵运算
    (1)数组运算
    指令
    含义
    A.'
    相当于conj(A'),conj的作用help一下吧……
    A=s
    把标量s赋给A的每个元素
    s+B
    标量s分别与B元素之和
    s-B,B-s
    标量s分别与B元素之差
    s.*A
    标量s分别与A元素之积
    s./B,B.\s
    s分别被B的元素除
    A.^n
    A的每个元素自乘n次
    A.^p
    对A的各个元素分别求非整数幂
    p.^A
    以p为底,分别以A的元素为指数求幂
    A+B
    对应元素相加
    A-B
    对应元素相减
    A.*B
    对应元素相乘
    A./B
    A的元素被B的对应元素除
    B.\A
    同上
    exp(A)
    以e为底,分别以A的元素为指数求幂
    log(A)
    对A的各个元素求对数
    sqrt(A)
    对A的各个元素求平方根
    f(A)
    求A各个元素的函数值
    A#B
    对应元素的关系运算,#代表关系运算符
    A@B
    对应元素的逻辑运算,@代表逻辑运算符
    (2)矩阵运算
    指令
    含义
    A'
    共轭转置
    s*A
    标量s分别与A元素之积
    S*inv(B)
    B阵的逆乘s
    A^n
    A阵为方阵时,自乘n次
    A^p
    方阵A的非整数乘方
    p^A
    A阵为方阵时,标量的矩阵乘方
    A+B
    矩阵相加
    A-B
    矩阵相减
    A*B
    矩阵相乘
    A/B
    A右除B
    B\A
    A左除B
    expm(A)
    A的矩阵指数函数
    logm(A)
    A的矩阵对数函数
    sqrtm(A)
    A的矩阵平方根函数
    funm(A,'FN')
    一般矩阵函数
    3、逻辑数组
    看例子就明白了:
    A=zeros(2,5);      %预生成一个(2*5)全零数组
    A(:)=-4:5;         %运用“全元素”方法向A赋值
    L=abs(A)>3       %产生一个与A同维的“0 -1”逻辑值数组
    islogical(L)        %判断L是否逻辑值数组。输出若为1,则是
    X=A(L)           %把L中逻辑值为1对应的A元素取出
    4、字符串数组
    (1)字符串数组赋初值
    S=['aa'
    'bb']
    或者:
    S=char('aa','bb')
    还可以:
    S=str2mat('aa',' ','bb')   %这里空串会产生空行
    而:
    S=str2cat('aa',' ','bb')    %这里空串不会产生空行
    (2) 字符串操作函数
    int2str     %把整数数组转换为串数组
    num2str   %把非整数数组转换为串数组
    mat2str    %把数值数组转换为串数组
    %请使用help搜索其他的字符串操作函数。
    5、元胞数组
    元胞数组和一般数值数组和字符串数组不同,其元素可以是任意类型和大小的对象。这
    和C的结构型数组有些类似。
    (1)创建元胞数组
    有以下两种创建方式:
    外标识元素赋值:
    a=char('aa' 'bb');
    b=1:9;
    c=2:5;
    d=[1+2i];
    A(1,1)={a}; A(1,2)={b}; A(2,1)={c}; A(2,2)={d};
    内涵的直接赋值:
    a=char('aa' 'bb');
    b=1:9;
    c=2:5;
    d=[1+2i];
    A{1,1}=a; A{1,2}=b; A{2,1}=c; A{2,2}=d;
    (2)元胞数组内容的调取
    注意在这里()访问的是元胞,用{}访问的是元胞中存储的内容。
    比如:a=A(1,1)
    显示:
    a=
    [12  char]
    而:a=A{1,1}
    显示:
    a=
    aa
    bb
    所以用{}而不是()调取元胞数组内容。
    6、构架数组
    构架数组和元胞数组类似,但其每个构架(地位相当于元胞数组的元胞)必须划分“域”
    后才能使用。看下面的例子:
    green_house(2,3).name='六号房';
    green_house(2,3).param.temperature=30;
    green_house(2,3).param.humidity=10;
    green_house
    屏幕显示:
    23 struct array with fields:
    name
    param
    注意:
    (1)在一个构架上进行的增减域的操作会影响到整个数组。
    (2)增减子域不会影响到其他构架。
    7、空数组
    (1)有下面几种产生空数组的方法:
    a=[]
    b=ones(2,0)       %ones的作用原本是产生一个全1的数组
    c=zeros(2,0)       %zeros的作用原本是产生一个全0的数组
    d=eye(2,0)        %eye的作用原本是产生一个对角元全为1的数组
    f=rand(2,3,0,4)    %rand的作用原本是产生随即数组。
    (2)空数组可用于子数组的删除和数组大小的收缩
    A(:,2)=[]
    六、M脚本文件和M函数文件、函数句柄
    m文件分两种:函数和脚本。
    1、matlab script file:
    脚本文件没有输入输出,对工作空间(workspace)中的变量进行操作。
    任何可执行的matlab命令都可以写入脚本文件。先来看一个简单的例子:
    例1: 产生一个20元素的一维随机数组并画出。
    解: 新建一个m文件命名为randplt.m(或者任何你喜欢的名字), 在其中加入如下两行代码
    :
    data=randn(1,20); 
    plot(data);
    保存后选择debug/run菜单或按F5键运行,观察workspace中多出了一个变量data。
    脚本文件执行时, 就如同将文件中的每一条命令依次输入到matlab命令行中一样, 顺次执
    行。你可以尝试在command history窗口中按住ctrl键选择几行执行过的命令并单击鼠标右
    键在快捷菜单中选择creat M file来快速创建一个m文件。
    2、matlab function
    函数文件可以接受输入和给出输出,当然也可以没有,就像c语言的函数。matlab函数最大的
    书写特点(同C比起来)是它的输出变量定义在函数名前面。看一例:
    例2: matlab内部函数std给出数组的标准差std=sqrt(sum(X)/N),编写函数stderr求实验误
    差err=sqrt(sum(X)/(N*(N-1))), 代码如下:
    function err=stderr(arr)
    %实验误差(标准差估计)
    %caculate along each column of arr
    err=std(arr)./sqrt(size(arr,1)-1);
    文件存为stderr.m, 运行时输入a=[1;2;3];建立一个列数组a, 然后输入stderr(a)则给出
    a的方差。(若输入行数组则发散,因N-1=0)
    此例中输入变量为arr, 函数名为stderr, 输出变量err, 此三者皆写在关键字function后
    面同一行。无需再使用return将err的值返回。
    注意:
    (1)函数文件的命名要使用文件内主函数声明的名称,否则出错。
    (2)函数内部可以嵌套子函数并为该文件的主函数调用,只需将子函数写在主函数代码后
    面。
    (3)一个函数可以有多个输入输出。如function [y1,y2]=myfun(x1,x2,x3)
    例1中的m文件可在第一行前插入一行:
    function randplt
    保存后则该文件成为一个没有输入输出宗量的函数。
    一般来说matlab中执行同样的任务使用函数文件比脚本文件的效率高。
    3.函数句柄的使用
    函数句柄起到c语言中函数指针的作用。
    例3: 编写函数求出数组arr1和arr2的标准差(std)以及误差(stderr)。
    解: 编写如下文件并保存为erreval.m
    function [s1,s2]=erreval(err,arr1,arr2)
    % err为所调用的误差函数,s1,s2分别返回arr1和arr2的误差.
    s1=feval(err,arr1);
    s2=feval(err,arr2);
    此文件的输入包含"函数变量", 通过函数句柄实现函数变量err的赋值。
    运行时先运行如下命令建立数组arr1,arr2:
    arr1=[1;2;3];
    arr2=[10;20;30];
    然后输入
    [std1,std2]=erreval(@std,arr1,arr2)
    [stderr1,stderr2]=erreval(@stderr,arr1,arr2)
    执行后返回四个误差值。
    @std,@stderr为两误差函数的函数句柄。
    七、文件
    打开文件:
    fid = fopen(filename,permission)
    %其中的permission为打开类型,具体可查阅matlab的帮助文档。
    读文件:
    [A,count] = fread(fid,size,precision)
    %A 为存放读入数据的变量。
    %count 为可选参数,存放成功读取的数据个数。
    %fid 为文件指针。
    %size 为要求读入的数据量大小,缺省状态下读到文件末尾。
    %presision 为读出数据格式。
    写文件:
    count = fwrite(fid,A,precision)
    八、数据和函数的可视化
    图像的精细控制大有文章可做,这里只介绍一些做图最常用的基本命令。
    1.二维数据的可视化
    设x,y为两等长的一维数组,若要将x,y对应位置的元素做图,可使用以下命令:
    plot(x,y);
    如果使用:
    plot(x);
    就相当于:
    s=size(x);
    plot(x,[1:s(2)]);
    我们可以对线型和色彩做控制,比如plot(x,y,'.r')画出的是红色点线。
    线型和色彩控制值如下表:
    线型
    符号
    -

    -.
    --
    含义
    实线
    虚线
    点划线
    双划线
    色彩
    符号
    b
    g
    r
    c
    m
    y
    k
    w
    含义

    绿


    品红



    2.三维数据的可视化
    plot3最容易理解:
    plot3(X,Y,Z);
    另外的两个基本命令是:
    mesh(X,Y,Z)    %画网线图。
    mesh(Z)        %以Z矩阵列行下标为x,y轴自变量画网线图。
    surf(X,Y,Z)      %画曲面图。
    surf(Z)         %以Z矩阵列行下标为x,y轴自变量画曲面图。
    3.图像控制命令
    figure   %打开新的作图窗口
    axis([0,pi,-1,1])  %控制坐标轴的范围
    title('pic')     %为图像增加标题
    grid on       %显示坐标网格
    legend       %显示图例
    hold on     %在画下一幅图的时候,保留之前的图。
    hold off     %停止保留之前的图。
    colorbar     %显示颜色条
    box on      %显示三维图的长方体边框
    %全文结束。
  • 相关阅读:
    为zabbix穿上一件漂亮的外衣
    CentOS7 Ceph分布式集群部署
    SSH 免秘钥登录
    zabbix监控Tomcat/JVM 实例性能
    zabbix 监控 IPMI
    2装饰者模式
    1代理模式
    3单例模式
    2抽象工厂模式
    1工厂模式
  • 原文地址:https://www.cnblogs.com/wmx3ng/p/2775951.html
Copyright © 2020-2023  润新知