Octave入门基础
Octave入门基础
一。简单介绍
1.1 Octave是什么?
Octave是一款用于数值计算和画图的开源软件。和Matlab一样,Octave 尤其精于矩阵运算:求解联立方程组、计算矩阵特征值和特征向量等等。
1.2 Octave的适用对象
Octave和Matlab被project人员和科研人员广泛使用来进行各种工业和学术上的数值计算和仿真。
比如,NASA 使用它来开发飞行器的对接系统;Jaguar Racing使用它来可视化和分析从 F1 赛车传来的数 据;Sheffield大学用它来开发用于识别癌细胞的软件。
Octave这种软件让编写数值处理程序变得简单,并提供数据可视化的多种方式。
1.3 Octave的下载与安装
參照网上相关教程;
二,简单计算
2.1 Octave最简单的使用方式就是像使用一个计算器一样在命令提示符下输入对应的计算式。
Octave能识别通常的计算表达式。
比如,在终端输入
octave:##>2+2
并按回车键, 你将得到下面的结果ans=4
各种计算符号的优先级与常规的一致,比方括号有最大优先级,其次为乘方,其次为乘除运算,最后为加减运算
2.2 内建函数
Octave中有非常多内建函数。能够通过输入函数名和括号里的输入參数来调用函数,比如:
octave:##> exp(1)
ans=2.71813
又如还有一个更长的表达式:计算 1.2 sin(40? + ln(2.42)), 输入octave:##>1.2*sin(40*pi/180+log(2.4^2))
ans=0.76618
当中主要的数学函数有:sin, cos, tan, log, exp, abs, floor, ceil等。
假设你要退出Octave,仅仅须要在命令提示符下输入quit或者exit就可以。
三。Octave变量
3.1 变量
同C++。Java等变成语言一样我们能够定义变量,但Octave 为解释性语言。
因此Octave中变量的类型是不用声明的,但Octave中变量名是区分大小的,即变量a和变量A是不同的变量。
octave:##> deg=pi/180
deg=0.017453
假设你须要从当前的变量空间中删除某个变量,clear命令能移出全部的变量,或者移出某个特定变量, 如:
clear name?将移出名为 name 的某个变量。
3.2 加载和保存数据
当你退出Octave的时候,你将丢失你所创建的变量。假设你须要在工作的中途退出Octave,那么你能够保存当前会话的数据并在之后又一次加载它。假设你输入
octave:##> save anyname?
这将整个工作空间上的变量存储到当前文件夹下一个名为anyname.mat 的文件里 (注意.mat是Octave自己主动加入的)。这样你能够退出Octave,之后又一次启动Octave程序,通过输入
octave:##> loadanyname
将又一次加载之前保存的命名空间,并从你中断的地方又一次開始工作。
相同的,你能够加载或者保存特定的变量。格式为
octave:##>save filename var1 var2 ...
比如,假设你想存储deg变量,那么你能够输入
octave:##> save degconv deg?
这样将deg变量存储于名为degconv.mat的文件里,你能够通过下面命令又一次加载变量
octave:##> loaddegconv
Octave 相同能从文件里导入数据,这种功能在你使用其它的数据来源进行绘图或者计算的时候变得很实用。
比如:
X=load(‘featureX.txt’);
3.3 获得帮助
假设你不清楚某个命令或者函数的使用方法,可也用help命令来获得其具体的使用方法。
help commandname
比如:help plot
3.4 分号和隐藏结果
分号在通常的编程语言中被用来表示程序块或者单个语句的结束。在 Octave 中分号没必要的,但它也有一个特殊的功能。我们眼下的样例中,我们仅仅要输入一个 Octave 命令并不以分号结尾的话,Octave 总 会将语句运行的结果随即显示出来。
可是,假设我们在一行语句的末尾添上分号,Octave将不会显出对应的 结果。
四 数组和向量及矩阵
前面介绍过Octave的优势就是能够非常方便的进行矩阵的相关计算。
4.1 构造向量
构造矩阵或者向量的方法有非常多。当中最直接简单的方法就是在一个方括号 [] 中给出其元素,比如
octave:##> a=[1 4 5]
a=1 4 5
octave:##> b=[2,1,0]
b=2 1 0
octave:##> c=[4;7;10]
c=4
7
10
在方括号里由空格或者逗号隔开的一组数据被定义为行向量; 而由分号或者回车隔开的一组数据被定义为列向量。你能够通过已经定义的向量来定义新的向量,比如
octave:##> a=[1 4 5]
a=1 4 5
octave:##> d=[a 6]
d=1 4 5 6
4.2 冒号表达式
利用冒号可以很方便的创建一些特殊的向量
octave:##> e=2:6
e=2 3 4 5 6
冒号表达式的规则是告诉octave创建一个以第一个数字開始并以一递增至第二个数的向量。在第一和第 二个数之间能够插入第三个參数来声明向量中元素之间的递增量,形如 a : b : c。
4.3 向量构造函数
zeros(M,N) 创建一个MXN的全零矩阵
ones(M,N) 创建一个MXN的全一矩阵
linspace(x1,x2,N) 创建一个N个元素的向量。均匀分布于x1和下x2
eye(M) 创建一个MXM的单位矩阵
rand(M,N) 创建一个MXN的矩阵,元素为随机值
4.4 向量中的元素操作
向量中的元素通过括号(),而第一个元素的编号为1, 而不是像C或者 C++那样从0開始。比如
octave:##>a=[1:2:6 -1 0]
a=1 3 5 -1 0
我们能够通过下面命令訪问到该向量的第三个元素
octave:##> a(3)
ans=5
冒号的表示法相同能够用于声明向量中的元素的范围
octave:##>a(3:5)
ans=5 -1 0
octave:##>a(1:2:5)
ans= 1 5 0
4.5 向量的计算
将一组数据存入一个向量之后可以使用非常多的Octave函数来进行计算。
在C++中假设你想进行同样的计算,比如每一个元素乘以2, 你须要使用for循环来对每一个元素操作。
在Octave中尽管也可以使用for循环来实现,可是Octave本身由有简单的向量操作方式。
向量中每一个都乘以一个数能够通过对该向量乘以一个数来实现。
以之前定义的 a 向量为例:
octave:1> a=[1:2:6 -1 0]
a=?1 3 5 -1 0
octave:2> a*2
ans=2 6 10 -2 0
对向量中全部元素都除以一个数的操作与乘法类似。
使用+?算符,你相同能够对该向量中的每一个元素都加上或者减去一个数值。两个向量的相乘遵循矩阵的乘法法则,向量乘法并非相应元素的相乘。假设要进行相应元素的乘除法,你能够使用.* 以及./ 算符注意每一个算符前的‘.’表示为一个元素对元素的计算。比如:
octave:3> b=1:5
b= 1 2 3 4 5
octave:4> a.*b
ans=1 6 15 -4 0
逐个元素的乘方计算相同也非常实用。
该计算的算符为,比如
octave:5> b.^2
ans =1 4 9 16 25
octave:6> 2.^b
ans =2 4 8 16 32
octave:7> a.^b
ans =?1 9 125 1 0
仅仅要两个向量又同样的大小和形状,它们就能够进行元素之间的(element-by-element) 加减乘除和乘方运算。
4.6 函数操作向量
前面讲到过的函数也是能够适用于向量。
比如:exp, log,abs等
octave:##>abs([-1 2 -3])
ans=1 2 3
此外max, length,size, sum, mean, std, floor, ceil等函数或许要掌握,能够通过help命令获得具体使用方法。
4.7 矩阵的转置
一个向量的转置将其由行向量转为列向量或者由列向量转换为行向量。
矩阵的转置将其行和列交换。
在数学上,矩阵A的转置表示为AT 在octave中转置操作用上引號实现:
octave:6> A=[5 7 9;-1 3 -2]
A= 5 7 9
-1 3 - 2
octave:7> A‘
ans =5 -1
7 3
9 -2
此外inv求矩阵的逆,det求矩阵的特征值。trace求矩阵的迹。
五 绘图
Octave通过调用还有一个开源软件 GNUPLOT来实现很丰富的绘图功能。最主要的绘图命令是 plot(x,y), 当中 x,y 分别为横轴和纵轴数据。
能够进行对应地颜色和样式的选择如:’ro’代表们红色圆圈,’b.’代表蓝色点点等;能够通过title,xlabel。ylabel加入标题以及x,y轴名称。legend命令为该图片加入对应的图例。
5.1 假设你想保存当前的图片内容并将新创建的图片层叠到原图片上,你能够通过使用 hold on命令来实现。使用该命令,我们能够实如今同一幅图上呈现由两个plot 命令绘制的线条。
octave:##> x=linspace(-10,10);
octave:##> plot(x,sin(x),’r-’);
octave:##> hold on
octave:##> plot(x,sin(x)./x,’b*’)
octave:##>title(‘Figure’)
octave:##>xlabel(‘X’)
octave:##>ylabel(‘Y’)
octave:##>legend(‘sin(x)’,’sin(x)/x’)
5.2 subplot(2,3,2)表示在一个格子中绘图。因此该条语句的意思是分成一个2X3的格子,并在第2个格子里绘图;当中子格的顺序为从左到右从上到下递增,即
1 2
3 4
5 6
比如:
octave:##> x=linspace(-10,10);
octave:##> subplot(2,1,1)
octave:##> plot(x,sin(x));
octave:##> subplot(2,1,2)
octave:##> plot(x,sin(x)./x)
5.3 多幅图片能够用figure命令来实现.
5.4 绘制曲面
octave:##> x=2:0.2:4;
octave:##>y=1:0.2:3;
octave:##>[X,Y]=meshgrid(x,y);% make the grid
octave:##> Z=(X-3).^2-(Y-2).^2;
octave:##> subplot(2,2,1);surf(Z);title(‘surf‘)
octave:##> subplot(2,2,2);mesh(Z);title(‘mesh‘)
octave:##> subplot(2,2,3);meshz(Z);title(‘meshz‘)
octave:##> subplot(2,2,4);contour(Z);title(‘contour‘)
六 Octave脚本
假设你有一些反复输入的命令的,你能够将这一系列的命令存入一个Octave 脚本之中。这种包括 Octave 命令的文本文件是 Octave 程序的基本形式。当你在 Octave 中运行这种脚本的时候,其效果与将这些命令一行行输入 Octave 中的效果是一样的。
并且当你对一系列要输入 Octave 的命令不是非常拿的准的时候,在一个脚本中改动这些命令会比在 Octave 终端中又一次调出及改动命令要简单方便很多。
Octave的脚本是普通的文本文件,可是他们须要有一个.m 的后缀 (e.g.run.m)。因此,它们通常也被称为M文件。
除去后缀的文件名称部分是你在运行该命令时须要向 Octave 终端输入的部分。
你能够在不论什么的文本编辑器 (如,emacs, vi,notepad) 中创建并编辑一个脚本文件。
在Octave中能够通过下面命令
octave:##> edit
在新窗体中调出文本编辑器emacs。假设你想编辑一个已存在的脚本,你能够在edit命令后加上脚本的名字。比如,比方你有个名为 run.m的脚本,输入edit run 将调出编辑器并打开该文件供你编辑。
然后在 Octave中输入 run运行脚本:
octave:##> run
Octave将执行该脚本中的命令并得到对应的结果。
七 控制语句
到眼下为止我们所示程序或者表达式都是一些简单的顺序运行的操作。
向量和矩阵的使用可以让Octave运行更加高级的计算,可是要实现更加复杂的功能,我们还须要一些标准的程序语言。Octave提供了通常的循环和选择语句。其语法类似于我们熟知的C,C++,Java等编程语言。
在这里只举一个样例:
octave:##> x=1;
octave:##> while 1+x>1
x=x/2;
end
octave:##>x
x=
1.1102e-16
八 Octave函数
Octave中的脚本能实现一些简单的程序,可是比脚本更加强大的是用户自己定义函数。自己定义函数可以让你在命令行、其它函数中和脚本中调用。
在Octave函数中參数是通过值传递的而不是通过reference传递并能返回多个返回值。
Octave函数如同脚本一样,是写入一个纯文本文件里的,不同的是函数文件的第一行遵循例如以下的格式
function[output1,output2,...]=name(input1,input2,...)
每一个函数都卸载了不同的M文件里,并且该M文件名称不须与函数名一致。
比如名为sind()的函数必需被定义在名为sind.m的M文件里。每一个函数接受一定的參数输入并输出一定的数值。
当你须要反复性的运行一定表达式,这表明你须要将这与的操作封装为一个函数。封装为函数之后 Octave 将更加易用,添加了代码的可读性并能够供他人使用。
我们能够创建这么一个函数,创建一个名为 sind.m 的 文本文件并包括下面内容:
function s=sind(x)
% SIND(x)Calculates sine(x) in degrees
s=sin(x*pi/180);
end
然后就能够使用该函数了,比如:
octave:##> sind(0)
ans=0
octave:##> sind(45)
ans= 0.7071
octave:##> t=sind([30 60 90])
t= 0.50000.8660 1.0000