zoukankan      html  css  js  c++  java
  • matlab基本语法

    执行MATLAB命令

    MATLAB 是一种解释型的环境。也就是说,只要你给MATLAB一个命令,它就会马上开始执行。
    

    MATLAB实践

    在">>" 命令提示符下键入一个有效的表达,例如:

    5 + 5
    

    然后按 ENTER 键

    当点击“执行”按钮,或者按“Ctrl+ E”,MATLAB执行它并返回结果:

    ans = 10
    

    让我们使用几个例子:

    3 ^ 2	       % 3 raised to the power of 2
    

    当你点击“执行”按钮,或者按“Ctrl+ E”,MATLAB执行它并返回结果:

    ans = 9
    

    另外一个例子:

    sin(pi /2)	  % sine of angle 90o
    

    当你点击“执行”按钮,或者按“Ctrl+ E”,MATLAB执行它并返回结果:

    ans = 1
    

    另外一个例子,

    7/0		      % Divide by zero
    

    当点击“执行”按钮,或者按“Ctrl+ E”,MATLAB执行它并返回结果:

    ans = Inf
    warning: division by zero
    

    另外一个例子,

    732 * 20.3	
    

    当点击“执行”按钮,或者按“Ctrl+ E”,MATLAB执行它并返回结果:

    ans =  1.4860e+04
    

    MATLAB 提供了一些特殊的一些数学符号的表达,像圆周率 π, Inf for ∞, i (and j) for √-1 etc. Nan 代表“不是一个数字”。

    MATLAB常用的运算符和特殊字符

    运算符 目的
    + 加;加法运算符
    - 减;减法运算符
    * 标量和矩阵乘法运算符
    .* 数组乘法运算符
    ^ 标量和矩阵求幂运算符
    .^ 数组求幂运算符
    矩阵左除
    / 矩阵右除
    . 阵列左除
    ./ 阵列右除
    : 向量生成;子阵提取
    ( ) 下标运算;参数定义
    [ ] 矩阵生成
    . 点乘运算,常与其他运算符联合使用
    续行标志;行连续运算符
    , 分行符(该行结果不显示)
    ; 语句结束;分行符(该行结果显示)
    % 注释标志
    _ 引用符号和转置运算符
    ._ 非共轭转置运算符
    = 赋值运算符
    MATLAB分号(;)使用

    MATLAB中分号(;)表示语句结束;但是,如果想抑制和隐藏 MATLAB 输出表达,表达后添加一个分号。

    例如,

    x = 3;
    y = x + 5
    

    当点击“执行”按钮,或者按“Ctrl+ E”,MATLAB执行它立即返回的结果是:

    y =  8
    

    MATLAB添加注释

    MATLAB的百分比符号(%)是用于表示一个注释行。例如:

    x = 9	     % assign the value 9 to x
    

    也可以写注释,使用一块块注释操作符%{%}。

    MATLAB编辑器包括工具和上下文菜单项,来帮助添加,删除或更改注释的格式。

    MATLAB特殊变量和常量

    MATLAB支持以下特殊变量和常量:

    Name Meaning
    ans 默认的变量名,以应答最近依次操作运算结果
    eps 浮点数的相对误差
    i,j 虚数单位,定义为 i2 = j2 = -1
    Inf 代表无穷大
    NaN 代表不定值(不是数字)
    pi 圆周率

    MATLAB命名变量

    变量名称是由一个字母后由任意数量的字母,数字或下划线。

    注意MATLAB中是区分大小写的。

    变量名可以是任意长度,但是,MATLAB使用只有前N个字符,其中N是由函数namelengthmax。

    保存你的工作进度

    MATLAB使用save命令保存工作区中的所有变量,然后作为一个扩展名为.mat的文件,在当前目录中。

    如以下例子:

    save myfile
    

    该文件可以随时重新加载,然后使用load命令。

    load myfile
    

    MATLAB变量

    每个MATLAB变量可以是数组或者矩阵。

    用一个简单的方法指定变量。例如:

    x = 3	       % defining x and initializing it with a value
    

    MATLAB执行上述语句,并返回以下结果:

    x =
         3
    

    上述的例子创建了一个1-1的矩阵名为x和的值存储在其元素中。我们可以看看另外的例子,

    x = sqrt(16) 	% defining x and initializing it with an expression
    

    MATLAB执行上述语句,并返回以下结果:

    x =
         4
    

    MATLAB注意事项:

    在使用变量之前,必须进行赋值。

    当系统接收到一个变量之后,这个变量可以被引用。

    例如:

    x = 7 * 8;
    y = x * 7.89
    

    MATLAB将执行上面的语句,并返回以下结果:

    y =
      441.8400
    

    当表达式返回一个结果,不分配给任何变量,系统分配给一个变量命名ans,以后可以继续使用。

    例如:

    sqrt(78)
    

    MATLAB将执行上面的语句,并返回以下结果:

    ans =
        8.8318
    

    变量 ans 可以被继续使用:

    9876/ans
    

    MATLAB将执行上面的语句,并返回以下结果:

    ans =
       1.1182e+03
    

    MATLAB可以多个赋值
    多个任务可以在同一行。例如,

    a = 2; b = 7; c = a * b
    

    MATLAB将执行上面的语句,并返回以下结果:

    c =
        14
    

    MATLAB如何显示已经使用的变量名?

    在MATLAB中可以使用 who 命令显示所有已经使用的变量名。

    who
    

    MATLAB将执行上面的语句,并返回以下结果:

    Your variables are:
    a    ans  b    c    x    y   
    

    whos 命令则显示多一点有关变量:

    当前内存中的变量

    每个变量的类型

    内存分配给每个变量

    无论他们是复杂的变量与否

    whos
    MATLAB将执行上面的语句,并返回以下结果:

      Name      Size            Bytes  Class     Attributes
    
      a         1x1                 8  double              
      ans       1x1                 8  double              
      b         1x1                 8  double              
      c         1x1                 8  double              
      x         1x1                 8  double              
      y         1x1                 8  double     
    

    clear命令删除所有(或指定)从内存中的变量(S)。

    clear x     % it will delete x, won't display anything
    clear	     % it will delete all variables in the workspace
                 %  peacefully and unobtrusively 
    

    长任务

    长任务可以通过使用省略号(...)延伸到另一条线路。例如,

    initial_velocity = 0;
    acceleration = 9.8;
    time = 20;
    final_velocity = initial_velocity ...
        + acceleration * time
    

    MATLAB将执行上面的语句,并返回以下结果:

    final_velocity =
       196
    

    MATLAB格式命令
    默认情况下,MATLAB 四个小数位值显示数字。这就是所谓的 short format.

    如果想更精确,需要使用 format 命令。

    长(long ) 命令格式显示小数点后16位。

    例如:

    format long
    x = 7 + 10/3 + 5 ^ 1.2
    

    MATLAB将执行上面的语句,并返回以下结果:

    x =
      17.231981640639408
    

    format short 例子:

    format short
    x = 7 + 10/3 + 5 ^ 1.2
    

    MATLAB将执行上面的语句,并返回以下结果:

    x =
       17.2320
    

    空格格式命令回合到小数点后两位数字。例如:

    format bank
    daily_wage = 177.45;
    weekly_wage = daily_wage * 6
    

    MATLAB将执行上面的语句,并返回以下结果:

    weekly_wage =
           1064.70
    

    MATLAB 显示大量使用指数表示法。

    短格式e命令允许以指数的形式显示小数点后四位,加上指数。

    例如:

    format short e
    4.678 * 4.9
    

    MATLAB将执行上面的语句,并返回以下结果:

    ans =
       2.2922e+01 
    

    format long e命令允许以指数的形式显示小数点后四位,加上指数。例如:

    format long e
    x = pi
    

    MATLAB将执行上面的语句,并返回以下结果:

    x =
         3.141592653589793e+00
    

    format rat 格式大鼠命令给出最接近的有理表达式,从计算所得。例如:

    format rat
    4.678 * 4.9
    

    MATLAB将执行上面的语句,并返回以下结果:

    ans =
       2063/90  
    

    MATLAB创建向量

    向量是一维数组中的数字。 MATLAB允许创建两种类型的矢量:

    行向量

    列向量

    创建行向量括在方括号中的元素的集合,用空格或逗号分隔的元素。

    例如,

    r = [7 8 9 10 11]
    

    MATLAB将执行上面的语句,并返回以下结果:

    r =
      Columns 1 through 4
           7              8              9             10       
      Column 5
          11  
    

    另外一个例子,

    r = [7 8 9 10 11];
    t = [2, 3, 4, 5, 6];
    res = r + t
    

    MATLAB将执行上面的语句,并返回以下结果:

    res =
      Columns 1 through 4
           9             11             13             15       
      Column 5
          17
    

    创建列向量通过内附组方括号中的元素,使用分号(;)分隔的元素。

    c = [7;  8;  9;  10; 11]
    

    MATLAB将执行上面的语句,并返回以下结果:

    c =
           7       
           8       
           9       
          10       
          11  
    

    MATLAB创建矩阵
    矩阵是一个二维数字阵列。

    在MATLAB中,创建一个矩阵每行输入空格或逗号分隔的元素序列,最后一排被划定一个分号。

    例如,下面创建了一个3×3的矩阵:

    m = [1 2 3; 4 5 6; 7 8 9]
    

    MATLAB执行上述语句,并返回以下结果:

    m =
           1              2              3       
           4              5              6       
           7              8              9   
    

    MATLAB命令

    本节的内容将提供常用的一些MATLAB命令。

    在之前的篇章中我们已经知道了MATLAB数值计算和数据可视化是一个交互式程序,在它的命令窗口中您可以在MATLAB提示符“>>”下键入命令。

    MATLAB管理会话的命令
    MATLAB提供管理会话的各种命令。如下表所示:

    命令 目的/作用
    clc 清除命令窗口。
    clear 从内存中删除变量。
    exist 检查存在的文件或变量。
    global 声明变量为全局。
    help 搜索帮助主题。
    lookfor 搜索帮助关键字条目。
    quit 停止MATLAB。
    who 列出当前变量。
    whos 列出当前变量(长显示)。

    MATLAB的系统命令

    使用MATLAB的时候有一些系统命令可以方便我们的操作,如在当前的工作区中可以使用系统命令保存为一个文件、加载文件、显示日期、列出目录中的文件和显示当前目录等。

    下表列举了一些MATLAB常用的系统相关的命令:

    命令 目的/作用
    cd 改变当前目录。
    date 显示当前日期。
    delete 删除一个文件。
    diary 日记文件记录开/关切换。
    dir 列出当前目录中的所有文件。
    load 负载工作区从一个文件中的变量。
    path 显示搜索路径。
    pwd 显示当前目录。
    save 保存在一个文件中的工作区变量。
    type 显示一个文件的​​内容。
    what 列出所有MATLAB文件在当前目录中。
    wklread 读取.wk1电子表格文件。

    MATLAB输入和输出命令

    MATLAB提供了以下输入和输出相关的命令:

    命令 作用/目的
    disp 显示一个数组或字符串的内容。
    fscanf 阅读从文件格式的数据。
    format 控制屏幕显示的格式。
    fprintf 执行格式化写入到屏幕或文件。
    input 显示提示并等待输入。
    ; 禁止显示网版印刷
    fscanf和fprintf命令的行为像C scanf和printf函数。他们支持格式如下代码:
    格式代码 目的/作用
    %s 输出字符串
    %d 输出整数
    %f 输出浮点数
    %e 显示科学计数法形式
    %g %f 和%e 的结合,根据数据选择适当的显示方式
    用于数字显示格式的函数有以下几种形式:
    Format函数 最多可显示
    format short 四位十进制数(默认)
    format long 15位定点表示
    format short e 五位浮点表示
    format long e 15位浮点表示
    format bank 两个十进制数字
    format + 正,负或零
    format rat 有理数近似
    format compact 变量之间没有空行
    format loose 变量之间有空行

    MATLAB向量,矩阵和阵列命令(重要)

    下表列出了MATLAB用于工作数组、矩阵和向量的各种命令:

    命令 作用/目的
    cat 连接数组
    find 查找非零元素的索引
    length 计算元素数量
    linspace 创建间隔向量
    logspace 创建对数间隔向量
    max 返回最大元素
    min 返回最小元素
    prod 计算数组元素的连乘积
    reshape 重新调整矩阵的行数、列数、维数
    size 计算数组大小
    sort 排序每个列
    sum 每列相加
    eye 创建一个单位矩阵
    ones 生成全1矩阵
    zeros 生成零矩阵
    cross 计算矩阵交叉乘积
    dot 计算矩阵点积
    det 计算数组的行列式
    inv 计算矩阵的逆
    pinv 计算矩阵的伪逆
    rank 计算矩阵的秩
    rref 将矩阵化成行最简形
    cell 创建单元数组
    celldisp 显示单元数组
    cellplot 显示单元数组的图形表示
    num2cell 将数值阵列转化为异质阵列
    deal 匹配输入和输出列表
    iscell 判断是否为元胞类型

    MATLAB绘图命令

    MATLAB提供了大量的命令绘制图表。下表列出了一些常用的命令绘制:

    命令 作用/目的
    axis 人功选择坐标轴尺寸
    fplot 智能绘图功能
    grid 显示网格线
    plot 生成XY图
    print 打印或绘图到文件
    title 把文字置于顶部
    xlabel 将文本标签添加到x轴
    ylabel 将文本标签添加到y轴
    axes 创建轴对象
    close 关闭当前的绘图
    close all 关闭所有绘图
    figure 打开一个新的图形窗口
    gtext 通过鼠标在指定位置放注文
    hold 保持当前图形
    legend 鼠标放置图例
    refresh 重新绘制当前图形窗口
    set 指定对象的属性,如轴
    subplot 在子窗口中创建图
    text 在图上做标记
    bar 创建条形图
    loglog 创建双对数图
    polar 创建极坐标图像
    semilogx 创建半对数图(对数横坐标)
    semilogy 创建半对数图(对数纵坐标)
    stairs 创建阶梯图
    stem 创建针状图

    条件语句

    MATLAB if...elseif...elseif...else...end 语句

    MATLAB 的 if...elseif...elseif...else...end 语句中 if 语句可以跟随一个(或多个)可选的 elseif... else 语句,这是非常有用的,可以用来对各种条件进行测试。

    使用 if... elseif...elseif...else 语句,要注意以下几点:

    一个 if 可以有零个或多个 else,但是它必须跟在 elseif 后面(即只有 elseif 存在才会有 else)。

    一个 if 可以有零个或多个 elseif ,必须出现else。

    一旦 elseif 匹配成功,余下的 elseif 将不会被测试。

    if... elseif...else...end 语法:

    if <expression 1>
    % Executes when the expression 1 is true 
    <statement(s)>
    elseif <expression 2>
    % Executes when the boolean expression 2 is true
    <statement(s)>
    Elseif <expression 3>
    % Executes when the boolean expression 3 is true 
    <statement(s)>
    else 
    %  executes when the none of the above condition is true 
    <statement(s)>
    end
    

    详细例子如下:
    在MATLAB中建立一个脚本文件,并输入下述代码:

    a = 100;
    %check the boolean condition 
       if a == 10 
             % if condition is true then print the following 
           fprintf('Value of a is 10
    ' );
        elseif( a == 20 )
           % if else if condition is true 
           fprintf('Value of a is 20
    ' );
        elseif a == 30 
            % if else if condition is true  
           fprintf('Value of a is 30
    ' );
       else
            % if none of the conditions is true '
           fprintf('None of the values are matching
    ');
       fprintf('Exact value of a is: %d
    ', a );
       end
    

    编译和执行上述代码,产生如下结果:

    None of the values are matching
    Exact value of a is: 100
    

    MATLAB嵌套if语句

    在MATLAB中嵌套if语句始终是合法的,也就是说可以使用一个嵌套的 if-else语句 if 或 elseif 语句在另一个 if 或 elseif 语句。

    MATLAB嵌套 if 语句语法:
    详细语法如下:

    if <expression 1>
    % Executes when the boolean expression 1 is true 
       if <expression 2>
          % Executes when the boolean expression 2 is true    
      end
    end
    

    可以嵌套 elseif 或其他类似的方式,因为已经嵌套 if 语句。

    详细例子如下:
    在MATLAB中建立一个脚本文件,并输入下面的代码:

    a = 100;
    b = 200;
        % check the boolean condition 
       if( a == 100 )
       
           % if condition is true then check the following 
           if( b == 200 )
           
              % if condition is true then print the following 
              fprintf('Value of a is 100 and b is 200
    ' );
           end
           
       end
       fprintf('Exact value of a is : %d
    ', a );
       fprintf('Exact value of b is : %d
    ', b );
    

    运行该文件,它显示的结果如下:

    Value of a is 100 and b is 200
    Exact value of a is : 100
    Exact value of b is : 200
    

    MATLAB switch语句

    MATLAB中 switch 块有条件地执行一组语句,这些语句是从几个选项里选择执行的,其中每个选项涵盖了一个 case 语句。

    请记住:
    计算 switch_expression 是一个标量或字符串。
    计算 case_expression 是标量,标量或字符串的字符串或单元阵列。
    switch 块的功能是测试每个 case ,直到被测试的其中一个 case 是 true 。

    case 是 true 的情况如下:

    对于数字,eq(case_expression,switch_expression).

    对于字符串,strcmp(case_expression,switch_expression).

    对于对象,支持 eq 函数,eq(case_expression,switch_expression).

    对于单元阵列case_expression的,在单元阵列与switch_expression相匹配的元素中的至少一个,如上文所定义的数字,字符串和对象。

    当上述有一个情况是 true,MATLAB 就执行与之相应的语句,然后不再执行以后的语句,直接退出 switch 块。

    otherwise 块是可选的,任何情况下,只有当真正执行。

    MATLAB switch语句语法
    在MATLAB 中 switch 语句的语法如下:

    switch <switch_expression>
       case <case_expression>
         <statements>
       case <case_expression>
         <statements>
         ...
         ...
       otherwise
           <statements>
    end
    

    详细例子
    在MATLAB中建立一个脚本文件,并输入下述代码:

    grade = 'B';
       switch(grade)
       case 'A' 
          fprintf('Excellent!
    ' );
       case 'B' 
           fprintf('Well done
    ' );
       case 'C' 
          fprintf('Well done
    ' );
       case 'D'
          fprintf('You passed
    ' );
       
       case 'F' 
         fprintf('Better try again
    ' );
         
       otherwise
         fprintf('Invalid grade
    ' );
       end
    

    运行该文件,显示下述结果:

    Well done
    Your grade is  B
    

    循环

    MATLAB while循环

    MATLAB的 while 循环会重复执行 while 与 end 语句间的运算式,只要表达式为 true。

    MATLAB while循环语法
    在MATLAB 中 while循环的语法如下:

    while <expression>
       <statements>
    end
    

    while 循环反复执行程序语句只要表达式为 true。

    当结果不为空,并包含所有非零元素(逻辑或实际数字),表达式为 true ;否则,表达式为 false。

    详细例子
    在MATLAB中建立一个脚本文件,并输入以下代码:

    a = 10;
    % while loop execution 
    while( a < 20 )
      fprintf('value of a: %d
    ', a);
      a = a + 1;
    end
    

    运行该文件,显示结果如下:

    value of a: 10
    value of a: 11
    value of a: 12
    value of a: 13
    value of a: 14
    value of a: 15
    value of a: 16
    value of a: 17
    value of a: 18
    value of a: 19
    

    MATLAB for循环

    MATLAB中 for 循环是一个重复的控制结构,可以有效地写一个循环,只是执行的次数是特定的。

    MATLAB for 循环语法:
    MATLAB中的 for循环的语法如下:

    for index = values
      <program statements>
              ...
    end
    

    for 循环的值有下述三种形式之一:

    格式 描述
    initval:endval 将索引变量从初始到终值递增1,并重复执行程序语句,直到索引值大于终值。
    initval:step:endval 按每次迭代中的值步骤递增索引, 或在步骤为负值时递减。
    valArray 在每个迭代 valArrayon 数组的后续列中创建列向量索引。例如, 在第一次迭代中, index = valArray (:, 1),循环执行最大 n 次, 其中 n 是 valArray 的列数,由 numel (valArray, 1,:) 给出。输入 valArray 可以是任何 MATLAB 数据类型, 包括字符串、单元格数组或结构。
    详细例子如下:
    例子 1
    在MATLAB中建立一个脚本文件,并输入下述代码:
    for a = 10:20 
      fprintf('value of a: %d
    ', a);
    end
    

    运行文件,显示下述结果:

    value of a: 10
    value of a: 11
    value of a: 12
    value of a: 13
    value of a: 14
    value of a: 15
    value of a: 16
    value of a: 17
    value of a: 18
    value of a: 19
    value of a: 20
    

    例子 2
    在MATLAB中建立一个脚本文件,并输入下述代码:

    for a = 1.0: -0.1: 0.0
       disp(a)
    end
    

    运行该文件,显示以下结果:

    1
    
        0.9000
    
        0.8000
    
        0.7000
    
        0.6000
    
        0.5000
    
        0.4000
    
        0.3000
    
        0.2000
    
        0.1000
    
         0
    

    例子3
    在MATLAB中建立一个脚本文件,并输入下述代码:

    for a = [24,18,17,23,28]
       disp(a)
    end
    

    运行该文件,显示下述结果:

        24
    
        18
    
        17
    
        23
    
        28
    

    MATLAB矩阵

    在MATLAB中创建矩阵有以下规则:

    矩阵元素必须在 “[ ]” 内;
    矩阵的同行元素之间用空格(或 “,”)隔开;
    矩阵的行与行之间用 “;”(或回车符)隔开;
    矩阵的元素可以是数值、变量、表达式或函数;
    矩阵的尺寸不必预先定义。
    下面的例子中我们创建了一个4×5的矩阵:

    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]
    

    MATLAB 将执行上述语句,并返回以下结果:

    a =
         1     2     3     4     5
         2     3     4     5     6
         3     4     5     6     7
         4     5     6     7     8
    

    MATLAB引用一个矩阵的元素
    如果要引用 mth 行和 nth 列的一个元素,写法如下:

    mx(m, n);
    

    例如,参阅第2行和第5列中的元素的矩阵,所创建的最后一节中,我们输入:

    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
    a(2,5)
    

    MATLAB将执行上述语句,并返回结果:

    ans =
         6
    

    引用m列中的所有元素,我们A型(m)。

    接下来我们要从矩阵 a 的第4行的元素开始建立一个列向量 v :

    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
    v = a(:,4)
    

    MATLAB将执行上述语句,并返回结果:

    v =
         4
         5
         6
         7
    

    当然也可以选择第 n 列的 m 个元素,对于这一点,写法如下:

    a(:,m:n)
    

    我们建立一个较小的矩阵中的元素,第二和第三列:

    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
    a(:, 2:3)
    

    MATLAB将执行上述语句,并返回以下结果:

    ans =
         2     3
         3     4
         4     5
         5     6
    

    用相同的方式,则可以建立一个子矩阵的一个子部分的矩阵。

    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
    a(:, 2:3)
    

    MATLAB将执行上述语句,并返回结果:

    ans =
         2     3
         3     4
         4     5
         5     6
    

    用相同的方式,则可以创建一个子矩阵的一个子部分的矩阵。

    例如,让我们创建一个子矩阵内部子部分的:

    3     4     5     
    4     5     6  
    

    下述写法可以达到该目的:

    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
    sa = a(2:3,2:4)
    

    MATLAB将执行上述语句,并返回结果:

    sa =
         3     4     5
         4     5     6
    

    MATLAB删除行或列矩阵
    可以删除整行或整列的矩阵,只要分配一组空方括号 [ ] 给该行或列。

    基本上,[ ] 表示一个空数组。

    在下述例子中我们删除第四行:

    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
    a( 4 , : ) = []
    

    MATLAB将执行上述语句,并返回结果:

    a =
         1     2     3     4     5
         2     3     4     5     6
         3     4     5     6     7
    

    接下来,我们删除第五列:

    a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
    a(: , 5)=[]
    

    MATLAB将执行上述语句,并返回结果:

    a =
         1     2     3     4
         2     3     4     5
         3     4     5     6
         4     5     6     7
    

    详细例子
    在本例中,我们会建立一个3-3的矩阵 m,并把矩阵 m 中的第二行和第三行复制两次,这样就能够建立一个4×3的矩阵。

    在MATLAB中建立一个脚本文件,代码如下:

    a = [ 1 2 3 ; 4 5 6; 7 8 9];
    new_mat = a([2,3,2,3],:)
    

    运行该文件,显示结果:

    new_mat =
         4     5     6
         7     8     9
         4     5     6
         7     8     9
    

    MATLAB矩阵的行列式

    MATLAB要计算对应矩阵行列式的值的指令为:d=det(A),该指令返回矩阵 A 的行列式,并把所得值赋给 d。若 A 仅包含整数项,则该结果 d 也是一个整数。

    详细例子
    在MATLAB中建立一个脚本文件,代码如下:

    a = [ 1 2 3; 2 3 4; 1 2 5]
    det(a)
    

    运行该文件,显示以下结果:

    a =
         1     2     3
         2     3     4
         1     2     5
    ans =
        -2
    

    MATLAB函数

    在MATLAB中,函数定义在单独的文件。文件函数的文件名应该是相同的。

    函数是一组语句一起执行任务。

    函数在自己的工作空间进行操作,被称为本地工作区,独立的工作区;在 MATLAB 命令提示符访问,这就是所谓的基础工作区的变量。

    函数可以接受多个输入参数和可能返回多个输出参数。

    函数语句的语法是:

    function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
    

    详细例子
    下述有个 mymax 函数,它需要五个数字作为参数并返回最大的数字。

    建立函数文件,命名为 mymax.m 并输入下面的代码:

    function max = mymax(n1, n2, n3, n4, n5)
    %This function calculates the maximum of the
    % five numbers given as input
    max =  n1;
    if(n2 > max)
        max = n2;
    end
    if(n3 > max)
       max = n3;
    end
    if(n4 > max)
        max = n4;
    end
    if(n5 > max)
        max = n5;
    end
    

    每个函数的第一行要以 function 关键字开始。它给出了函数的名称和参数的顺序。

    在我们的例子中,mymax 函数有5个输入参数和一个输出参数。

    注释行语句的功能后提供的帮助文本。这些线条打印,当输入:

    help mymax
    

    MATLAB执行上述语句,返回以下结果:

    This function calculates the maximum of the
     five numbers given as input
    

    可以调用该函数:

    mymax(34, 78, 89, 23, 11)
    

    MATLAB执行上述语句,返回以下结果:

    ans =
        89
    

    MATLAB匿名函数
    一个匿名的函数就像是在传统的编程语言,在一个单一的 MATLAB 语句定义一个内联函数。

    它由一个单一的 MATLAB 表达式和任意数量的输入和输出参数。

    在MATLAB命令行或在一个函数或脚本可以定义一个匿名函数。

    这种方式,可以创建简单的函数,而不必为他们创建一个文件。

    建立一个匿名函数表达式的语法如下:

    f = @(arglist)expression
    

    详细例子
    在这个例子中,我们将编写一个匿名函数 power,这将需要两个数字作为输入并返回第二个数字到第一个数字次幂。

    在MATLAB中建立一个脚本文件,并输入下述代码:

    power = @(x, n) x.^n;
    result1 = power(7, 3)
    result2 = power(49, 0.5)
    result3 = power(10, -10)
    result4 = power (4.5, 1.5)
    

    运行该文件时,显示结果:

    result1 =
       343
    result2 =
         7
    result3 =
       1.0000e-10
    result4 =
        9.5459
    

    主要函数和子函数
    在一个文件中,必须定义一个匿名函数以外的任何函数。每个函数的文件包含一个必需的主函数和首先出现的任何数量的可选子函数,在主要函数之后使用。

    主要函数可以调用的文件,它定义之外,无论是从命令行或从其他函数,但子功能不能被称为命令行或其他函数,外面的函数文件。

    子功能可见函数内的文件,它定义它们的主要函数和其他函数。

    详细例子
    我们写一个 quadratic 函数来计算一元二次方程的根。

    该函数将需要三个输入端,二次系数,线性合作高效的和常数项,它会返回根。

    函数文件 quadratic.m 将包含的主要 quadratic 函数和子函数 disc 来计算判别。

    在MATLAB中建立一个函数文件 quadratic.m 并输入下述代码:

    function [x1,x2] = quadratic(a,b,c)
    %this function returns the roots of 
    % a quadratic equation.
    % It takes 3 input arguments
    % which are the co-efficients of x2, x and the 
    %constant term
    % It returns the roots
    d = disc(a,b,c); 
    x1 = (-b + d) / (2*a);
    x2 = (-b - d) / (2*a);
    end % end of quadratic
    
    function dis = disc(a,b,c) 
    %function calculates the discriminant
    dis = sqrt(b^2 - 4*a*c);
    end % end of sub-function
    

    可以从命令提示符调用上述函数为:

    quadratic(2,4,-4)
    

    MATLAB执行上面的语句,返回以下结果:

    ans =
        0.7321
    

    MATLAB嵌套函数
    在这个机体内另一个函数,可以定义函数。这些被称为嵌套函数。

    嵌套函数包含任何其他函数的任何或所有的组件。

    嵌套函数被另一个函数的范围内定义他们共享访问包含函数的工作区。

    嵌套函数的语法如下:

    function x = A(p1, p2)
    ...
    B(p2)
       function y = B(p3)
       ...
       end
    ...
    end
    

    详细例子
    我们重写前面例子的 quadratic 函数,但是,这一次的 disc 函数将是一个嵌套函数。

    在MATLAB中建立一个函数文件 quadratic2.m,并输入下述代码:

    function [x1,x2] = quadratic2(a,b,c)
    function disc  % nested function
    d = sqrt(b^2 - 4*a*c);
    end % end of function disc
    disc;
    x1 = (-b + d) / (2*a);
    x2 = (-b - d) / (2*a);
    end % end of function quadratic2
    

    可以从命令提示符调用上面的函数为:

    quadratic2(2,4,-4)
    

    MATLAB执行上面的语句,返回以下结果:

    ans =
        0.7321
    

    MATLAB私有函数
    一个私有函数是一个主要的函数,是只看得见一组有限的其它函数。

    如果不想公开的执行的一个函数,可以创建私有函数。

    私有函数驻留特殊的名字私人的子文件夹中。

    他们是可见的,只有在父文件夹的函数。

    详细例子
    重写 quadratic 函数。然而,这时计算​​的判别式 disc 函数,是一个私有函数。

    在MATLAB中建立一个子文件夹命名为私人工作目录。它存储在以下函数文件 disc.m:

    function dis = disc(a,b,c) 
    %function calculates the discriminant
    dis = sqrt(b^2 - 4*a*c);
    end % end of sub-function
    

    在工作目录,创建一个函数 quadratic3.m ,输入下述代码:

    function [x1,x2] = quadratic3(a,b,c)
    %this function returns the roots of 
    % a quadratic equation.
    % It takes 3 input arguments
    % which are the co-efficients of x2, x and the 
    %constant term
    % It returns the roots
    d = disc(a,b,c); 
    x1 = (-b + d) / (2*a);
    x2 = (-b - d) / (2*a);
    end % end of quadratic3
    

    可以从命令提示符调用上面的函数为:

    quadratic3(2,4,-4)
    

    MATLAB执行上面的语句,返回以下结果:

    ans =
        0.7321
    

    MATLAB全局变量
    全局变量可以共享由一个以上的函数。对于这一点,需要将变量声明为全局在所有的函数可使用。

    如果想访问该变量从基工作区,然后在命令行声明的变量。

    全局声明必须出现在变量中实际上是使用功能。这是一个很好的做法是使用大写字母为全局变量的名称,以区别于其他变量。

    详细例子
    创建一个函数文件名为 average.m ,输入下述代码:

    function avg = average(nums)
    global TOTAL
    avg = sum(nums)/TOTAL;
    end
    

    在MATLAB中建立一个脚本文件,输入下面的代码:

    global TOTAL;
    TOTAL = 10;
    n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];
    av = average(n)
    

    运行该文件,显示以下结果:

    av =
       35.5000
    

    MATLAB数据导入

    在编写一个程序时,经常需要从外部读入数据。MATLAB使用多种格式打开数据。本章将要介绍MATLAB中数据的导入。

    MATLAB中导入数据的方式有两种,分别是在命令行通过代码把数据导进去和通过MATLAB的数据导入向导导入数据。本节将为大家介绍第一种数据导入方法。

    MATLAB中导入数据意味着从外部文件加载数据。importdata 函数允许加载各种数据的不同格式的文件。它具有以下五种形式:

    S.N. 函数&说明
    1 A = importdata(filename)将数据从文件名所表示的文件中加载到数组 A 中。
    2 A = importdata('-pastespecial') 从系统剪贴板加载数据,而不是从文件加载数据。
    3 A = importdata(___, delimiterIn) 将 delimiterIn 解释为 ASCII 文件、文件名或剪贴板数据中的列分隔符。可以将 delimiterIn 与上述语法中的任何输入参数一起使用。
    4 A = importdata(___, delimiterIn, headerlinesIn)从 ASCII 文件、文件名或剪贴板加载数据,并从 lineheaderlinesIn+1 开始读取数字数据。
    5 [A, delimiterOut, headerlinesOut] = importdata(___)
    在分隔符输出中返回检测到的分隔符字符,并使用前面语法中的任何输入参数检测headerlinesOut 中检测到的标题行数。
    默认情况下,Octave 没有importdata() 函数的支持,所以要搜索并安装这个包下面的例子Octave 安装工作。
    示例 1
    该例中我们将加载和显示图像文件。

    在MATLAB中建立一个脚本文件,并输入下述代码:

    filename = 'smile.jpg';
    A = importdata(filename);
    image(A);
    

    运行该文件,MATLAB显示出图像文件。

    注意:该图像文件必须保存在当前目录。

    示例 2
    本例中,我们在MATLAB中导入文本文件,并指定分隔符和列标题。

    我们建立以空格分隔的 ASCII 文件的列标题,文件名为 weeklydata.txt。

    文本文件 weeklydata.txt 内容如下:

    SunDay  MonDay  TuesDay  WednesDay  ThursDay  FriDay  SatureDay
    95.01   76.21   61.54    40.57       55.79    70.28   81.53
    73.11   45.65   79.19    93.55       75.29    69.87   74.68
    60.68   41.85   92.18    91.69       81.32    90.38   74.51
    48.60   82.14   73.82    41.03       0.99     67.22   93.18
    89.13   44.47   57.63    89.36       13.89    19.88   46.60
    

    在MATLAB中建立一个脚本文件,并输入下述代码:

    filename = 'weeklydata.txt';
    delimiterIn = ' ';
    headerlinesIn = 1;
    A = importdata(filename,delimiterIn,headerlinesIn);
    % View data
    for k = [1:7]
       disp(A.colheaders{1, k})
       disp(A.data(:, k))
       disp(' ')
    end
    

    运行该文件,显示以下结果:

    SunDay
       95.0100
       73.1100
       60.6800
       48.6000
       89.1300
     
    MonDay
       76.2100
       45.6500
       41.8500
       82.1400
       44.4700
     
    TuesDay
       61.5400
       79.1900
       92.1800
       73.8200
       57.6300
    
    WednesDay
       40.5700
       93.5500
       91.6900
       41.0300
       89.3600
     
    ThursDay
       55.7900
       75.2900
       81.3200
        0.9900
       13.8900
     
    FriDay
       70.2800
       69.8700
       90.3800
       67.2200
       19.8800
    
    SatureDay
       81.5300
       74.6800
       74.5100
       93.1800
       46.6000
    

    示例 3
    本例讲的是如何从剪贴板导入数据到MATLAB。

    复制到剪贴板中的以下几行:

    Mathematics is simple
    

    在MATLAB中建立一个脚本文件,并输入下述代码:

    A = importdata('-pastespecial')
    

    运行该文件,显示以下结果:

    A = 
        'Mathematics is simple'
    

    MATLAB低级别的文件I / O
    MATLAB 中 importdata 函数是一个高层次的函数。如果要处理低级别的文件,在MATLAB中的 I / O 功能允许读取或写入数据到一个文件中的大部分控制权。但是,使用这些功能的要求是这些文件需要具有更加详细的信息,这样能够提高工作效率。

    MATLAB字节或字符的读取和写入操作提供了以下功能:

    函数 描述
    fclose 关闭一个或全部已打开的文件
    feof 测试文件结尾
    ferror 有关文件I / O错误的信息
    fgetl 从文件读取行, 删除换行符
    fgets 从文件读取行, 保留换行符
    fopen 打开文件, 或获取有关打开的文件的信息
    fprintf 将数据写入文本文件
    fread 从二进制文件读取数据
    frewind 将文件位置指示器移动到打开文件的开头
    fscanf 从文本文件读取数据
    fseek 移动到文件中的指定位置
    ftell 获得打开文件的位置
    fwrite 将数据写入二进制文件
    MATLAB导入文本数据文件与低级别的I/O
    MATLAB 低层次的导入文本数据文件由以下函数实现:

    fscanf 函数读取文本或 ASCII 文件格式的数据。

    fgetl 函数和 fgets 函数读取一行的文件,换行符分隔每一行。

    fread 函数读出的数据流的字节或位的级别。

    具体例子
    我们有 myfile.txt 文本数据文件保存在我们的工作目录。该文件存储3个月的降雨量数据,分别是2012年的6月,7月和8月。

    myfile.txt 包含重复的数据集的时间,一个月的雨量测量五个数据项。头数据存储数个月的中号,所以我们有M组测量。

    该文件内容如下:

    Rainfall Data
    Months: June, July, August
     
    M=3
    12:00:00
    June-2012
    17.21  28.52  39.78  16.55 23.67
    19.15  0.35   17.57  NaN   12.01
    17.92  28.49  17.40  17.06 11.09
    9.59   9.33   NaN    0.31  0.23 
    10.46  13.17  NaN    14.89 19.33
    20.97  19.50  17.65  14.45 14.00
    18.23  10.34  17.95  16.46 19.34
    09:10:02
    July-2012
    12.76  16.94  14.38  11.86 16.89
    20.46  23.17  NaN    24.89 19.33
    30.97  49.50  47.65  24.45 34.00
    18.23  30.34  27.95  16.46 19.34
    30.46  33.17  NaN    34.89  29.33
    30.97  49.50  47.65  24.45 34.00
    28.67  30.34  27.95  36.46 29.34
    15:03:40
    August-2012
    17.09  16.55  19.59  17.25 19.22
    17.54  11.45  13.48  22.55 24.01
    NaN    21.19  25.85  25.05 27.21
    26.79  24.98  12.23  16.99 18.67
    17.54  11.45  13.48  22.55 24.01
    NaN    21.19  25.85  25.05 27.21
    26.79  24.98  12.23  16.99 18.67
    

    我们将数据导入此文件,并显示这些数据。步骤如下:

    使用 fopen 函数打开文件并获得文件标识符。

    描述文件中的数据格式说明符,如 '%s' 为一个字符串,'%d' 为一个整数,或 '%f' 表示一个浮点数。

    要跳过文字字符的文件,包括他们的格式描述。要跳过一个数据字段,在符使用一个星号(“*”)。

    例如,要读取头,并返回单个的M值,我们这样写:

    M = fscanf(fid, '%*s %*s
    %*s %*s %*s %*s
    M=%d
    
    ', 1);
    

    缺省情况下,fscanf读取数据,直到它可以根据我们的格式说明描述的数据不匹配,或它到达文件末尾的。在这里,我们将使用for循环阅读3组数据,每一次,它会读取7行5列。

    我们将创建一个名为 mydata 在工作区中,从文件中读取数据存储结构。这种结构具有三个字段:时间、月和 raindata 阵列。

    在MATLAB中建立一个脚本文件,并输入下述代码:

    filename = '/data/myfile.txt';
    rows = 7;
    cols = 5;
     
    % open the file
    fid = fopen(filename);
     
    % read the file headers, find M (number of months)
    M = fscanf(fid, '%*s %*s
    %*s %*s %*s %*s
    M=%d
    
    ', 1);
     
    % read each set of measurements
    for n = 1:M
        mydata(n).time = fscanf(fid, '%s', 1);
        mydata(n).month = fscanf(fid, '%s', 1);
     
        % fscanf fills the array in column order,
        % so transpose the results
        mydata(n).raindata  = ...
          fscanf(fid, '%f', [rows, cols]);
    end
    for n = 1:M
        disp(mydata(n).time), disp(mydata(n).month)
        disp(mydata(n).raindata)
    end
     
    % close the file
    fclose(fid);
    

    运行该文件,显示以下结果:

    12:00:00
    June-2012
       17.2100   17.5700   11.0900   13.1700   14.4500
       28.5200       NaN    9.5900       NaN   14.0000
       39.7800   12.0100    9.3300   14.8900   18.2300
       16.5500   17.9200       NaN   19.3300   10.3400
       23.6700   28.4900    0.3100   20.9700   17.9500
       19.1500   17.4000    0.2300   19.5000   16.4600
        0.3500   17.0600   10.4600   17.6500   19.3400
    
    09:10:02
    July-2012
       12.7600       NaN   34.0000   33.1700   24.4500
       16.9400   24.8900   18.2300       NaN   34.0000
       14.3800   19.3300   30.3400   34.8900   28.6700
       11.8600   30.9700   27.9500   29.3300   30.3400
       16.8900   49.5000   16.4600   30.9700   27.9500
       20.4600   47.6500   19.3400   49.5000   36.4600
       23.1700   24.4500   30.4600   47.6500   29.3400
    
    15:03:40
    August-2012
       17.0900   13.4800   27.2100   11.4500   25.0500
       16.5500   22.5500   26.7900   13.4800   27.2100
       19.5900   24.0100   24.9800   22.5500   26.7900
       17.2500       NaN   12.2300   24.0100   24.9800
       19.2200   21.1900   16.9900       NaN   12.2300
       17.5400   25.8500   18.6700   21.1900   16.9900
       11.4500   25.0500   17.5400   25.8500   18.6700
    

    MATLAB数据导出

    MATLAB 中数据导出表明可以将数据写入文件。

    MATLAB 允许你使用数据在另一个应用程序读取 ASCII 文件,MATLAB提供了多种数据输出选项。

    你可以建立以下类型的文件:

    矩形,从一个数组分隔的ASCII数据文件。

    日记或日志文件的按键和文本输出。

    专业的ASCII文件,如 fprintf 使用低层函数。

    使用 MEX 文件来访问你的 C/ C++ 或 Fortran 程序写入到一个特定的文本文件格式。

    另外,还可以将数据导出到 Excel。

    导出数字阵列作为分隔符的 ASCII 数据文件的方法有两种:

    使用 save 函数及指定的 ASCII 限定符

    使用 dlmwrite 函数

    使用 save 函数的语法如下:

    save my_data.out num_array -ASCII
    

    其中,my_data.out 定界 ASCII 创建的数据文件,num_array是一个数字的阵列和 ASCII 符。

    dlmwrite 函数的语法如下:

    dlmwrite('my_data.out', num_array, 'dlm_char')
    

    其中,my_data.out 定界 ASCII 创建的数据文件,num_array 是一个数字阵列和 dlm_char 作为分隔符。

    详细例子
    在MATLAB中建立一个脚本文件,并输入下述代码:

    num_array = [ 1 2 3 4 ; 4 5 6 7; 7 8 9 0];
    save array_data1.out num_array -ASCII;
    type array_data1.out
    dlmwrite('array_data2.out', num_array, ' ');
    type array_data2.out
    

    运行该文件,显示以下结果:

       1.0000000e+00   2.0000000e+00   3.0000000e+00   4.0000000e+00
       4.0000000e+00   5.0000000e+00   6.0000000e+00   7.0000000e+00
       7.0000000e+00   8.0000000e+00   9.0000000e+00   0.0000000e+00
    
    1 2 3 4
    4 5 6 7
    7 8 9 0
    

    请注意 save ASCII 命令和 dlmwrite 命令作为输入不起单元阵列作用。

    要创建一个分隔的 ASCII 文件,你可以从一个单元数组的内容

    要么,转换单元阵列一个矩阵使用 cell2mat 函数,

    或者导出单元阵列,使用低级别的文件 I/O 函数。

    如果使用 SAVE 功能写一个字符数组的 ASCII 文件,它等价 ASCII 码字符写入到文件中。

    例如,让我们写的字'hello'的文件:

    h = 'hello';
    save textdata.out h -ascii
    type textdata.out
    

    MATLAB执行上述语句,显示以下结果:

    1.0400000e+02   1.0100000e+02   1.0800000e+02   1.0800000e+02   1.1100000e+02
    

    这是字符的字符串 'hello' 的8位 ASCII 格式。

    写到日记文件
    日记文件的活动日志MATLAB的会话。日记函数创建您的会话在磁盘文件的精确副本,不包括图形。

    要打开的日记功能,输入:

    diary
    

    或者,您可以给日志文件的名字,说:

    diary logdata.out
    

    要关闭的日记函数:

    diary off
    

    可以在文本编辑器中打开日记文件。

    MATLAB低级别的I/O数据导出到文本数据文件
    到目前为止,我们已经导出数字阵列。MATLAB提供低级别的 fprintf 函数创建其他文本文件,包括组合的数字和字符数据,非矩形输出文件,或文件中使用非ASCII编码方案。

    在低级别的I/O文件活动,在导出之前需要用 fopen 函数打开或创建一个文件,得到的文件标识符。默认情况下,fopen 函数打开一个文件进行只读访问。你应该指定写入的权限或追加,如 'w' 或 'a'。

    处理文件后,你需要使用 fclose(fid) 函数关闭它。

    下面的例子演示了这一概念:

    详细例子
    在MATLAB中建立一个脚本文件,输入下述代码:

    % create a matrix y, with two rows
    x = 0:10:100;
    y = [x; log(x)];
     
    % open a file for writing
    fid = fopen('logtable.txt', 'w');
     
    % Table Header
    fprintf(fid, 'Log     Function
    
    ');
     
    % print values in column order
    % two values appear on each row of the file
    fprintf(fid, '%f    %f
    ', y);
    fclose(fid);
    % display the file created
    type logtable.txt
    

    运行该文件,显示以下结果:

    Log     Function
    
    0.000000    -Inf
    10.000000    2.302585
    20.000000    2.995732
    30.000000    3.401197
    40.000000    3.688879
    50.000000    3.912023
    60.000000    4.094345
    70.000000    4.248495
    80.000000    4.382027
    90.000000    4.499810
    100.000000    4.605170
    
  • 相关阅读:
    取消浏览器默认行为
    BootStrap基础
    JavaScript基础
    HTML和CSS基础
    03JDBC
    MySQL
    NER-BiLSTM+CRF
    pytroch-Dataset/DataLoader/collate_fn/pad_sequence方法介绍
    pytorch-LSTM()简单介绍
    NER-使用kashgari中的Bert+BiLSTM+CRF
  • 原文地址:https://www.cnblogs.com/void-lambda/p/12344358.html
Copyright © 2011-2022 走看看