第五章 Octave教程
第一节 基本操作
本节主要讲述了octave的基本操作方法,这里将用代码注释的方法进行记录。
octave的界面和语言都与matlab相似,其界面如下图所示。
在命令窗口可以直接输入命令,并获得结果。
下面是一些基本运算和逻辑运算命令
>> 5+6
ans = 11
>> 3-2
ans = 1
>> 5*8
ans = 40
>> 1/2
ans = 0.500000000000000
>> 2^6
ans = 64
>> 1 == 2
ans = 0
>> 1 ~=2
ans = 1
>> 1 && 0
ans = 0
>> 1||0
ans = 1
>> xor(1,0)
ans = 1
>> b = 'hi'
b = hi
>> c = (3>=1);
>> c
c = 1
>> a=pi;
>> a
a = 3.141592653589793
>> disp(a)
3.141592653589793
>> format long
>> a
a = 3.141592653589793
接着是构建矩阵的命令
>> A=[1 2;3 4;5 6]
A =
1 2
3 4
5 6
>> A=[1 2;
3 4;
5 6]
A =
1 2
3 4
5 6
>> V=[1 2 3]
V =
1 2 3
>> V = [1;2;3] %分号表示换行
V =
1
2
3
>> V =1:0.1:2 %按0.1的步进值从1到2,构成一个1*11的矩阵
V =
Columns 1 through 5:
1.000000000000000 1.100000000000000 1.200000000000000 1.300000000000000 1.400000000000000
Columns 6 through 10:
1.500000000000000 1.600000000000000 1.700000000000000 1.800000000000000 1.900000000000000
Column 11:
2.000000000000000
>> V=1:6
V =
1 2 3 4 5 6
>> ones(2,3) %构建一个2行3列元素全部为1的矩阵
ans =
1 1 1
1 1 1
>> 2*ones(2,3)
ans =
2 2 2
2 2 2
>> w=zeros(1,3)
w =
0 0 0
>> w=rand(1,3) %构建一个随机矩阵,元素值都属于(0,1)
w =
0.629182528699651 0.234908433675450 0.832400319321844
>> rand(3,3)
ans =
2.324011709020529e-01 7.930071341110331e-01 2.186022910072198e-01
2.490873393654987e-01 5.915629445652747e-01 3.664270909746951e-01
9.010128556408735e-01 9.998934689263728e-02 6.703283820881172e-01
>> randn(1,3) %元素按照高斯分布且标准差为1,构建一个矩阵
ans =
-4.968970798942585e-02 7.520563907008045e-02 1.697239783577829e+00
>> I=eye(4) %构建单位矩阵
I =
Diagonal Matrix
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> w =-6+sqrt(10)*(randn(1,10000));
接着介绍了绘图函数
>> w =-6+sqrt(10)*(randn(1,10000));
>> hist(w)
得到下图:
如果需要增加图像列数,可以执行以下命令:
>> hist(w,50) %图像为50列
第二节 移动数据
这一节主要介绍如何将数据加载到octave和如何将数据存入矩阵,以及对矩阵中数据的操作。
首先介绍一下如何加载数据到octave和保存数据,具体代码如下:
>> pwd %octave location
ans = C:\Users\ZY
>> cd 'C:\Users\ZY\Desktop' %change directory
>> load fx.dat %将文件的数据导入,导入的数据会存放在名称为fx的矩阵中
>> load ('fx.dat') %按照字符串形式导入
>> save hello.mat A %将矩阵A的数据存入文件hello.mat
>> save hello.txt A -ascii %将矩阵A的数据存入文本文档hello.txt中,
接着介绍一下如何查看现有的变量
>> who %查看现有变量名称
Variables visible from the current scope:
A I V a ans b c w
>> whos %查看现有变量的具体信息
Variables visible from the current scope:
variables in scope: top scope
Attr Name Size Bytes Class
==== ==== ==== ===== =====
A 3x2 48 double
I 4x4 32 double
V 1x6 24 double
a 1x1 8 double
ans 1x11 11 char
b 1x2 2 char
c 1x1 1 logical
w 1x10000 80000 double
Total is 10043 elements using 80126 bytes
>> clear w %清除变量w
>> whos
Variables visible from the current scope:
variables in scope: top scope
Attr Name Size Bytes Class
==== ==== ==== ===== =====
A 3x2 48 double
I 4x4 32 double
V 1x6 24 double
a 1x1 8 double
ans 1x11 11 char
b 1x2 2 char
c 1x1 1 logical
Total is 43 elements using 126 bytes
最后是对矩阵操作的一些代码:
>> A
A =
1 2
3 4
5 6
>> size(A) %查看矩阵大小
ans =
3 2
>> size(A,1) %矩阵行数
ans = 3
>> size(A,2) %矩阵列数
ans = 2
>> V
V =
1 2 3 4 5 6
>> length(V) %向量长度
ans = 6
>> A
A =
1 2
3 4
5 6
>> A(3,2) %显示第三行第二列的元素
ans = 6
>> A(2,:) %显示第二行
ans =
3 4
>> A(:,2) %显示第二列
ans =
2
4
6
>> A(:,2)=[10;11;12] %修改第二列
A =
1 10
3 11
5 12
>> A=[A,[10;11;12]] %append another column vector to right
A =
1 10 10
3 11 11
5 12 12
>> A(:) % put all elements of A into a single vector
ans =
1
3
5
10
11
12
10
11
12
>> B=[1;2;3]
B =
1
2
3
>> C=[A B] %按列合并两个矩阵
C =
1 10 10 1
3 11 11 2
5 12 12 3
>> B=[1 2 3]
B =
1 2 3
>> C=[A;B] %按行合并两个矩阵
C =
1 10 10
3 11 11
5 12 12
1 2 3
第三节 计算数据
本节介绍数据的操作运算,来实现算法。
>> A=[1 2;3 4;5 6]
A =
1 2
3 4
5 6
>> B=[11 12;13 14;15 16]
B =
11 12
13 14
15 16
>> C=[1 1;2 2]
C =
1 1
2 2
>> A*C %矩阵相乘
ans =
5 5
11 11
17 17
>> A.*B %点乘,即每个对应元素相乘
ans =
11 24
39 56
75 96
>> A.^2
ans =
1 4
9 16
25 36
>> V =[1;2;3]
V =
1
2
3
>> 1./V %1除以每个元素
ans =
1.000000000000000
0.500000000000000
0.333333333333333
>> log(V) %做对数运算
ans =
0
0.693147180559945
1.098612288668110
>> exp(V) %做指数运算
ans =
2.718281828459045e+00
7.389056098930650e+00
2.008553692318767e+01
>> abs([-1]) %取绝对值
ans = 1
>> V+ones(length(V),1) %每行加1
ans =
2
3
4
>> V+1
ans =
2
3
4
>> A' %transpose
ans =
1 3 5
2 4 6
>> max(A) 求最大的一行
ans =
5 6
>> a=[1 2 3]
a =
1 2 3
>> [val,ind]=max(a)
val = 3 %最大值
ind = 3 %最大值的位置
>> a<3
ans =
0 1 0
>> find( a<3) %对每个元素进行比较
ans = 2
>> magic(3)
ans =
8 1 6
3 5 7
4 9 2
>> magic(3) %magic function
ans =
8 1 6
3 5 7
4 9 2
>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2
>> [r,c]=find(A>=7) %找大于7的元素
r =
1
3
2
c =
1
2
3
>> sum(a) %add
ans = 9
>> prod(a) %multiply
ans = 24
>> ceil(a) %设置为整型
ans =
4 2 3
>> max(A,[],1) %按列求和
ans =
8 9 7
>> max(A,[],2) %按行求和
ans =
8
7
9
>> max(A(:)) %对所有元素求和
ans = 9
>> 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
>> pinv(magic(3)) %求伪逆矩阵
ans =
1.472222222222226e-01 -1.444444444444453e-01 6.388888888888940e-02
-6.111111111111209e-02 2.222222222222424e-02 1.055555555555544e-01
-1.944444444444396e-02 1.888888888888878e-01 -1.027777777777772e-01
>> magic(3)*pinv(magic(3)) %伪逆矩阵乘原来的矩阵可以得到一个近似的单位矩阵
ans =
1.000000000000005e+00 -1.143529715363911e-14 6.272760089132134e-15
-2.740863092043355e-16 1.000000000000000e+00 -1.942890293094024e-16
-6.203371150093062e-15 1.254552017826427e-14 9.999999999999929e-01
第四节 数据绘制
简单的图可以检测算法是否正常,本节主要讲述画图的方法。
>> t=[0:0.01:0.98];
>> y1=sin(2*pi*4*t);
>> plot(t,y1); %画图1
>> y2=cos(2*pi*4*t);
>> plot(t,y2); %画图2
图一
图二
>> hold on; %固定画面
>> plot(t,y2,'r');%用红色线画y2
>> xlabel('time')
>> ylabel('value')
>> legend('sin','cos')
>> title('my plot') %设置图表格式
可以得到下图
>> print -dpng 'one.png'
>> figure(1);plot(t,y1);
>> figure(2);plot(t,y2);
>> subplot(1,2,1);% divides plot a 1*2 grid,access first element
>> plot(t,y1);
>> subplot(1,2,2);
>> plot(t,y2);
>> axis([0.5 1 -1 1]) %设置x轴显示范围
>> clf; %清屏
可以获得下图:
接着是根据矩阵绘制图像
>> 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)
也可以变成灰度显示
>> imagesc(A),colorbar,colormap gray;
用灰度显示数值大小。
>> A=magic(15);
>> imagesc(A),colorbar,colormap gray;