Octave是一个开源的科学计算以及数值分析的工具,在一定程度上,它与MATLAB语法兼容。
那位要问了:为什么不直接用MATLAB呢?因为MATLAB贵啊!
数值计算
计算数值很简单,只需要输入需要的表达式就可以了:
>> 5 + 5
ans = 10
>> 5 / 2
ans = 2.5000
或者调用一些函数:
>> 2^2
ans = 4
>> sqrt (4)
ans = 2
敲入变量名即可查看变量的值。首先创建两个变量:
>> v = 1 + 3;
>> x = v * 2;
在语句后面加上;
可以不把表达式的值立刻显示出来,我们知道v值为4且x值为8。下面分别查看它们的值:
>> v
v = 4
>> x
x = 8
也可以使用disp
命令:
>> disp (v)
4
>> disp (sprintf ('The value of v is %.2f', v) )
The value of v is 4.00
查看工作区域中所有的变量,可以使用who
或者whos
命令,其中whos
显示的信息更加详细一些:
>> who
Variables in the current scope:
ans v x
>> whos
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
ans 1x1 8 double
v 1x1 8 double
x 1x1 8 double
Total is 3 elements using 24 bytes
删除变量可以使用clear
命令,%
表示注释:
>> clear x % 删除 x
>> clear % 删除所有变量
使用format
修改小数点后位数:
>> format short
>> pi
ans = 3.1416
>> format long
>> pi
ans = 3.14159265358979u
逻辑运算
逻辑运算与C语言很相似:
>> 1 == 2 % 比较是否相等
ans = 0 % 假
>> 1 ~= 2 % 比较是否不相等,这里符号与C语言不太一样
ans = 1 % 真
>> 0 && 1 % 与
ans = 0
>> 0 || 1 % 或
ans = 1
创建向量与矩阵
创建一个向量:
>> v = [1 2 3]
v =
1 2 3
创建一个矩阵:
>> A = [1 2; 3 4; 5 6]
A =
1 2
3 4
5 6
创建特殊的矩阵:
>> B = ones (2, 3) % 创建元素值为1,维度为2 x 3的矩阵
B =
1 1 1
1 1 1
>> zeros (2,3) % 创建元素值为0,维度为2 x 3的矩阵
ans =
0 0 0
0 0 0
>> rand (2,3) % 创建元素值为随机数,维度为2 x 3的矩阵
ans =
0.667607 0.340230 0.020027
0.713828 0.791409 0.713673
可以创建单位阵:
>> eye (3)
ans =
Diagonal Matrix
1 0 0
0 1 0
0 0 1
查看矩阵的维度:
>> A
A =
1 2
3 4
5 6
>> size (A)
ans =
3 2
>> size (A,1)
ans = 3
>> size (A,2)
ans = 2
size()
函数返回矩阵的维度,1维度显示矩阵的行数,2维度显示矩阵的列数。
length()
函数会返回向量的长度,或者矩阵的最大维度:
>> v
v =
1 2 3
>> length (v) % 返回向量的元素数量
ans = 3
>> B
B =
1 1 1
1 1 1
>> length (B) % 由于矩阵B的是2 x 3矩阵,所以返回大值 3
ans = 3
矩阵中数据的操作
查看A矩阵中第2行第2列的数值:
>> A (2,2)
ans = 4
获取矩阵A的某行或者某列:
>> A
A =
1 2
3 4
5 6
>> A (:,2) % 获取A的第2列
ans =
2
4
6
>> A (3,:) % 获取A的第3行
ans =
5 6
>> A ([1,3],:) % 获取A的第1,3行
ans =
1 2
5 6
将A中所有元素组成一个向量:
>> A (:)
ans =
1
3
5
2
4
6
合并矩阵:
>> A
A =
1 2
3 4
5 6
>> C = ones (2,2);
>> A = [A ; C] % 将C合并到A的下方,并且将结果赋值给A
A =
1 2
3 4
5 6
1 1
1 1
>> A = [A, [1; 2; 3; 4; 5]] % 将[1;2;3;4;5]合并到A的右边,将结果赋值给A
A =
1 2 1
3 4 2
5 6 3
1 1 4
1 1 5
求向量中的最大值:
>> v = [5, 4, 3];
>> max (v)
ans = 5
>> [val, ind] = max (v)
val = 5
ind = 1
求矩阵的最大值:
>> A = [ 1 3 5 7 9; 2 4 6 8 10]
A =
1 3 5 7 9
2 4 6 8 10
>> max (A) % 求出A的每一列的最大值
ans =
2 4 6 8 10
>> max (A, [], 1) % 在第1维求A的最大值
ans =
2 4 6 8 10
>> max (A, [], 2) % 在第2维求A的最大值
ans =
9
10
向量中的值与某一个数值的比较:
>> v
v =
5 4 3
>> v > 3 % 将v中的每一个元素同3比较
ans =
1 1 0
>> find (v > 3) % 得到符合条件的元素的下标
ans =
1 2
求向量或者矩阵元素之和:
>> v
v =
5 4 3
>> sum (v) % 求出向量中元素的和
ans = 12
>> A
A =
1 3 5 7 9
2 4 6 8 10
>> sum (A,1) % 求出A中第1维之和
ans =
3 7 11 15 19
>> sum (A,2) % 求出A中第2维之和
ans =
25
30
矩阵计算
求矩阵的转置与逆:
A =
1 2
3 4
>> A' % 求A的转置
ans =
1 3
2 4
>> pinv (A) % 求A的逆矩阵
ans =
-2.00000 1.00000
1.50000 -0.50000
矩阵与数字计算:
>> A
A =
1 2
3 4
>> A + 2 % A中每个元素+2
ans =
3 4
5 6
>> A * 2 % A中每个元素*2
ans =
2 4
6 8
>> A / 2 % A中每个元素/2
ans =
0.50000 1.00000
1.50000 2.00000
矩阵与矩阵计算:
>> A
A =
1 2
3 4
>> B = [5 6; 7 8]
B =
5 6
7 8
>> A + B % 矩阵加法
ans =
6 8
10 12
>> A .* B % A中的元素与B中对应的元素相乘
ans =
5 12
21 32
>> A * B % 矩阵乘法
ans =
19 22
43 50
控制结构
while循环和if条件:
>> v
v =
1 2 3 4 5 6 7 8 9 10
>> while true, % start loop
v(i) = v(i) + 1;
if v(i) > 4, % 如果v中的元素>4,则退出循环
break;
end;
i = i + 1; % 下标自增1
end; % end loop
>> v
v =
2 3 4 5 5 6 7 8 9 10
上面的程序中使用了while
和if
。注意在循环或者判断结构的结尾写明end;
。
for循环:
>> for i = [1 3 5],
v (i) = 0;
end;
>> v
v =
0 3 0 5 0 6 7 8 9 10
switch判断:
>> a = 2
a = 2
>> switch (a),
case 1,
disp ('The value is 1.');
case 2,
disp ('The value is 2.');
case 3,
disp ('The value is 3.');
otherwise,
disp ('Wo...');
end;
The value is 2.
在switch
中并不需要写break
来划分情况。
函数
新建一个名为addOne.m
的文件,写入:
function y = addOne (x)
y = x + 1
这表示一个函数,这个函数的参数为x
,返回值为y
,函数的内容是y = x + 1
。
调用它:
>> addOne(1.2)
y = 2.2000
ans = 2.2000
画图
使用plot()
函数画图:
>> x = 0:0.1:2*pi; % 为x赋值
>> y_sin = sin (x); % 为y赋值
>> plot (x, y_sin); % 绘制x与y的图像
>> xlabel ('x'); % x轴的标签设置为"x"
>> ylabel ('sin(x)'); % y轴的标签设置为"sin(x)"
>> title ('y = sin (x), 0 < x < 2pi'); % 设置图片标题
>> print -dpng 'octave_plot_sin.png' % 保存为png图片,并设置文件名
>> close % 关闭图片
图像如下:
可以使用hold on
命令在一幅图中绘制多条曲线:
>> x = 0:0.1:2*pi;
>> y_sin = sin (x);
>> y_cos = cos (x);
>> plot (x, y_sin);
>> hold on; % 接下来还在此图中绘制
>> plot (x, y_cos, 'r'); % 红色线条绘制y_cos
>> xlabel ('x');
>> ylabel ('y');
>> legend ('y=sin(x)','y=cos(x)'); % 设置图例
>> print -dpng "octave_plot_sin_cos.png";
>> close
图像如下:
使用subplot
对图像进行分格:
>> x = 0:0.1:2*pi;
>> y_sin = sin (x);
>> y_cos = cos (x);
>> y = 0.5 * x;
>> subplot (1,2,1); % 将图像分为1行2列,使用第1个格
>> plot (x, y, 'b');
>> xlabel ('x'); ylabel ('y=x/2');
>> subplot (2,2,2); % 将图像分为2行2列,使用第2个格
>> plot (x, y_sin, 'r');
>> xlabel ('x'); ylabel ('y=sin(x)');
>> subplot (2,2,4); % 将图像分为2行2列,使用第4个格
>> plot (x, y_cos, 'g');
>> xlabel ('x'); ylabel ('y=cos(x)');
>> print -dpng "octave_subplot_3.png";
>> close
图像如下:
文件操作
导入一个文件非常简单:
>> load ('featureX.dat') % 导入featureX.dat文件
保存一个文件也很简单:
>> save I.mat I; % 保存I到I.mat 会对数据进行压缩
>> save hello.txt I --ascii; % 保存为可读文本文档
获取帮助
查看函数eye()
的帮助文档:
>> help eye