首页 > 代码库 > Octave入门基础

Octave入门基础

Octave入门基础

一,简介

1.1 Octave是什么?

Octave是一款用于数值计算和绘图的开源软件。和Matlab一样,Octave 尤其精于矩阵运算:求解联立方程组、计算矩阵特征值和特征向量等等。

1.2 Octave的适用对象

Octave和Matlab被工程人员和科研人员广泛使用来进行各种工业和学术上的数值计算和仿真。例如,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

 


Octave入门基础