吴恩达的机器学习课程的作业可以使用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
内建函数
length():返回的是长度,有可能是行的个数有,可能是列的个数。这取决于那个时候更大
>> length(a)
ans = 3
>> length(rand(5,7))
ans = 7
max():对于向量来说会返回其中最大的一个数字,对矩阵来说会返回一个向量,向量的每一列对应原来矩阵每一列的最大值
>> max([ 7 8 9 ])
ans = 9
>> max(a)
ans =
7 8 9
>> max(a, [], 2) %第三个参数表示按行找最大值(若为1则是按列找,默认为1)
ans =
3
6
9
floor():向下取整
ceil():向上取整
>> floor(10.12)
ans = 10
>> ceil(10.12)
ans = 11
sum():按行/列相加
︋>> sum(a,1) %第二个参数为1时,按列加(默认为1)
ans =
12 15 18
>> sum(a,2) %第二个参数为2时,按行加
ans =
6
15
24
flipud():将矩阵上下颠倒
>> flipud(a)
ans =
7 8 9
4 5 6
1 2 3
rank():求矩阵的秩
>> rank(a)
ans = 2
rref():将矩阵化为行最简
>> rref(a)
ans =
1.0000 0 -1.0000
0 1.0000 2.0000
0 0 0
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
画图
>> 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
个人博客地址:https://callmelp.github.io/
github原文地址:https://github.com/callmeLP/Octave_Tutorials