吴恩达的机器学习课程的作业可以使用Matlab或者octave,这里记录一下octave的基本操作。

Contents

符号

符号 解释
% 注释
~= 不等于
; 结束符
> 大于
< 小于
= 等于
+
-
*
/
转置

> , < , =这些符号可以应用到矩阵中,可以将矩阵中的每一个元素和符号后的数字进行比较,最终判断成立返回1, 判断错误返回0.

示例:

>> 1+1
ans = 2
>> 1*8
ans = 8
>> a = 3
a = 3
>> a~=1
ans = 1
>> a~=3
ans = 0
>> a = [11 2 3; 1 21 3 ; 1 2 32]
a =

11 2 3
1 21 3
1 2 32

>> a >10
ans =

1 0 0
0 1 0
0 0 1
>> a == 10
ans =

0 0 0
0 0 0
0 0 0

>> a == 1
ans =

0 0 0
1 0 0
1 0 0
>> a'
ans =

11 1 1
2 21 2
3 3 32

矩阵

矩阵初始化

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

1 2 3
4 5 6
7 8 9

注:;代表的是换行,每一行中可以拿,隔开也可以不用,直接空开就可以。

特殊矩阵初始化

单位阵:

>> eye(3)
ans =

Diagonal Matrix

1 0 0
0 1 0
0 0 1

全一阵:

>> ones(3,3) % 前一个3为行数,后一个3为列数
ans =

1 1 1
1 1 1
1 1 1

全零阵:

>> zeros(2,3)
ans =

0 0 0
0 0 0

随机矩阵:

>> rand(3,3)
ans =

0.1583 0.6459 0.4255
0.4938 0.3079 0.2308
0.1299 0.7594 0.4041

魔法矩阵:每行,每列,对角的和都相等的矩阵

>> magic(3)
ans =

8 1 6
3 5 7
4 9 2

矩阵索引

:冒号表示从…到…,单独的冒号表示所有

︋>> a  = [1 2 3; 4 5 6; 7 8 9]
>> a(1, 1) %第一行第一列
ans = 1
>> a(2, 2) %第二行第二列
ans = 5
>> a(1:2, 1:2) %1到2行,1到2列
ans =

1 2
4 5

>> a(:, 1:2) %所有行,1到2列
ans =

1 2
4 5
7 8

矩阵变化

以下示例均使用a = [1 2 3; 4 5 6; 7 8 9]

重新赋值

>> a(1,:) = [7 8 9] %将第一行改为 7 8 9 
a =

7 8 9
4 5 6
7 8 9

添加到新行/列

>> a = [a, [10; 11; 12]] %添加列
a =

7 8 9 10
4 5 6 11
7 8 9 12

>> a = [1 2 3; 4 5 6; 7 8 9];
>> a = [a ;[1 2 3]] %添加行
a =

1 2 3
4 5 6
7 8 9
1 2 3

矩阵向量化

按照列的顺序排布:

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

1
4
7
2
5
8
3
6
9

如果想按行排布,可以使用转置:

>> a'(:)
ans =

1
2
3
4
5
6
7
8
9

矩阵计算

矩阵相加减

>> a+1  
ans =

2 3 4
5 6 7
8 9 10
>> a+a
ans =

2 4 6
8 10 12
14 16 18
>> a-a
ans =

0 0 0
0 0 0
0 0 0

>> a-1
ans =

0 1 2
3 4 5
6 7 8

矩阵相乘除

>> a *a   %叉乘:线性代数中的叉乘
ans =

30 36 42
66 81 96
102 126 150

>> a.*a %点乘:对应位置相乘
ans =

1 4 9
16 25 36
49 64 81
>> a./2 %点除:同上
ans =

0.5000 1.0000 1.5000
2.0000 2.5000 3.0000
3.5000 4.0000 4.5000

矩阵运算

>> a.^2    %幂运算
ans =

1 4 9
16 25 36
49 64 81

>> exp(a) %指数运算:每个数都求以e为底的指数
ans =

2.7183e+00 7.3891e+00 2.0086e+01
5.4598e+01 1.4841e+02 4.0343e+02
1.0966e+03 2.9810e+03 8.1031e+03

>> log(a) %对数运算:以e为底
ans =

0 0.6931 1.0986
1.3863 1.6094 1.7918
1.9459 2.0794 2.1972

>> log2(a) %对数运算:以2为底(以什么为底就log什么)
ans =

0 1.0000 1.5850
2.0000 2.3219 2.5850
2.8074 3.0000 3.1699

>> log10(a) %对数运算:以10为底
ans =

0 0.3010 0.4771
0.6021 0.6990 0.7782
0.8451 0.9031 0.9542

内建函数

  1. length():返回的是长度,有可能是行的个数有,可能是列的个数。这取决于那个时候更大

    >> length(a)
    ans = 3
    >> length(rand(5,7))
    ans = 7
  2. max():对于向量来说会返回其中最大的一个数字,对矩阵来说会返回一个向量,向量的每一列对应原来矩阵每一列的最大值

    >> max([ 7 8 9 ])
    ans = 9
    >> max(a)
    ans =

    7 8 9
    >> max(a, [], 2) %第三个参数表示按行找最大值(若为1则是按列找,默认为1)
    ans =

    3
    6
    9
  3. floor():向下取整
    ceil():向上取整

    >> floor(10.12)
    ans = 10
    >> ceil(10.12)
    ans = 11
  4. sum():按行/列相加

    ︋>> sum(a,1)   %第二个参数为1时,按列加(默认为1)
    ans =

    12 15 18

    >> sum(a,2) %第二个参数为2时,按行加
    ans =

    6
    15
    24
  5. flipud():将矩阵上下颠倒

    >> flipud(a)
    ans =

    7 8 9
    4 5 6
    1 2 3
  6. rank():求矩阵的秩

    >> rank(a)
    ans = 2
  7. rref():将矩阵化为行最简

    >> rref(a)
    ans =

    1.0000 0 -1.0000
    0 1.0000 2.0000
    0 0 0
  8. pinv():求矩阵的逆矩阵

    >> a=[3,4;2,16]
    a =

    3 4
    2 16

    >> pinv(a)*a
    ans =

    1.0000 -0.0000
    0 1.0000

    >> pinv(a)
    ans =

    0.400000 -0.100000
    -0.050000 0.075000
  9. reshape():将向量矩阵化

    >> a = ones(10,1);       %初始化一个10维向量

    >> reshape(a, 5, 2) %第二个参数是矩阵的行数, 第三个是矩阵的列数
    ans =

    1 1
    1 1
    1 1
    1 1
    1 1

画图

>> x = -1:0.1:1;
>> y = x.^2;
>> plot(x, y)

hold on %若要保留上一次的结果就hold on
y2 = -x .^ 2 + 1;
plot(x, y2, 'r');

% 加标签
xlabel("x value");
ylabel("y value");
legend("x^2", "-x^2+1"); % 对应图中的颜色线条注释
title("first plot");
cd Desktop; print -dpng "firstPlot.png" %会保存到桌面上

语法

for循环:

for i=1:10
disp("Hello world");
end;

while循环:

a = 10;
while a > 0
disp("HI");
a -= 1;
end;

if/else:

> if a > 1
> disp("a is bigger than 1");
> else
> disp("a is smaller than 1");
> endif;

>> a is smaller than 1

创建函数:

function val = func(x, y)    %x,y是函数传入的参数,val是返回值
...
end