1.Octave简介
Octave是一个和MATLAB十分类似的软件,相比MATLAB而言,Octave的优点在于开源免费,体积相对很小。而且两者的语法相差也很小,一个能在其中一个软件上运行的程序稍作修改就能够运行于另一个软件之上。下面记录一些Octave常用的语句和指令。
2.常用语句指令
2.1四则运算
利用Octave进行四则运算比较基础,和常见的科学计算器用法类似。
- 1
- 2
2.2逻辑运算
"1 == 1" % 判断相等
"1 ~= 2" % 注意不等号
"1 && 0" % 求逻辑与
"xor(1, 0)" % 求异或,注意这是另一种语法形式
- 1
- 2
- 3
- 4
2.3变量表示
a = 3
a = 3; % 区别在于分号,不带带分号会紧接着打印出来
disp(a) % 打印变量a
a = 3.141593;
disp(sprintf("2 decimals : %0.2f), a) % 格式控制,类似C风格,打印出来只留两位小数
- 1
- 2
- 3
- 4
- 5
>> format long
>> a = pi
a = 3.14159265358979
>> format short
>> a = pi
a = 3.1416
%精度不同
>>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2.4向量和矩阵
>> A = [1 2; 3 4; 5 6]
A =
1 2
3 4
5 6 %建立矩阵
- 1
- 2
- 3
- 4
- 5
- 6
>> V = [1 2 3]
V =
1 2 3 %建立行向量
>>
>> V = [1; 2; 3] % 建立列向量
V =
1
2
3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
>> V = 1: 0.1: 2 % 比较直观,步长为0.1,建立了一个行向量
V =
Columns 1 through 8:
1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000
Columns 9 through 11:
1.8000 1.9000 2.0000
>> V = 1:6 % 显然是默认步长为1,省略了,和前面一致
V =
1 2 3 4 5 6
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
>> ones(2, 3) % 生成矩阵的其它方法
ans =
1 1 1
1 1 1
>> zeros(2, 3) % 生成零矩阵
ans =
0 0 0
0 0 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
>> rand(2, 3) % 取随机数,定义维度,随机数大小总在0到1之间
ans =
0.57457 0.79732 0.29826
0.61112 0.51547 0.88642
- 1
- 2
- 3
- 4
- 5
>> randn(2, 3) % randn表明随机数来自标准正态分布
ans =
0.897613 0.063959 -0.838812
0.205952 -1.267830 -1.060730
- 1
- 2
- 3
- 4
- 5
>> w = randn(1, 10000);
>> hist(w) % 绘制直方图指令
- 1
- 2
>> eye(4) % 得到单位矩阵
ans =
Diagonal Matrix
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
>> A = [1 2; 3 4; 5 6]
A =
1 2
3 4
5 6
>> size(A) % 得到矩阵维度
ans =
3 2
>>
>> size(A, 1) %获取行数
ans = 3
>> size(A, 2) %获取列数
ans = 2
>>
>> V = [1 2 4 5 6];
>> length(V) % 获取向量的长度
ans = 5
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
>> A = [1 2; 3 4; 5 6;];
>> A(3,2) % 根据索引获取一个元素
ans = 6
>> A(2, :) % 直接获取一行元素,冒号在这里表示某一行或者一列的所有元素
ans =
3 4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
>> A([1 2], :) % 返回第一行和第二行的所有元素
ans =
1 2
3 4
- 1
- 2
- 3
- 4
- 5
>> v = [11; 22; 33];
>> A = [A, v] % 给A附加一列向量
A =
1 2 11
3 4 22
5 6 33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
>> A(:) % 含义很特殊,结果是将A中所有元素都放于一个列向量中
ans =
1
3
5
2
4
6
11
22
33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
>> A = [1 2; 3 4; 5 6;];
>> B = [1 2; 3 4; 5 6;];
>> C = [A B] % “横”着连接
C =
1 2 1 2
3 4 3 4
5 6 5 6
>> C = [A; B] % “竖”着连接
C =
1 2
3 4
5 6
1 2
3 4
5 6
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
2.5加载数据
pwd 指令:得到Octave默认路径;
cd 指令:change direction 即改变路径,自己指定路径,但路径名中不要包含汉字
ls 指令:列出默认路径中包含的所有路径或者文件
load test.dat : 加载文件指令
load(‘test.dat) : 同上
test : test在这里不是指令,是文件名,显示出已经加载的名为test的文件
size(test) : 得到test文件的维度
who/whos : 列出目前Octave工作空间中包含的所有变量
clear test : test是文件名,删除了工作空间的变量test
v = test(1 : 10) : 取test中的前十个赋值给变量v
save hello.dat v : 将变量v保存在hello.dat文件中,注意当再次加载进来时,变量的名称是v非hello
2.6数据计算
>> A = [1 2; 3 4; 5 6;];
>> B = [11 12; 13 14; 15 16];
>> C = [1 2; 3 4];
>> A*C % 常规的矩阵乘法
ans =
7 10
15 22
23 34
>> A.*B % 特殊的矩阵乘法:对应元素相乘
ans = %那么还有.^ 和 ./的道理也是相同的
11 24
39 56
75 96
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
>> v = [1; 2; 3];
>> log(v) % 对列向量每个元素求对数
ans =
0.00000
0.69315
1.09861
>> exp(v) %求指数
ans =
2.7183
7.3891
20.0855
>> abs(v) %求绝对值
ans =
1
2
3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
>> v = v + ones(length(v), 1) % 给列向量每个元素加1的简洁写法
v =
2
3
4
- 1
- 2
- 3
- 4
- 5
- 6
val = max(v) : 返回列向量中最大的值,也可以得到索引
val = max(A) : 返回矩阵中每列的最大元素,因此若A为m*n维且不重复,返回1*n维
>> v = [1 15 2 5];
>> v < 3 % 每个元素进行逻辑判断
ans =
1 0 1 0
>> find(v<3) % 在上面进行逻辑判断的基础上,返回结果为真的索引
ans =
1 3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
>> max(max(A))
ans = 9
>> max(A(:)) % 两种求矩阵中所有元素最大值的方法
ans = 9
- 1
- 2
- 3
- 4
sum(A); 求矩阵A中每一列之和
sum(A,1); 同上
sum(A, 2); 求每一行之和
sum(sum(A)); 这样就得到了矩阵中所有元素之和
sum(sum(eye(3) .* A)); 得到主对角线元素之和
sum(sum(A.*flipud(eye(3)))); 得到副对角线元素之和
pinv(A); A为奇异阵,得到A的逆矩阵,A为非奇异方阵或者不为方阵时,得到A的广义逆
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2.7在Octave中绘制图像
>> y1 = sin(2*pi*4*t);
>>> plot(t,y1); % 绘制图像
- 1
- 2
>> plot(t,y1)
>> hold on; % 注意hold on指令,作用是另两幅图像同时画在同一幅图像中
>> plot(t,y2,'r');
>> xlabel('time'); % 给x轴打上标签
>> ylabel('value'); % 给y轴打上标签
>> legend('sin','cos'); % 加上图例,legend有"图例"的意思
>> title('My Plot'); % 加上标题
>> print -dpng 'myPlot'; % 将图片以png格式保存在默认路径中
>> close % 关闭图像
>> figure(1);plot(t,y1); % 在figure1中绘制
>> figure(2);plot(t,y2); % 在figure2中绘制,不这样做上幅图会关闭,此图绘制在figure1中
>> subplot(N,M,index); plot(t,y2);% 将一幅图像分成NxM份,本次在第index图中绘制
axis([0.5 1 -1 1]); % 设置坐标抽区间
clf % 擦除图像,但不关闭figure
imagesc(magic(15)), colorbar, colormap gray;%以灰度图来绘制矩阵,关键知道这里使用的是“逗号连接符”,一次性输入三条指令执行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
2.8控制语句
for i = 1:10
v = i * 2;
end
% 两种写法,大同小异,分号或者是逗号或者是没有符号,都可以
indices = 1:10;
>> for i=indices,
v(i) = i*i;
end;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
% while循环的写法
i = 1;
>> while i <= 5;
v(i) = 100;
i = i+1;
end;
%break语句的用法
>> i = 1;
>> while true;
v(i) = 999;
i = i+1;
if i == 6;
break;
end;
end;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
% if-else语句用法示例
>> a = 1
a = 1
>> if a == 1,
disp('The value is one');
elseif a == 2,
disp('The value is two');
else
disp('whocare');
end;
The value is one
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
%函数的使用,列举两个实例
function [a,b] = CubeFunc(x)
a = x^3 ; b = x^4; % 有多个返回值
%Cost Function的简单实现
function J = CostFunc(X,y,theta)
m = length(y);
var = y - X * theta;
sqrError = sum(var .^2);
J = 1/(2*m)*sqrError;
%在写函数时尽量体现公式,并不会太麻烦,且不易出错