Octave Tutorial

作者: 伤口不该结疤 | 来源:发表于2017-08-03 17:46 被阅读225次

    0. 概述

    机器学习 - Octave/Matlab Tutorial 课程,Octave 常用语法记录。

    1. 基本操作

    1.1 加减乘除

    octave:1> 5+6
    ans =  11
    octave:2> 1-2
    ans = -1
    octave:3> 2*2
    ans =  4
    octave:4> 2/1
    ans =  2
    octave:5> 2^3
    ans =  8
    

    1.2 逻辑运算

    octave:6> 1==1
    ans = 1
    octave:7> 1==0
    ans = 0
    octave:8> 1>0
    ans = 1
    
    octave:9> 1>-1 % true 注释使用%表示
    ans = 1
    octave:10> 1 ~= 2
    ans = 1
    octave:11> 1 && 0
    ans = 0
    octave:12> 1 || 0
    ans = 1
    

    1.3 变量定义

    >> num = 1; % 加分号,不回显结果
    >> num      % 不加分号,回显结果
    num =  1
    >> num = 3
    num =  3
    >> str = 'hello'
    str = hello
    

    1.4 disp打印

    >> a=pi
    a =  3.1416
    >> disp(a)
     3.1416
    >> disp(sprintf('a = %0.2f', a)) % 格式化打印
    a = 3.14
    >> disp(sprintf('a : %f', a)) % 格式化打印
    a : 3.141593
    

    1.5 格式化输出

    >> format long
    >> a
    a =  3.14159265358979
    >> format short
    >> a
    a =  3.1416
    

    2. 矩阵和向量

    2.1 矩阵和向量的初始化

    >> A = [1 2; 3 4; 5 6]  % 矩阵的第一种赋值方法
    A =
    
       1   2
       3   4
       5   6
    
    >> A = [7 8; % 矩阵的第二种赋值方法
    > 2 1;
    > 1 1]
    A =
    
       7   8
       2   1
       1   1
    
    >> v = [1 2 3]
    v =
    
       1   2   3
    
    % 向量赋值方法1
    >> v = [1;2;3]
    v =
    
       1
       2
       3
    
    % 向量赋值方法2 : 从0.1开始,每次增加0.1,直到0.5结束
    >> v = 0.1:0.1:0.5
    v =
    
        0.10000    0.20000    0.30000    0.40000    0.50000
    
    % 向量赋值方法方法3 : 从1到8
    >> v = 1:8
    v =
    
        1   2   3   4   5   6   7   8
    

    2.2 使用函数对矩阵和向量进行初始化

    % ones快速生成一个元素值全部为1的矩阵
    >> ones(2,3)
    ans =
    
       1   1   1
       1   1   1
    
    >> 2*ones(2,3)
    ans =
    
       2   2   2
       2   2   2
    
    % zeros生成一个元素值全为0的矩阵
    >> zeros(2,3)
    ans =
    
       0   0   0
       0   0   0
      
    % rand生成一个随机矩阵
    >> rand(2,3)
    ans =
    
       0.979697   0.966868   0.633496
       0.445040   0.055706   0.765505
    
    % 生成高斯分布矩阵
    
    >randn(1,3)
     ans =
    
      -1.05789   0.32224   0.17978
    
       
     %  eye生成单位矩阵
     
     >> eye(2)
    ans =
    
    Diagonal Matrix
    
       1   0
       0   1
    
    >> eye(5)
    ans =
    
    Diagonal Matrix
    
       1   0   0   0   0
       0   1   0   0   0
       0   0   1   0   0
       0   0   0   1   0
       0   0   0   0   1
    

    3. 移动数据

    3.1 计算矩阵大小

    >> A
    A =
    
       7   8
       2   1
       1   1
    
    % A是3 x 2的矩阵,使用size计算矩阵大小
    >> size(A)
    ans =
    
       3   2
    
    % size返回的值也是一个矩阵
    >> sz = size(A)
    sz =
    
       3   2
    
    % sz是一个1 x 2的矩阵
    >> size(sz)
    ans =
    
       1   2
    

    3.2 求矩阵的行和列

    % 求矩阵行数
    >> size(A,1)
    ans =  3
    
    % 求矩阵列数
    >> size(A,2)
    ans =  2
    
    >> A = rand(2,3)
    A =
    
       0.766966   0.786498   0.290525
       0.510301   0.027376   0.071131
    
    % 返回最大维度
    >> length(A)
    ans =  3
    
    >> A = rand(4,5)
    A =
    
       0.6164504   0.6345112   0.2603182   0.4056419   0.3731856
       0.8411107   0.5452773   0.9944839   0.4764993   0.6534092
       0.2136008   0.4495056   0.2458233   0.0045728   0.0553468
       0.4773705   0.2054836   0.1811563   0.2756683   0.7862909
    
    % 返回最大维度
    >> length(A)
    ans =  5
    
    >> v= [1 2 3 4]
    v =
    
       1   2   3   4
    
    >> length(v)
    ans =  4
    

    3.3 加载数据

    % 路径查看和切换,和linux命令一样
    >> pwd
    ans = C:\Users\admin
    >> cd D:
    >> pwd
    ans = D:\
    
    % D中有一支文件featuresX.dat,里面存有数据
    >> ls
     驱动器 D 中的卷是 本地磁盘
     卷的序列号是 0003-7901
    
     D:\ 的目录
    
    [AppData]                 [Gliffy Diagrams]         [PTCRB]
    [ASM]                     [MachineLearningInAction] [Python]
    [Document]                [MyDrivers]               [RTMP]
    featuresX.dat             [Program Files]           [Tool]
    [FreeMind]                [Program Files (x86)]
                   1 个文件             30 字节
                  13 个目录  9,018,798,080 可用字节
    
    % 使用load命令将featuresX.dat加载进来
    >> load featuresX.dat
    
    % 打印出featureX的值
    >> featuresX
    featuresX =
    
       2102      1
       2020      2
       1123      4
       2339      5
       
    % 取featuresX的第1到第8个值,一列一的取值
    >> B = featuresX(1:8)
    B =
    
       2102   2020   1123   2339      1      2      4      5
       
    % 保存数据到磁盘
    
    >> save v.mat v;
    % v.mat的内容,被保存到D盘
    # Created by Octave 4.2.1, Wed Jul 26 09:40:12 2017 GMT <unknown@unknown>
    # name: v
    # type: matrix
    # rows: 1
    # columns: 8
     2102 2020 1123 2339 1 2 4 5
     
     
    >> A = featuresX
    A =
    
       2102      1
       2020      2
       1123      4
       2339      5
    
    % 也可以保存为普通文本
    >> save A.txt A -ascii
    
    % A.txt的文件内容
     2.10200000e+003 1.00000000e+000
     2.02000000e+003 2.00000000e+000
     1.12300000e+003 4.00000000e+000
     2.33900000e+003 5.00000000e+000
    

    3.4 变量查看和管理

    % 使用who命令,可以查到当前有哪些变量
    >> who
    Variables in the current scope:
    
    A          a          ans        featuresX  num        str        sz         v
    
    % 使用whos,可以查看变量的详细信息
    >> whos
    Variables in the current scope:
    
       Attr Name           Size                     Bytes  Class
       ==== ====           ====                     =====  =====
            A              4x5                        160  double
            a              1x1                          8  double
            ans            1x2                         16  double
            featuresX      4x2                         64  double
            num            1x1                          8  double
            str            1x5                          5  char
            sz             1x2                         16  double
            v              1x4                         32  double
    
    Total is 43 elements using 309 bytes
    
    % 使用clear可以清除某个变量
    
    >> clear featuresX
    >> whos
    Variables in the current scope:
    
       Attr Name        Size                     Bytes  Class
       ==== ====        ====                     =====  =====
            A           4x5                        160  double
            a           1x1                          8  double
            ans         1x2                         16  double
            num         1x1                          8  double
            str         1x5                          5  char
            sz          1x2                         16  double
            v           1x4                         32  double
    
    Total is 35 elements using 245 bytes
    
    % clear清除所有变量
    >> clear
    >> whos
    >>
    

    3.5 取矩阵中的元素

    >> A = [1 2;3 4;5 6]
    A =
    
       1   2
       3   4
       5   6
    
    % 取第3行第1列的元素的值
    >> A(3,1)
    ans =  5
    
    % 取第2行的元素的值
    >> A(2,:)
    ans =
    
       3   4
    
    % 取第2列的元素的值
    >> A(:,2)
    ans =
    
       2
       4
       6
        
    % 取index为1和3的那两行
    >> B = [2 390 1;48 39 03;2003 3 1]
    B =
    
          2    390      1
         48     39      3
       2003      3      1
    
    >> B([1 3], :)
    ans =
    
          2    390      1
       2003      3      1
    
    % 以sigle向量的形式输出所有元素
    >> B(:)
    ans =
    
          0
          1
          3
          2
         48
       2003
          0
          0
          0
          1
          3
          1
          1
          2
          3
    

    3.6 更改、新增和合并矩阵中的元素

    % 修改B的第2列的值
    >> B(:,2) = [0;0;0]
    B =
    
          2      0      1
         48      0      3
       2003      0      1
       
    % 为矩阵多增加一列
    >> B = [B, [1;2;3]]
    B =
    
          2      0      1      1
         48      0      3      2
       2003      0      1      3
    
    >> B = [[0;1;3], B]
    B =
    
      0      2      0      1      1
      1     48      0      3      2
      3   2003      0      1      3
      
    
    % 合并2个矩阵
    >> A = [1 2;3 4;5 6]
    A =
    
       1   2
       3   4
       5   6
    
    >> B = [7 8;9 10;11 12]
    B =
    
        7    8
        9   10
       11   12
    
    >> C = [A B] % 和[A, B]结果相同
    C =
    
        1    2    7    8
        3    4    9   10
        5    6   11   12
    
    >> C = [A; B]
    C =
    
        1    2
        3    4
        5    6
        7    8
        9   10
       11   12
    

    4. 矩阵计算

    4.1 乘法

    >>A
    A =
    
       1   2
       3   4
       5   6
    
    >>C
    C =
    
       1   2
       1   2
    
    >>A * C
    ans =
    
        3    6
        7   14
       11   22
       
    >>B
    B =
    
       11    2
        4    3
        1    2
    
    % A中的每个元素和B中对应位置元素相乘
    >>A .* B
    ans =
    
       11    4
       12   12
        5   12
    
    % 必须要维数相同
    >>A .* C
    error: product: nonconformant arguments (op1 is 3x2, op2 is 2x2)
    

    4.2 对矩阵中的每一个元素进行操作

    % .表示对每个元素操作
    >>A .^2
    ans =
    
        1    4
        9   16
       25   36
    
    % 对每一个元素的值加1   
    >>A .+1
    ans =
    
       2   3
       4   5
       6   7
    
    % 求每一个元素的倒数   
    >>1 ./ A
    ans =
    
       1.00000   0.50000
       0.33333   0.25000
       0.20000   0.16667
    
    >>v = [1;2;3]
    v =
    
       1
       2
       3
    
    >>log(v)
    ans =
    
       0.00000
       0.69315
       1.09861
    
    >>exp(v)
    ans =
    
        2.7183
        7.3891
       20.0855
    
    >>log(A)
    ans =
    
       0.00000   0.69315
       1.09861   1.38629
       1.60944   1.79176
    
    >>v = [-1;-2;-3]
    v =
    
      -1
      -2
      -3
    
    % 求绝对值
    >>abs(v)
    ans =
    
       1
       2
       3
    
    % 加-直接求负数
    >>-abs(v)
    ans =
    
      -1
      -2
      -3
    
    >>v
    v =
    
      -1
      -2
      -3
    
    % 每个元素+1
    >>v + 1
    ans =
    
       0
      -1    
      -2
    

    4.3 求转置矩阵

    % 求转置矩阵
    >>v'
    ans =
    
      -1  -2  -3
    

    4.4 过滤出小于/大于某个值的那一行

    >>a = [1 15 2 0.5]
    a =
    
        1.00000   15.00000    2.00000    0.50000
    
    % 小于3返回1,大于3返回0
    >>a < 3
    ans =
    
      1  0  1  1
    
    % 返回小于3的索引
    >>find(a < 3)
    ans =
    
       1   3   4
    
    % 生成magic矩阵,对角线和每行的值之和都相同    
    >>A = magic(3)
    A =
    
       8   1   6
       3   5   7
       4   9   2
    
    % r是行的index,c是列的index
    >>[r, c] = find(A >= 7)
    r =
    
       1
       3
       2
    
    c =
    
       1
       2
       3
    

    4.7 max函数 - 求矩阵中元素的最大值

    % 求矩阵中最大值
    >>max(v)
    ans = -1
    
    % 返回值和index
    >>[value, index] = max(v)
        value = -1
        index =  1
    
    % 取矩阵中最大的一行    
    >>max(A)
    ans =
    
       5   6  
    
    
    % 取2个矩阵中的最大元素
    >max(rand(4),rand(4))
    ans =
    
       0.839613   0.858532   0.737582   0.927485
       0.556008   0.852108   0.948826   0.204084
       0.158905   0.911859   0.804915   0.083046
       0.920546   0.724880   0.693291   0.267202
    
    >A = magic(3)
    A =
    
       8   1   6
       3   5   7
       4   9   2
    
    % 1表示取每一列的最大值
    >max(A,[],1)
    ans =
    
       8   9   7
    
    % 2表示取每一行的最大值
    >max(A,[],2)
    ans =
    
       8
       7
       9
    
    % 默认是取的每一行最大
    >max(A)
    ans =
    
       8   9   7
    
    % 取所有元素中的最大
    >max(max(A))
    ans =  9
    >
    
    >A(:)
    ans =
    
       8
       3
       4
       1
       5
       9
       6
       7
       2
    
    >max(A(:))
    ans =  9
    

    4.8 矩阵求和

    >A = magic(9)
    A =
    
       47   58   69   80    1   12   23   34   45
       57   68   79    9   11   22   33   44   46
       67   78    8   10   21   32   43   54   56
       77    7   18   20   31   42   53   55   66
        6   17   19   30   41   52   63   65   76
       16   27   29   40   51   62   64   75    5
       26   28   39   50   61   72   74    4   15
       36   38   49   60   71   73    3   14   25
       37   48   59   70   81    2   13   24   35
    
    >sum(A,1)
    ans =
    
       369   369   369   369   369   369   369   369   369
    
    >sum(A,2)
    ans =
    
       369
       369
       369
       369
       369
       369
       369
       369
       369
    
    >A.*eye(9)
    ans =
    
       47    0    0    0    0    0    0    0    0
        0   68    0    0    0    0    0    0    0
        0    0    8    0    0    0    0    0    0
        0    0    0   20    0    0    0    0    0
        0    0    0    0   41    0    0    0    0
        0    0    0    0    0   62    0    0    0
        0    0    0    0    0    0   74    0    0
        0    0    0    0    0    0    0   14    0
        0    0    0    0    0    0    0    0   35
    
    >sum(A.*eye(9))
    ans =
    
       47   68    8   20   41   62   74   14   35
    
    >sum(sum(A.*eye(9)))
    ans =  369
    
    % 
    >flipud(eye(9))
    ans =
    
    Permutation Matrix
    
       0   0   0   0   0   0   0   0   1
       0   0   0   0   0   0   0   1   0
       0   0   0   0   0   0   1   0   0
       0   0   0   0   0   1   0   0   0
       0   0   0   0   1   0   0   0   0
       0   0   0   1   0   0   0   0   0
       0   0   1   0   0   0   0   0   0
       0   1   0   0   0   0   0   0   0
       1   0   0   0   0   0   0   0   0
    
    >sum(sum(A.*flipud(eye(9))))
    ans =  369
    
    >A = magic(3)
    A =
    
       8   1   6
       3   5   7
       4   9   2
    
    
    >A * pinv(A)
    ans =
    
       1.00000  -0.00000   0.00000
       0.00000   1.00000  -0.00000
      -0.00000   0.00000   1.00000
    

    4.9 矩阵相关的函数

    >>a = rand(2)
    a =
    
       0.93306   0.80896
       0.69141   0.48648
    
    >>prod(a)
    ans =
    
       0.64513   0.39354
    
    >>floor(a)
    ans =
    
       0   0
       0   0
    
    >>ceil(a)
    ans =
    
       1   1
       1   1
    

    5. 控制语句和函数

    5.1 for循环

    >num=0
    num = 0
    >for i=1:5,
    > num = i + num;
    > end;
    >i
    i =  5
    >num
    num =  15
    
    >a=1:10;
    >a
    a =
    
        1    2    3    4    5    6    7    8    9   10
    

    5.2 while

    >v
    v =
    
          2
          4
          8
         16
         32
         64
        128
        256
        512
       1024
    
    >i=1;
    >while i<
    > v(i)=10
    > i=i+1;
    > end;
    >v
    v =
    
        100
        100
        100
        100
        100
         64
        128
        256
        512
       1024
    

    5.3 break

    >i=1;
    >while true,
    > v(i) = 999;
    > i = i+1;
    > if i==6,
    > break;
    > end;
    > end;
    >v
    v =
    
        999
        999
        999
        999
        999
         64
        128
        256
        512
       1024
    

    5.4 if - else

    >num=1
    num =  1
    >if num==1,
    > disp('num = 1...');
    > elseif num==2,
    > disp('num = 2...');
    > else
    > disp('num = ?...');
    > end;
    num = 1...
    

    6. 自定义函数

    6.1 function

    % D:\MachineLearningInAction\Test\sumFunc.m
    % y为返回值,x1和x2为传入的参数
    function y = sumFunc(x1,x2)
    
    y=x1+x2;
    
    % 运行
    >sumFunc(30,1)
    ans =  31
    
    % 返回多个参数
    % D:\MachineLearningInAction\Test\funTest.m
    function [y1,y2] = funTest(x1,x2)
    
    y1=x1+x2;
    y2=x1-x2;
    
    % 运行
    >[a,b] = funTest(20,30);
    >a
    a =  50
    >b
    b = -10
    

    6.2 设置路径

    >pwd
    ans = C:\
    >sumFunc(30,1)
    error: 'sumFunc' undefined near line 1 column 1
    >addpath('D:\MachineLearningInAction\Test')
    >sumFunc(30,1)
    ans =  31
    

    7. 向量化

    通过向量化的方式计算假设函数
    >X = [1 0.5;1 0.3; 1 0.7];
    >theta = [1;2];
    >X*theta
    ans =
    
       2.0000
       1.6000
       2.4000
    

    Programming Exercise 1: Linear Regression会有很多用到向量化的示例,此处不再做累述。

    8. 其他

    8.1 隐藏Octave版本号

    octave:22> PS1('>> ');
    >>
    

    8.2 help命令

    >> help eye
        'eye' is a built-in function from the file libinterp/corefcn/data.cc
        
         -- eye (N)
         -- eye (M, N)
         -- eye ([M N])
         -- eye (..., CLASS)
             Return an identity matrix.
        
             If invoked with a single scalar argument N, return a square NxN
             identity matrix.
        
             If supplied two scalar arguments (M, N), 'eye' takes them to be the
             number of rows and columns.  If given a vector with two elements,
             'eye' uses the values of the elements as the number of rows and
             columns, respectively.  For example:
        
                  eye (3)
                   =>  1  0  0
                       0  1  0
                       0  0  1
    

    9. 图形化

    9.1 plot绘制图形

    >t=[0:0.01:0.98];
    >y1=sin(2*pi*4*t);
    >plot(t,y1);
    
    sin(2*pi*4*t)
    >y2=cos(2*pi*4*t);
    >plot(t,y2);
    
    cos(2*pi*4*t)

    9.2 hold on将多个图像显示到一个figure上

    >hold on; % 将y1和y2画到一个figure上
    >plot(t,y1,'g'); % 设置y1的颜色为绿色
    >plot(t,y2,'r') % 设置y2的颜色为red
    >xlabel('time') % 设置x的label为time
    >ylabel('value') % 设置y的label为value
    
    将y1和y2画到一个figure上

    9.3 设置legend和title

    >legend('sin','cos');
    >title('my plot')
    
    legend和title

    9.4 保存图像为png

    >print -dpng 'myPlot.png'
    % 图片将保存到C盘
    >pwd
    ans = C:\
    
    print -dpng

    9.5 关闭figure - close

    close.gif

    9.6 分别绘制到2个figure

    >figure(1);plot(t,y1);
    >figure(2);plot(t,y2);
    
    分别绘制

    9.7 分块 subplot

    % 将图形分为1个1*2的格子,使用第一个格子
    subplot(1,2,1);
    
    将图形分为1个1*2的格子,使用第一个格子
    % 将y1画到第一个格子中
    plot(t,y1);
    
    将y1画到第一个格子中
    % 将图形分为1个1*2的格子,使用第2个格子
    >subplot(1,2,2);
    % 将y2画到第2个格子中
    >plot(t,y2);
    
    将图形分为1个1*2的格子,使用第2个格子,将y2画到第2个格子中

    9.8 设置刻度 axis

     % 设置y2的刻度:x轴大小范围0.5 - 1,y轴大小范围-1 - 1
     >axis([0.5 1 -1 1])
    
    设置y2的刻度:x轴大小范围0.5 - 1,y轴大小范围-1 - 1

    9.9 clf - 清除图像内容

    >clf
    
    清除图像内容

    9.10 可视化矩阵

    >A = magic(5)
    A =
    
       17   24    1    8   15
       23    5    7   14   16
        4    6   13   20   22
       10   12   19   21    3
       11   18   25    2    9
    
    >imagesc(A)
    
    可视化矩阵
     % 显示colorbar,并设置为灰色
     >imagesc(A),colorbar,colormap gray;
    
    显示colorbar,并设置为灰色
    % 通过help colormap可以查看支持的颜色
    >help colormap
    
    通过help colormap可以查看支持的颜色
    % 设置颜色为hot,hot由black, red, orange, yellow, white几种颜色组成
    >imagesc(A),colorbar,colormap hot;
    
    colormap hot

    相关文章

      网友评论

        本文标题:Octave Tutorial

        本文链接:https://www.haomeiwen.com/subject/pkpnkxtx.html