Octave入门,Octave

correct 0
入门 莫及∗2011年1月 目录 1简介
4 1.1Octave是什么?
.............................................4 1.2Octave不是什么?...........................................4 1.3Octave的适用对象...........................................4 1.4与常见的高级语言(如C++)的区别.................................4 2简单计算
4 2.1启动Octave...............................................4 2.2Octave简单计算............................................5 2.3内建函数................................................5 3Octave环境
7 3.1变量...................................................7 3.2数值及其格式..............................................8 3.3数值的表示和精度...........................................8 3.4载入和保存数据.............................................9 3.5重复之前命令..............................................9 3.6获得帮助................................................10 3.7取消一个命令..............................................10 3.8分号和隐藏结果.............................................11 4数组和向量 11 4.1构造向量................................................11 4.2冒号表达式...............................................11 4.3大矩阵或矩阵的显示..........................................12 4.4向量构造函数..............................................12 4.5向量中的元素操作...........................................13 4.6向量的计算...............................................13 ∗liuqiang@
1 目录
2 5画图 15 5.1改进该图形...............................................15 5.2Multiplegraphs.............................................16 5.3Multiplefigures.............................................16 5.4保存和打印图片.............................................18 6Octave编程I:脚本文件 18 6.1Path问题................................................18 6.2创建和编辑脚本.............................................19 6.3记住之前脚本..............................................19 7控制语句 20 7.1if...else语句..............................................20 7.2switch语句...............................................22 7.3for语句.................................................22 7.4while语句...............................................23 8Octave编程II:函数 23 8.1实例1:角度制正弦函数........................................23 8.2创建并使用函数.............................................24 8.3实例2:单位阶跃函数.........................................25 9矩阵和向量 26 9.1矩阵乘法................................................27 9.2转置算符................................................29 9.3矩阵创建函数..............................................29 9.4创建复合矩阵..............................................30 9.5提取矩阵元...............................................31 10基本矩阵函数 31 11解决Ax=b类问题 33 12画图进阶 33 12.1子图...................................................33 12.23D画图.................................................33 12.3调整视角................................................33 12.4绘制曲面................................................35 13本征向量和奇异值分解 35 14复数 35 14.1绘制复数................................................36 14.2多项式求根...............................................36 目录
3 15Octave可执行程序 37 A更多参考资料 40 B声明 40 1简介
4 1简介 1.1Octave是什么?
Octave是一款用于数值计算和绘图的开源软件。
和Matlab一样,Octave尤其精于矩阵运算:求解联立方程组、计算矩阵特征值和特征向量等等。
在许多的工程实际问题中,数据都可以用矩阵或向量表示出来而问题转化为对这类矩阵的求解。
另外,Octave能够通过多种形式将数据可视化,并且Octave本身也是一门编程语言而易于扩展。
因此我们可以称Octave是一款非常强大的可编程可视化计算程序。
Octave让解决很大范围内的数值问题变得简单,给使用者更多的时间来进行实验和考虑问题。
Octave最初被开发时只是一款用于本科生化学课程的辅助程序。
当前Octave项目的开发由
J.W.Eation博士领导并遵循GNUGeneralPublicLicence发布。
Octave与科研和工程中普遍使用的Matlab基本兼容,因此其易用性也越来越好。
1.2Octave不是什么? Octave是用于数值地解决数学问题的,即在计算机内存内处理相应的数值。
因此Octave和Mathematica、Maple这类通过数学推导给出问题符号解的程序不同,它不能给出问题的精确解。
这无所谓好或者坏——不同软件处理不同的问题罢了。
而且,很多实际的数学问题(尤其是工程问题)都没有解析解。
1.3Octave的适用对象 Octave和Maltab被工程人员和科研人员广泛使用来进行各种工业和学术上的数值计算和仿真。
例如,NASA使用它来开发飞行器的对接系统;JaguarRacing使用它来可视化和分析从F1赛车传来的数据;Sheffield大学用它来开发用于识别癌细胞的软件。
Octave这样的软件让编写数值处理程序变得简单,并提供数据可视化的多种方式。
1.4与常见的高级语言(如C++)的区别 C++以及其他的常用的编程语言更多得用来编写具有特定功能的软件。
然而,使用C++来处理数值方面的问题过于复杂费时,而且这样的编程语言不原生的支持一些数学概念或者生成图形。
Octave是专为解决这类问题而设计的。
即使人们最终使用C++这样的语言来编写软件,他们很多时候都用Octave来编写软件的原型或者数学部分,因为这样能够很快的检验其算法。
2简单计算 2.1启动Octave Octave在UNIX环境下通过在终端中输入octave来启动,在启动octave之后,程序一般会显现如下这样的信息: GNUOctave,version3.2.4Copyright(C)2009JohnW.Eatonandothers.Thisisfreesoftware;seethesourcecodeforcopyingconditions.ThereisABSOLUTELYNOWARRANTY;notevenforMERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Fordetails,type`warranty'. 2简单计算
5 Octavewasconfiguredfor"i486-pc-linux-gnu". AdditionalinformationaboutOctaveisavailableat. Pleasecontributeifyoufindthissoftwareuseful.Formoreinformation,visit Reportbugsto(butfirst,pleasereadtolearnhowtowriteahelpfulreport). Forinformationaboutchangesfrompreviousversions,type`news'.Octave:1>这表明你已经进入了Octave环境,其中Octave:>1为Octave命令提示符。
如果你要退出Octave,只需要在命令提示符下输入quit或者exit即可。
2.2Octave简单计算 Octave最简单的使用方式就是像使用一个计算器一样在命令提示符下输入相应的计算式。
Octave能识别通常的计算表达式。
例如,在终端输入octave:##>2+2并按回车键,你将得到以下的结果 ans=4各种计算符号的优先级与常规的一致,比如括号有最大优先级,其次为乘方,其次为乘除运算,最后为加减运算。
2.3内建函数 除了一些基本的计算符,Octave还提供了一系列的常用数学函数,其中的一部分函数如表1所示。
像C++中调用函数一样,Octave通过输入函数名和括号中的输入参数来调用函数,例如: octave:##>exp(1)ans=2.71813 又如另一个更长的表达式:计算1.2sin(40◦+ln(2.42)),输入octave:##>1.2*sin(40*pi/180+log(2.4^2))ans=0.76618 在刚才的例子中,有以下的注意事项:
1.在计算表达式中一个明确的乘号是必不可少的,比如在1.2和sin之间必须要的乘号。
2简单计算
6 cossintanexploglog10sinhtanhcoshacosacoshasinasinhatanatan2atanhabssignroundfloorceilfixrem 表1:基本数学函数余弦函数(弧度制)正弦函数(弧度制)正切函数(弧度制)指数函数(ex)以e为底的指数函数以10为底的指数函数双曲正弦函数双曲正切函数双曲余弦函数反余弦函数反双曲余弦函数反正弦函数反双曲正弦函数反正切函数双参数形式的反正切函数1反双曲正切函数绝对值函数(复数取模)符号函数四舍五入近似为比它小的最大整数近似为比它大的最小整数向0方向近似求余数 3OCTAVE环境
7 2.三角函数是使用的弧度制。
角度制的可以通过乘以引子π/180转换为弧度制。
pi是Octave中变量的一个例子,这将在下一节中详细介绍。

3.自然对数是用‘log’而不是‘ln’来表示的。
通过使用这些函数,Octave能完成你用普通计算器来完成的所有计算。
3Octave环境 从之前的几个例子可以看出,Octave有一个命令行界面——每个命令依次输入命令行中,并以回车结束。
Octave为解释性语言,即每个命令通过命令解析器转化为机器语言。
而在编译型语言,如C++中,整个程序通过文本编辑器输入并通过编译器将整个代码转化为机器语言。
这样的编译型语言比解析型语言运行速度快很多。
然而由于Octave这样的语言能很快的将代码实现,这样弥补了其运行速度方面的缺陷。
3.1变量 在实际的计算中,你都需要存储并再利用一些数值,正如计算器中的存储器一样。
Octave允许你定义并使用变量。
例如,在之前的角度问题中,我们可以定义一个名为deg的变量来保存角度与弧度换算的因子: octave:##>deg=pi/180deg=0.017453 注意和很多的高级语言(如C++)不同,Octave中变量的类型是不用声明的。
Octave所有的变量都是浮点型或者字符串。
运用这个变量,之前的表达式可以重写为: octave:##>1.2*sin(40*deg+log(2.4^2))ans=0.76618 这能使表达式更容易输入和易懂,避免因为粗心大意引起的一些低级错误等。
在写程序的时候,请尽量将你的一些常用数字和结果用变量表示。
你已经见到过的另一个Octave变量便是ans变量。
这个变量存储你每次最近运算的结果。
这个变量同样可以像普通变量一样供我们使用。
例如: octave:##>new=3*ansnew=2.2985 注意new的数值也不是单单计算3×0.76618得到的结果。
这是因为Octave的结果只以一定的精度展示出来,而实际上它存储的变量的精度要比其显示的高很多,因此实际的结果要比2.2985精确很多。
在所有的数值计算中,数值的有效位数是很重要的因素。
因此使用变量名而不是每次输入结果能够尽量的避免数值的截断误差。
在定义和使用变量时,Octave中变量名是区分大小的,即变量a和变量A是不同的变量。
而且Octave本身已经定义了一些变量,如pi,i和j(i=j=√−1(见第十四节))等。
Octave不会阻止你重新定义这些内置变量,但是这样的操作会让你的程序变得含糊。
同样的,类似于sin和cos这样的变量也是允许的,但不提倡。
如果你需要查看某个变量的数值,输入其变量名并回车即可。
如果你想查看当前名命名或者使用的函数名和变量名,输入 3OCTAVE环境
8 octave:##>who***dynamicallylinkedfunctions:dispatch***piledfunctions:rem***localuservariables:degnew 如果你需要从当前的变量空间中删除某个变量,clear命令能移出所有的变量,或者移出某个特定变量,如: clearname 将移出名为name的某个变量。
3.2数值及其格式 我们发现Octave通常只显示一定的有效数字。
format命令能让你选择数值显示的不同方式。
输入 octave:##>formatlong将让octave以15位的有效数字显示数值,这也是octave程序本身的计算精度。
输入helpformat你将得到本命令的所有选项的列表。
通过使用formatlong命令,我们将看到更加精确的deg数值: octave:##>degdeg=0.3 octave:##>formatshort其中第二行将让octave以默认的方式显示数值。
Octave使用科学记数法来表达数值很大或者很小的数字,例如13142.6=1.31426×104,而在Octave中这个科学数值被显示为1.3143e+04,这样的数值输入形式也同样能被Octave认可。
同样被Octave识别并计算的数据形式还有: 复数(e.g.3+4i),能完全被Octave识别,具体的内容将在第十四节中讲述。
无穷大(Inf)一个数除以0得到的结果。
非数值(NaN)0除以0得到的结果。
同样是其他数学表达式无法得到合法结果时的返回值。
Inf和NaN可以向其他类型的数据一样参与运算,当然得到的结果通常还是Inf或者NaN。
3.3数值的表示和精度 Octave中的数值,通计算机中存储的数值一样,是用二进制的形式而不是十进制的形式存储的。
在十进制的数值表达中,12.25的意义是 12.25=1×101+2×100+2×10−1+5×10−
2
(1) 但是在二进制的表达中,这将被写为 1101.01=1×23+1×22+0×21+1×20+0×2−1+1×2−2=12.25
(2) 3OCTAVE环境
9 二进制形式的数值适合电脑存储是因为这样的数据只是一系列的0或者
1,对应于电路中的开和关的状态。
用二进制表示数据的一个问题是在电脑中每个数值只能以有限的位数(bit)来表示,即其位数为有限值。
考虑如下的例子: octave:##>1-0.2-0.2-0.2-0.2-0.2ans=5.5511e-17 得到了一个非常小的结果,但是不是零这个精确的解。
造成这样的问题的原因在于在计算机中0.2无法使用有限的位数的二进制精确表示出来(0.2=0.0011001100...)。
这样的情况与在十进制中1/3无法精确写出的原因是一致的。
在Octave(和其他计算机程序中),这样的数值以最能接近精确值的方式存储和运用起来。
但是,如同在这里看到的这般,这样的近似是容易引起问题的。
基于这样的原因,在考虑两个数值是否相等的时候,不要忘了其精度和容许误差。
3.4载入和保存数据 当你退出Octave的时候,你将丢失你所创建的变量。
如果你需要在工作的中途退出Octave,那么你可以保存当前会话的数据并在之后重新载入它。
如果你输入 octave:##>saveanyname这将整个工作空间上的变量存储到当前目录下一个名为anyname.mat的文件中(注意.mat是octave自动添加的)。
这样你可以退出Octave,之后重新启动Octave程序,通过输入 octave:##>loadanyname将重新载入之前保存的命名空间,并从你中断的地方重新开始工作。
同样的,你可以载入或者保存特定的变量。
格式为 octave:##>savefilenamevar1var2...例如,如果你想存储deg变量,那么你可以输入 octave:##>savedegconvdeg这样将deg变量存储于名为degconv.mat的文件中,你可以通过以下命令重新载入变量 octave:##>loaddegconvOctave同样能从文件中导入数据,这样的功能在你使用其他的数据来源进行画图或者计算的时候变得非常有用。
3.5重复之前命令 Octave会记录你在一个会话中输入过的命令,而你可以通过方向键中的↓和↑来查看之前输入的命令(最近的命令排列在最前)。
如果你想重复其中的一个命令,你只需要用方向键找到该命令并按回车。
一旦一个已执行命令被重新调出来,你可以在再次执行它之前编辑它。
你可以用←和→移动光标并进行相应的编辑操作。
当你输入一个长的Octave命令并出错的时候,这样的功能便会很有帮助。
3OCTAVE环境 10 3.6获得帮助 如果你不了解某个Octave命令的功能或者是你需要找一个特定的函数,Octave本身强大的帮助系统会很有用。
最基本的使用帮助系统的方式就是 mandname例如: octave:1>helpsqrt`sqrt'isabuilt-infunction --MappingFunction:sqrt(X)ComputethesquarerootofeachelementofX.IfXisnegative,plexresultisreturned.putethematrixsquareroot,see*noteLinearAlgebra::. Seealso:realsqrt Additionalhelpforbuilt-infunctionsandoperatorsisavailableintheon-lineversionofthemanual.Usemand`docic>'tosearchthemanualindex. HelpandinformationaboutOctaveisalsoavailableontheWWWatandviathehelp@mailinglist. 如果你不知道你需要的某个函数的具体名称,有几个方法可以帮助你找到这样的函数是否存在。
通过命令行输入help-i,Octave将给出一个其帮助的主题列表。
关于某个帮助主题的细节可以通过将光标移动到该主题并回车获得。
你可以通过Up,Next,Previous等快捷键浏览相应的主题。
或者在命令提示符下直接输入话题的名称如arithmetic方面的帮助可以输入 octave:##>help-iarithmetic来获得。
输入‘q’来退出帮助系统并返回到octave命令行。
3.7取消一个命令 如果你发现输入的一个命令执行了很长的时间(或者你程序本身的bug让程序无限重复等),中止该程序的执行就变得又必要。
你可以在当前命令行下输入 Ctrl-C程序将被中止并返回到命令提示界面。
4数组和向量 11 3.8分号和隐藏结果 分号在通常的编程语言中被用来表示程序块或者单个语句的结束。
在Octave中分号不是必需的,但它也有一个特殊的功能。
我们目前的例子中,我们只要输入一个Octave命令并不以分号结尾的话,Octave总会将语句执行的结果随即显示出来。
但是,如果我们在一行语句的末尾添上分号,Octave将不会显出相应的结果。
4数组和向量 在很多的数学问题中涉及到一组数据。
在编程语言中这样的数据通常被称为数组(array)。
在Octave中这样的概念被称为向量(vector),而向量本身也是矩阵类数据的一个特例——只有一行或者一列的矩阵分别为行向量(···)或者列向量(...)。
4.1构造向量 构造矩阵或者向量的方法有很多。
其中最直接简单的方法就是在一个方括号[]中给出其元素,例如 octave:##>a=[145]a=145 octave:##>b=[2,1,0]b=210 octave:##>c=[4;7;10]c=4710 在方括号中由空格或者逗号隔开的一组数据被定义为行向量;而由分号或者回车隔开的一组数据被定义为列向量。
你可以通过已经定义的向量来定义新的向量,例如 octave:##>a=[145]a=145 octave:##>d=[a6]d=1456 4.2冒号表达式 利用冒号能够非常方便的创建一些特殊的向量 4数组和向量 12 octave:##>e=2:6e=23456 冒号表达式的规则是告诉octave创建一个以第一个数字开始并以一递增至第二个数的向量。
在第一和第二个数之间可以插入第三个参数来声明向量中元素之间的递增量,形如a:b:c。
octave:##>e=2:0.3:4e=2.00002.30002.60002.90003.20003.50003.8000 如这个例子所示,如果向量中的增量不是恰好达到尾数,octave将产生不超过尾数的一组向量。
增量可以是负数并相应产生有一个递减的向量。
4.3大矩阵或矩阵的显示 如果Octave无法用单屏显示一个向量或者矩阵,它将分屏显示这个量比如octave:##>v=1:1000按空格键来显示下一屏的内容而按’q’退出显示并返回到Octave命令提示符。
你同样可以按‘b’键向上翻页并查看已显示的内容。
如果你想关闭Octave的这个显示功能,输入octave:##>moreoff命令即可。
这个功能通过以下命令可以重新打开 octave:##>moreon 4.4向量构造函数 Octave提供更多的创建向量的函数,如表2所示。
zeros(
M,N)ones(
M,N)linspace(x1,x2,N) logspace(x1,x2,N) 表2:基本数学函数创建一个M×N的零矩阵创建一个M×N的全译矩阵创建一个N个元素的向量,均匀分布于x1和x2创建一个N个元素的向量,指数分布与10x1和10x2之间 其中zeros和ones适用于向量和矩阵,而这两个函数的参数,M和
N,分别指定矩阵的行数和列数。
有关矩阵的内容将在第九节中讲解。
4数组和向量 13 4.5向量中的元素操作 向量中的元素通过括号(),而第一个元素的编号为
1,而不是像C或者C++那样从0开始。
例如 octave:##>a=[1:2:6-10]a=135-10 我们可以通过以下命令访问到该向量的第三个元素 octave:##>a(3)ans=
5 冒号的表示法同样可以用于声明向量中的元素的范围 octave:##>a(3:5)ans=5-10 octave:##>a(1:2:5)ans=150 4.6向量的计算 将一组数据存入一个向量之后能够使用很多的Octave函数来进行计算。
在C++中如果你想进行相同的计算,例如每个元素乘以
2,你需要使用for循环来对每个元素操作。
在Octave中虽然也可以使用for循环来实现,但是Octave本身由有简单的向量操作方式。
向量中每个都乘以一个数可以通过对该向量乘以一个数来实现。
以之前定义的a向量为例: octave:1>a=[1:2:6-10]a= 135-10 octave:2>a*2ans= 2610-20 对向量中所有元素都除以一个数的操作与乘法类似。
使用+−算符,你同样可以对该向量中的每个元素都加 上或者减去一个数值。
两个向量的相乘遵循矩阵的乘法法则,向量乘法并不是对应元素的相乘。
如果要进行对应元素的乘除法, 你可以使用*/算符,例如  a1 b1 a1b1 a2.∗b2=a2b2
(3) a3 b3 a3b3 5画图 14 注意每个算符前的‘.’表示为一个元素对元素的计算。
例如: octave:3>b=1:5b= 12345 octave:4>a.*bans= 1615-40 逐个元素的乘方计算同样也很有用。
该计算的算符为,例如 octave:5>b.^2ans= 1491625 octave:6>
2.^bans= 2481632octave:7>a.^bans=
1 9125
1 0 只要两个向量又相同的大小和形状,它们就可以进行元素之间的(element-by-element)加减乘除和乘方运算。
大多数的Octave函数能以向量为输入。
例如,创建一个以60度为间隔的角度值,并作为sin函数的输入: octave:8>angles=[0:pi/3:2*pi]angles= 0.000001.047202.094403.141594.188795.235996.28319 octave:9>y=sin(angles)y= 0.000000.866030.866030.00000-0.86603-0.86603-0.00000 5画图 15
1 0.5
0 -0.5 -
1 0
1 2
3 4
5 6
7 图1:y=sin(x)图形,60度间隔 5画图 Octave通过调用另一个开源软件GNUPLOT2来实现非常丰富的画图功能
3。
最基本的画图命令是plot(x,y),其中x,y分别为横轴和纵轴数据。
上一节生成的正弦函数的图形可以通过以下命令获得 octave:10>plot(angles,y)程序会打开一个新的窗口显示该图片,如图1所示。
Octave会根据图形属性中自动选择坐标范围。
该图形过于粗糙,使用更精细的y值能获得更加精确的图片。
octave:1>angles=linspace(0,2*pi,100);octave:2>y=sin(angles);octave:3>plot(angles,y);其中linspace命令创建了0到2π之间的100个数值。
5.1改进该图形 在Octave中你可以在plot命令中加入更多的选项拉指定图形线条的样式。
例如,使用红色和圆圈来画出之前的图片,输入 octave:4>plot(angles,y,'ro');其中最后一个参数是指定线条样式的字符串。
表3列出所有可能的选项(同样可以使用helpplot获得)。
通过title,xlabel和ylabel命名为该图片添加标题和xy轴名称: octave:7>title('Graphofy=sin(x)')octave:8>xlabel('Angle')octave:9>ylabel('Value') 23若是对图片的细节要求更高,推荐将数据格式化输出并单独使用gnuplot生成图形 5画图 16 表3:plot命令中的颜色和样式选项(见helpplot),(†仅在Matlab中存在的选项) w白色.点 -实线 m品红o圆圈 :虚线† c青色xx形 -.点划线† r红色++号 –虚线† g绿色*星号 b蓝色s正方形† y黄色†d菱形† k黑色†v下三角† <左三角† >右三角† p五角星† h六边形† 使用replot命令来更新图片。
grid命令为图片添加网格线:octave:##>gridon 图2显示了最新的结果。
5.2Multiplegraphs 一幅图上可以画多条曲线。
通过在plot命令中按照次序给出每条曲线的x和y向量。
例如,在之前的正弦曲线的基础之上画出余弦曲线: octave:##>plot(angles,ycangles,cos(angles));octave:##>legend('Sine','Cosine'); 而legend命令为该图片添加相应的图例。
该图片的结果如图3所示。
到目前为止,用户在新输入plot命令之后,原图片上的内容将被删除。
如果你想保存当前的图片内容并将新创建的图片层叠到原图片上,你可以通过使用hold命令来实现。
使用该命令,我们可以实现在同一幅图上呈现由两个plot命令绘制的线条。
octave:13>plot(angles,y,'.')octave:14>holdonoctave:15>plot(angles,cos(angles),'g-')octave:16>legend('Sine','Cosine') 而命令holdoff将会关闭该功能。
5.3Multiplefigures 多幅图片可以通过figure命令来控制。
在命令行中输入octave:##>figure那么下一个plot命令将会在新创建的窗口中绘制。
例如 5画图 17 Value Graphofy=sin(x)
1 0.5
0 -0.5 -
1 0
1 2
3 4
5 6 Angle 图2:每个点使用红色圆圈的y=sin(x)￿￿ 1Sine Cosine 0.5
0 -0.5 -
1 0
1 2
3 4
5 6
7 图3:y=sin(x)和y=cos(x)曲线 6OCTAVE编程I:脚本文件 18 octave:##>plot(angles,tan(angles))将会在该新窗口中画出正切函数图像。
如果你想返回到之前的图片,输入 octave:##>figure
(1)即可。
5.4保存和打印图片 Octave/Gnuplot没有提供鼠标或者快捷键操作来实现图片的打印操作。
然而Octave提供了print命令来将图片打印到默认的打印机上。
helpprint命令给出所有的print命令提供的选项,包括 octave:##>print('graph1.eps','-deps')来保存当前图像到一个eps文件或者 octave:##>print('graph1.png','-dpng')将当前图像保存为一个png文件。
6Octave编程I:脚本文件 如果你有一些重复输入的命令的,你可以将这一系列的命令存入一个Octave脚本之中。
这种包含Octave命令的文本文件是Octave程序的基本形式。
当你在Octave中执行这样的脚本的时候,其效果与将这些命令一行行输入Octave中的效果是一样的。
而且当你对一系列要输入Octave的命令不是很拿的准的时候,在一个脚本中修改这些命令会比在Octave终端中重新调出及修改命令要简单方便许多。
Octave的脚本是普通的文本文件,但是他们需要有一个.m的后缀(e.g.run.m)。
因此,它们通常也被称为M文件。
除去后缀的文件名部分是你在执行该命令时需要向Octave终端输入的部分。
6.1Path问题 4Octave中有一个比较重要的环境变量就是path变量,它存储了Octave中函数所在目录的一个列表。
当一个函数被调用的时候,Octave就从path变量中的列表中搜索你输入的函数。
默认的Octave的path包含一系列的系统目录(在linux下一般为/usr/share/octave)和当前工作目录(pwd)。
当然你也可以添加自定义的一些目录,并在该目录中存放你自己创建的一些函数或者脚本。
查看path可以用以下命令实现 octave:##>path./home/kasion/bin/octavecode/usr/local/share/octave/site-m/usr/lib/octave/3.2.4/site/oct/i486-pc-linux-gnu/usr/lib/octave/3.2.4/oct/i486-pc-linux-gnu/usr/share/octave/3.2.4/m/usr/share/octave/3.2.4/m/deprecated/usr/share/octave/3.2.4/m/set 4本小节为译者添加 /usr/share/octave/3.2.4/m/help/usr/share/octave/3.2.4/m/plot/usr/share/octave/3.2.4/m/path/usr/share/octave/3.2.4/m/time/usr/share/octave/3.2.4/m/io/usr/share/octave/3.2.4/m/audio/usr/share/octave/3.2.4/m/signal/usr/share/octave/3.2.4/m/general 6OCTAVE编程I:脚本文件 19 /usr/share/octave/3.2.4/m/linear-algebra/usr/share/octave/3.2.4/m/testfun/usr/share/octave/3.2.4/m/miscellaneous/usr/share/octave/3.2.4/m/special-matrix... /usr/share/octave/3.2.4/m/elfun/usr/share/octave/3.2.4/m/specfun/usr/share/octave/3.2.4/m/pkg/usr/share/octave/3.2.4/m/polynomial 该命令列出了octave中搜索路径的目录名称。
要添加某个目录到path中,你可以使用addpath命令,例如要添加homebob/bin/octave到path中,可以输入以下命令 octave:##>addpath('/home/bob/bin/octave'); 通过使用savepath命令保存对path的修改: octave:##>savepath; 更多有关path的选项可以通过帮助系统docpath或者helppath获得。
6.2创建和编辑脚本 你可以在任何的文本编辑器(如,emacs,vi,notepad)中创建并编辑一个脚本文件。
在Octave中可以通过以下命令 octave:##>edit 在新窗口中调出文本编辑器emacs5。
如果你想编辑一个已存在的脚本,你可以在edit命令后加上脚本的名字。
例如,比如你有你个名为run.m的脚本,输入editrun将调出编辑器并打开该文件供你编辑。
在编辑器中,你只需要输入你想在Octave中执行的命令。
例如使用编辑器输入以下的命令 %Scripttocalculateandplotarectifiedsinewavet=linspace(0,10,100);y=abs(sin(t));%Themandmakesallnegativenumberspositiveplot(t,y);title('RectifiedSineWave');xlabel('t'); 其中百分号符号%是表明注释而改行紧接其后的输入将被Octave解释器忽略。
在一个脚本中应该有较明晰的注释表明该脚本的基本功能以便于一段时间后你自己或者他人了解该脚本。
将该文件保存为rectsin.m,然后在Octave中输入rectsin执行脚本: octave:##>rectsin octave将运行该脚本中的命令并得到相应的结果。
6.3记住之前脚本 脚本在Octave中是非常有用的,但是如果你不细心的话,在你使用了很多的脚本之后你会对这些脚本混淆不清。
要想知道你拥有哪些脚本,你可以输入what命令来获取一个你当前所有的脚本和数据的列表: 5edit命令调出的文本编辑器可以通过Octave的配置文件进行设置 7控制语句 20 RectifiedSineWave1 0.8 0.6 0.4 0.2
0 0
2 4
6 8 10 t 图4:rectsin脚本执行得到的正弦曲线 octave:##>whatM-filesindirectory/home/kasion/tmp:rectsin.m... Octave也会自动识别你的脚本。
若你需要有关rectsin的帮助,你将获得 >>helprectsinScripttocalculateandplotarectifiedsinewave Octave假定一个脚本文件的头几行注释是该脚本的描述,这几行注释也是你使用help命令时获得信息,因此在你每个脚本的头几行写上有关该脚本的帮助信息是一个很好的习惯。
7控制语句 到目前为止我们所看到的程序或者表达式都是一些简单的顺序执行的操作。
向量和矩阵的使用能够让Octave执行更加高级的计算,但是要实现更加复杂的功能,我们还需要一些标准的程序语言。
Octave提供了通常的循环和选择语句。
7.1if...else语句 如果你想在程序中有条件的执行一些操作,就需要if这样的条件执行语句。
Octave中if语句的一般用法是 ifexpressionstatements elseifexpressionstatements 7控制语句 21 符号===>>=<<=&| 表4:布尔表达式 意义 例子 等于 ifx==y 不等于ifx=y 大于 ifx>y 大于等于ifx>=y 小于 ifx
2 或 ifx==1|y>
2 非 x=y elsestatements end 这与C++中的语法又一定的差异:Octave中条件不需要用括号()括起来(当然使用括号会让程序更加明了),而且statments程序块不需要用大括号{}括起来。
另外,Octave中需要用end命令来标识if语句的结束。
在Octave中,if...end和if...endif都是合法的.使用end可以让Octave的文件与Matlab文件兼容. 像if这样的控制语句,通常都使用在Octave的脚本之中,同样也能在命令行中使用,例如 octave:##>a=0;b=2;octave:##>ifa>b c=3else c=4endc=
4 在命令行界面中执行if语句时,Octave会等到你输入end语句之后才执行整个表达式。
控制语句中又很多的逻辑表达式——表达式根据相应条件具有真或者假的属性。
在Octave中,逻辑表达 式返回值根据真或者假分别返回1或者
0。
octave:##>1==2ans=0 octave:##>pi>exp
(1)&sqrt(-1)==ians=
1 一个关系表达式和逻辑表达式的总结见表
4,注意这些规则和C++中的微小差异。
7控制语句 22 7.2switch语句 如果你发现你需要多重if/elseif语句来实现从多重选项中选择时,使用switch语句更好。
该语句的格式是 switchxcasex1statementscasex2statementsotherwisestatementsend 在switch语句中,x的值依次与case中的值比较,如果找到与之相等的值,相应的statements将被执行。
注意到在Octave中switch语句不像C++那样需要break语句——Octave中找到匹配的选项,执行statements中的语句并退出swith语句。
若是没有匹配的项,otherwise中的语句被执行。
例如 octave:##>a=1;octave:##>switcha case0disp('aiszero'); case1disp('aisone'); otherwisedisp('aisnotabinarydigit'); endaisone 其中disp函数显示一个值或者字符串。
在这个例子中该函数用来打印一个字符串,当然它也可以用来显示变量值,e.g.disp(a)将显示出a的值。
7.3for语句 for循环是编程语言中另一个常用的结构,它将一定次数的重复执行一段代码。
在Octave中你应该多使用向量的计算而不是for循环,因为通常for循环会慢很多。
然而有的时候for循环是不可避免的。
该语句的语法是 forvariable=vectorstatements end 其中vector中包含遍历的数值。
通常,该向量用冒号表达式(见4.2节)写出,比如 octave:##>forn=1:5nf(n)=factorial(n); end 8OCTAVE编程II:函数 23 octave:##>disp(nf)12524120 注意到在for循环中加入分号能避免octave在每次执行循环体时输出nf(n)的值。
7.4while语句 如果你不知道需要执行多少次循环,而是知道当某条件满足时结束循环。
Octave中的while语句能实现该功能 whileexpressionstatements end 例如 octave:##>x=1;octave:##>while1+x>1 x=x/2;endoctave:##>xx= 1.1102e-16 8Octave编程II:函数 Octave中的脚本能实现一些简单的程序,但是比脚本更加强大的是用户自定义函数。
自定义函数能够让你在命令行、其他函数中和脚本中调用。
在Octave函数中参数是通过值传递的而不是通过reference传递并能返回多个返回值。
Octave函数如同脚本一样,是写入一个纯文本文件中的,不同的是函数文件的第一行遵循如下的格式 function[output1,output2,...]=name(input1,input2,...) 每个函数都卸载了不同的M文件中,而且该M文件名不须与函数名一致。
例如名为sind()的函数必需被定义在名为sind.m的M文件中。
每个函数接受一定的参数输入并输出一定的数值。
当你需要重复性的执行一定表达式,这表明你需要将这与的操作封装为一个函数。
封装为函数之后Octave将更加易用,增加了代码的可读性并可以供他人使用。
8.1实例1:角度制正弦函数 在Octave中,三角函数都是使用的弧度制,但是有时候使用角度制也比较的方便。
但是使用角度制的时候每次都需要使用sin(d/180*pi)将角度d转换为弧度制并调用三角函数。
但是若是使用一个函数sind(d)(sineindegrees)会让代码更加的简单异读。
我们可以创建这么一个函数,创建一个名为sind.m的文本文件并包含以下内容: 8OCTAVE编程II:函数 24 functions=sind(x)%SIND(x)Calculatessine(x)indegreess=sin(x*pi/180);endfunction 这个函数看似简单,而很多函数都是这样简单但是很有用。
我们逐行分析该文件:
1.Line1该行告诉Octave本文件定义的是一个函数而不是脚本。
该行表明定义了一个名为sind的函数,而且该函数接受一个输入参数并返回一个返回值。

2.Line2该行为注释行。
和脚本中的一样,函数中这部分注释将被Octave帮助系统识别为有关该函数的说明,并在用户使用helpsind是被返回。
推荐大家使用该注释部分的写法格式,该写法也是Octave内建函数中注释的写法。

3.Line3改行是实现函数的真正功能。
它将获取x的值并将计算结果赋给返回值s。

4.Line4Octave中函数的结尾需要以endfunction结束。
通常Octave不需要return语句(当然你可以使用该语句从函数体中间跳出。
)来终止函数体。
8.2创建并使用函数 打开文本编辑器并将上述行文件并保存为sind.m,因为该M文件的文件名是函数名加上一个.m的后缀。
将该文件放到path变量中所在的目录里(默认的当前目录也中其中),你就可以像使用普通Octave内建函数一样使用字定义的sind函数了。
例如,输入 octave:##>helpsindSIND(x)Calculatessine(x)indegrees 将显示出有关该函数的说明,这对于使用者理解该函数的功能又很大的帮助。
所以建议大家都为自定义的函数做足够明晰的注释。
又如: octave:##>sin(0)ans=0 octave:##>sin(45)ans=0.7071 octave:##>t=sin([306090])t=0.50000.86601.0000 最后一个例子表明该函数同样适用于向量参数的输入。
因为你以向量输入时,函数体内的x变量将是一个向量,由于sin函数能处理向量输入,所以该函数能给出正确的结果。
8OCTAVE编程II:函数 25 8.3实例2:单位阶跃函数 现在我们创建一个更加复杂的函数——单位阶跃函数,该函数的定义是 0y=
1 t该函数的内容为 functiony=ustep(t,t0) %USTEP(t,t0)unitstepatt0 %Aunitstepisdefinedas % 0fort=t0 [m,n]=size(t); %Checkthatthisisavector,notamatrixi.e.(1xn)or(mx1) ifm~=1&n~=
1 error('Tmustbeavector'); end y=zeros(m,n);%Initialiseoutputarray fork=1:length(t) ift(k)>=t0 y(k)=1;%Otherwise,leaveitatzero,whichiscorrect endif endfor endfunction 我们将再次逐行分析该文件:
1.Line1第一行表明这是一个名为ustep的函数,而且用户必需提供两个输入参数t和t0。
返回值为一个数y。

2.Line2-5为该函数的描述。
这与的情况下帮助文件将包含好几行。

3.Line6ustep函数的第一个输入参数t必需为一个向量而不是一个数量,并对应与函数值产生的时间值。
该行适用的size函数返回矩阵或者向量的行数和列数。
这也是Octave函数两个返回值的一个实例。

4.Line7-10检查输入是否合法,即是否为矩阵。
该向检查是通过检查是否只含有一行或者一列来实现的。
其中error函数将打印一个信息并中止该函数的执行。

5.Line11该行将创建一个用于存储函数结果的的向量,如改行注释所示。
该变量被初始化为与t向量由相同的打大小而且所有元素为零。

6.Line12对t中所有的时间值,我们间对应的赋一个y值。
因此我们适用一个for循环来遍历每个值。
length函数告诉我们t变量中的元素个数。
9矩阵和向量 26 ExampleoffunctionUstep2 1.5
1 y 0.5
0 -0.5 -
1 -
1 0
1 2
3 4 t 图5:单位阶跃函数
7.Line13-15根据我们的定义,如果t由于初始化变量y已经是全零的,我们只需要考虑当t>=t0的情况并将赋值y=
1。
在大多数高级程序语言中,函数内部的变量(m,n和k等)被称为内部变量。
它们只在该函数内部有效而不会覆盖函数外部的同名的变量。
该函数中唯一一个将返回的变量只有y变量。
将该函数输入文本编辑器并保存为ustep.m。
现在我们可以使用该函数来创建信号。
例如,创建一个时间长度为一秒的单位脉冲,我们可以输入 octave:##>t=-1:0.1:4;octave:##>v=ustep(t,0)-ustep(t,1);octave:##>plot(t,v);octave:##>axis([-14-12]); 该函数的图像如图5所示。
9矩阵和向量 向量是矩阵的一个特殊例子。
一个矩阵是由一些列的数字按照一定的行和列排列起来的,并通常用 m×n来描述一个包含m行n列的矩阵。
例如一2×3的矩阵: [ ] 579 −13−
2 在Octave中输入矩阵与输入向量相似,逐行输入: octave:##>A=[579-13-2] A= 9矩阵和向量 27 579-13-
2 或者使用分号来标定一行的结束,例如: octave:##>B=[20;0-1;10]octave:##>B= 200-110 同样的你可以使用冒号的表示法: octave:##>C=[1:3;8:-2:4]C=123864 另一种逐行生成矩阵的方法: >D=[123];>D=[D;456]>D=[D;789]>D= 124456789 9.1矩阵乘法 矩阵的乘法用*表示,以之前的几个矩阵为例: >A*Bans=19-7-4-
3 >B*Cans=246-8-6-4123 >A*Cerroroperator*:nonconformantarguments(op1is2x3,op2is2x3) 矩阵乘法必需满足一定的矩阵大小规则,一般地,在矩阵乘法中,矩阵大小为 (l×m)∗(m×n)→(l×n)
(4) 方阵还可以使用矩阵乘方计算 9矩阵和向量 28 octave:1>A=[12;21]A= 1221 octave:2>A^2ans= 5445其中A2=A∗
A。
而对于矩阵中每个元素的相乘,则使用.*算符。
除法和乘方的元素之间的计算以此类推。
例如:octave:1>A=[12;21]A= 1221 octave:2>B=[12;34]B= 1234 octave:3>
A.*Bans= 1464 octave:4>
A.^2ans= 1441octave:5>
2.^Aans= 2442 9矩阵和向量 29 9.2转置算符 一个向量的转置将其由行向量转为列向量或者由列向量转换为行向量。
矩阵的转置将其行和列交换。
在数学上,矩阵A的转置表示为AT。
在octave中转置操作用上引号实现: octave:6>A=[579;-13-2]A= 579-13-
2 octave:7>A'ans= 5-1739-
2 9.3矩阵创建函数 Octave拥有一系列函数来创建一些特殊的矩阵。
我们已经知道了ones和zeros这两个创建全1或者全0的矩阵。
一类重要的矩阵便是单位矩阵,任何矩阵与该矩阵相乘结果不变。
在数学上通常用tI来表示单位矩阵。
Octave中使用eye矩阵来创建单位矩阵,该函数要求一个输入参数,例如: octave:8>I=eye
(4)I= DiagonalMatrix 1000010000100001 octave:9>I*[5;8;2;0]ans= 5820单位矩阵是对角矩阵的特殊情况,Octave提供了diag函数来创建这样的矩阵,输入参数为该对角矩阵的对角元向量: 9矩阵和向量 30 octave:10>diag([-172])ans= DiagonalMatrix -100070002 diag的功能很强大,如果对一个矩阵使用该函数,该函数将返回该矩阵的对角元,如octave:11>diag(A) ans= 53有时候你需要创建一个空矩阵来向其中添加矩阵元。
定义这样的矩阵用方括号实现: octave:12>E=[]E=[](0x0) 9.4创建复合矩阵 通常你需要用一些小矩阵来创建一个复合矩阵,这在Octave中也很简单:octave:22>B=[20;0-1;10]B= 200-110 octave:23>p=[eye
(3)B;Azeros(2,2)]p= 100200100-10011057900-13-200在这个过程中你只需要注意各个子矩阵的行列数的匹配。
10基本矩阵函数 31 9.5提取矩阵元 引用矩阵中的元素与向量中的操作一样,使用括号()。
对于矩阵,你需要指定其行号和列号,以下是一些例子: octave:24>J=[1234>5678>11121310]J= 1234567811121310 octave:25>J(1,1)ans=1octave:26>J(2,3)ans=7octave:27>J(1:2,4)%rows1-2,column4ans= 48 octave:28>J(
3,:)%row3,allcolumnsans= 11121310 其中冒号用来指定元素的的范围,单独使用该符号表示整行或者整列。
这样的表达式同样可以用于矩阵元的赋值。
例如: octave:29>J(3,2:3)=[-10]J= 125611-
1 3478010 10基本矩阵函数 Octave提供了一系列的函数来进行矩阵的运算(见表5)。
比如之前用到的size函数可以用来获取矩阵的行数和列数。
又如一个矩阵的逆矩阵(定义为AA−1=A−1A=I),可以用 10基本矩阵函数 32 eyezerosonesranddiaginvdettraceeigranknullrrefluqrsvdpinv 表5:基本矩阵函数创建单位矩阵创建全零矩阵创建全一矩阵创建随机数矩阵创建一个对角矩阵,或者提取一个矩阵的对角元求矩阵逆矩阵求矩阵特征值求矩阵的迹求矩阵的特征向量和特征值求矩阵的秩CalculateabasisforthenullspaceofamatrixPerformGaussianeliminationonanaugmentedmatrixCalculatetheLUpositionofamatrixCalculaatetheQRpotitionofamatrixCalculatetheSVDofamatrixCalculatethepseudoinverseofamatrix ttinv函数求得: octave:3>A=[304;01-2;213]A= 30401-2213 octave:4>inv(A)ans= 0.71429-0.57143-0.28571 0.571430.14286-0.42857 -0.571430.857140.42857 octave:5>A*inv(A)ans= 1.000000.00000-0.00000 0.000001.000000.00000 0.000000.000001.00000 11解决AX=B类问题 33 Octave通过使用det函数来计算一个矩阵的行列式,例如 octave:6>det(A)ans=
7 11解决Ax=b类问题 12画图进阶 Octave的画图功能不仅仅是画简单的二维直角坐标系下的曲线。
通过调用GNUPLOT,它可以画出条形图,3D表面,等高线图和极坐标图等等。
有关这些内容的细节可以参考Octave的帮助系统或者参考GNUPLOT的帮助文档。
12.1子图 要在同一个窗口中创建多幅图片通过ttsubplot命令实现。
该命令能够将窗口分离成一系列的子窗口,其基本语法为 subplot(row,columns,select)其中subplot参数指定当前绘图在子窗口中的序列。
子窗口的序号按照从上到下,从左到右的次序递增。
接下来用一个例子来说明subplot的应用。
octave:25>x=linspace(-10,10);octave:26>subplot(2,1,1)octave:27>plot(x,sin(x));octave:28>subplot(2,1,2)octave:29>plot(x,sin(x)./x)结果如图6所示,分别画出了正弦曲线和sinc函数曲线。
12.23D画图 Octave同样提供了多样的3D数据可视化工具。
最简单的3D绘图实现是ttplot3命令。
该命令通过接受输入的x,y和ttz轴的数据,绘制出点或者线。
接下来的例子画出了一个螺旋线,使用参数式的函数: octave:11>z=[0:0.05:5];octave:12>plot3(cos(2*pi*z),sin(2*pi*z),z,";helix;")绘图结果如图7所示。
在3D绘图中xlabel和ylabel照常使用,而新的zlabel命令可以为z轴命名。
而且在绘制3D图时,表3中线条的样式的选项也可以使用。
12.3调整视角 如果你想改变3D绘图结果的视角,最简单的方法就是使用鼠标(使用鼠标点击并拖拽可以旋转图像,具体操作选项见表6)。
而Octave的view命令能够定量的确定一个特定的视角(使用helpview获得更多帮助信息)。
12画图进阶
1 0.5
0 -0.5 -
1 -10 -
5 0
5 10
1 0.8 0.6 0.4 0.2
0 -0.2 -0.4 -10 -
5 0
5 10 图
6:subplot实例 34 5helix
4 3
2 1 01 0.5
1 0-0.5 0.50-0.5 -1-
1 图7:plot3命令实例——螺旋线 鼠标动作LMB+motion+LMB+motion快捷键 →↑←↓ 操作旋转视角 旋转坐标轴(Rotateaxes6)操作右旋上旋左旋下旋 表6:切换视角操作 13本征向量和奇异值分解 35 surf
1 0.5
0 -0.5 -112 10
8 1210
6 8
4 6
2 42 00 mesh
1 0.5
0 -0.5 -112 10
8 1210
6 8
4 6
2 42 00 meshz
1 0.5
0 -0.5 -112 10
8 1210
6 8
4 6
2 42 00 contour12 10
8 6
4 2
0 0
2 4
6 8 10 12 图8:3D曲面绘制实例 另一种重要的的3D绘图便是曲面的绘制。
定义一个二元函数f(x,y),该函数的曲面可以用一系列的Octave的工具画出。
首先,要初始化一个网格点,用meshgird命令实现: octave:17>x=2:0.2:4;octave:18>y=1:0.2:3;octave:19>[
X,Y]=meshgrid(x,y);%makethegrid 12.4绘制曲面 二元函数就可以在定义的
X,Y网格上被定义,例如一个函数f(x,y)=(x−3)2−(y−2)
2 定义该函数可以在Octave中输入octave:20>Z=(X-3).^2-(Y-2).^2;octave:21>subplot(2,2,1);surf(Z);title('surf')octave:22>subplot(2,2,2);mesh(Z);title('mesh')octave:23>subplot(2,2,3);meshz(Z);title('meshz')octave:24>subplot(2,2,4);contour(Z);title('contour')以上命令的结果如图8所示。
13本征向量和奇异值分解 14复数 除了向量和矩阵的计算外,Octave也支持很多在数学或者工程上的概念,比如复数。
Octave中复数的表示法与其常规表达法一致: 14复数 36 函数imagrealabsconjangle 意义虚部实部绝对值共轭幅角 表达式(z=a+bi)abr=|z|z=a−biθ=sin(ab) 表7:复数函数 octave:40>z1=4-3iz1=4-3i 而tti和ttj都可以在Octave中代表单位虚数(√−1),因此你也可以这样输入 octave:41>z2=1+3jz2=1+3i 普通的复数运算的实例如下: octave:42>z2-z1ans=-3+6ioctave:43>z1+z2ans=5octave:44>z2/z1ans=-0.20000+0.60000ioctave:45>z1^2ans=7-24i Octave同样的提供了一系列的函数来进行更多的复数计算,比如求复数共轭,模和幅角求解。
这些函数列于表7中。
而Octave中的内建函数如sin(x)或者ex,都支持复数。
14.1绘制复数 在Octave下可以用ttplot命令来创建Argand图(其中x轴代表实部而y轴代表虚部): octave:3>plot(z1,'*',z2,'*')octave:4>axis([-55-55])该命令的结果如图9所示。
14.2多项式求根 Octave提供了一个名为roots的命令来求解多项式的根。
方程通过其系数的向量表示出来传递给ttroot函数,例如 x5+2x4−5x3+x+3=
0 15OCTAVE可执行程序 37
4 2
0 -
2 -
4 -
4 -
2 0
2 4 将被表示为 octave:##>c=[12-5013];而ttroots函数通过以下方式调用 octave:12>roots([12-5013])ans= 图9:绘制复数 -3.44726+0.00000i1.17303+0.39021i1.17303-0.39021i -0.44940+0.60621i-0.44940-0.60621i 15Octave可执行程序 通过使用类Unix系统中的脚本机制,你可以创建一个Octave可执行程序.通过使用这样的可执行程序你可以在不用了解程序内容的情况下直接在系统中调用它,这样的程序在批处理数据文件的时候同样非常有用.一旦一个算法在Octave的交互式终端中被验证为有效的,你就可以将它写成一个可执行程序并反复对新的数据文件使用. 举一个简单的实例,你创建一个包括如下内容的名为hello的文本文件: #!
octave-interpreter-name-qf#asampleOctaveprogramprintf("Hello,world!
\n"); 15OCTAVE可执行程序 38 (其中octave-interpreter-name是系统中Octave的绝对路径下的可执行程序名称,如/usr/bin/octave).而且该文件的第一行必须以‘#!
’开头.通过为该hello文件添加可执行权限(e.g.chmodu+xhello),你就可以在系统的终端中输入 hello 来执行该文件.‘#!
’那一行将列出用于解释文件中语句的解释器的绝对路径和名称,而且还可以为该解释器指定一定的执行选项.该行中紧接着‘#!
’字符的便是Octave这个程序的路径.而余下的选项便是执行Octave解释器时的一些参数,例如上面的‘-qf’选项中,‘-q’选项能够屏蔽程序在普通情况下执行时输出到标准输出的一些介绍性的信息,而‘f’选项能够让程序忽略用户的在文件~/.octaverc中的一些设置
7. Octave程序在系统终端执行的时候,还可以为其添加一些参数.这样的参数通过Octave的内部变量argv存储.例如一个例子: #!
/bin/octave-qfprintf("%s\n",program_name());arg_list=argv();fori=1:narginprintf("%s\n",arg_list{i});endforprintf("\n"); 将上述内容保存为test文件中,并为其添加可执行权限并执行之: kasion@tmp:$chmodu+xtestkasion@tmp:$./testarg1arg2arg3 那么程序的输出为: kasion@tmp:$./testarg1arg2arg3testarg1arg2arg3 如果将test文件加入到系统PATH变量所在的目录中(比如/usr/bin或者/home/kasion/bin下),那么你就可以像调用ls,cd等命令一样调用test命令了,而且通过与系统shellscript的灵活调用,能够实现强大的功能. 最后我给出一个我学习中的一个实际例子,我需要计算一个数据文件中的数据并得到一些图片. 1.3000000000e+002.9549292750e+002.9349509600e+001.3102040816e+002.9454196710e+002.9248815610e+001.3204081633e+002.9359134520e+002.9148026660e+001.3306122449e+002.9264083650e+002.9047117190e+00 ... 7比如,如果你的Octave程序中调用了一些自定义的函数,而这样的函数在你自定义的path中,那么使用‘-f’选项时,Octave会报错表示无法找到你的那个特定的函数. 15OCTAVE可执行程序 39 其中文件的第一行为波长数据,第二行和第三行为对应波长下波导TE和TM模式的有效折射率数据.我要 求的是其色散系数 λd2neffD=−
(5) Cdλ
2 我命名一个Getdistetm的脚本: !
/usr/bin/octave-q#ments...#printthemessagesclearall;printf("Programename:%s\n",program_name());printf("Processing....\n");formatlong;#basicconstantsC=3e2;#lightspeedinfreespace[um/ps]#loadthedataarglist=argv();...#loadthedatabuffer=load(arglist{1});lam=buffer(:,1);neffte=buffer(:,2);nefftm=buffer(:,3); #caculatethedipersionfitorder=4;Pte=polyfit(lam,neffte,fitorder);Ptm=polyfit(lam,nefftm,fitorder);fork=1:(fitorder-1)P2te(k)=(fitorder+1-k)*(fitorder-k)*Pte(k);P2tm(k)=(fitorder+1-k)*(fitorder-k)*Ptm(k);endd2neffte=polyval(P2te,lam);....outdata=[lamDispersionteDispersiontm]; #savetheresultsave("-ascii",outfile,"outdata");#plotandsavethefigure;figure;plot(lam,Dispersionte,'k:','LineWidth',2,lam,Dispersiontm,'r-','LineWidth',2);...gridon; A更多参考资料 40 print(figurename,'-dpng','-S680,500');printf("Done!
\n");#Endofthescript那么执行该脚本的方法为 kasion@tmp:$Getdistetm800x500_bp_mode_neffr.dat我将在工作目录下得到该文件对应结构的色散数据和图像.而且通过shell的强大功能,如 kasion@tmp:$forfilein`ls*neffr.dat`;doGetdistetm$file;done就能够将当前目录下所有以neffr.dat结尾的数据执行求色散工作. A更多参考资料 通过以下资料了解更多:Octave官方文档:Octave快速指南:he.Prudhomme/courses/octave/octave-refcard-a4.pdfOctave邮件列表:/ B声明 本文是Dr.P.J.GLong所著的的部分翻译稿,原文的Acknowledgements如下: •ThisdocumenthasbeenproducedasatutoialtopanytheversionofOctavesuppliedontheCambidge-MITInstitute(CMI)8fundedMultidisciplinaryDesignProject(MDP)9ResourceCD.ThetextofthistutorialhasbeenadaptedfromthestudentnotesdevelopedbyDr.PaulSmithfromtheCambridgeUniversityEngineeringDepartmentfora2ndyearIntroductiontoMatlabsourse.ConversionfromPaulSmith’soriginaltothiscurrentdocumenthasberelativeeasywithinmanycasesneedingonlytoexchange•OctaveforMatlabinthetext•thepromptandpreciseformatoftheanswersgivenintheexamplescripts•removalofspecificcourseadministration.Howeverinnumberofcasestherearesignificantdifferences,e.g.graphicalperformance(GnuplotisassumedtobetheoutputpluginforOctave),wherechangeshavehadtobemade.AnyessofthistutorialisamajorresultofthethebackgroudworkcarriedoutbyTimFroggattinsettinguptheMDPresourcedistributionandrequestsfromGarethWilson,theauthoroftheREDToolswebinterfaceforOctavescipts,foradditionalinformationandscripts. 8CMI-9MDP-http://www-mdp.eng.cam.ac.uk B声明 41 SignificaantreferencehasbeenmadetotheresourcesgeneratedandmaintianedbyJohnEatonandhisteamat.Asindicatedabove,thetutorialisheavilybasedonPaulSmith’sOriginalinwhichheacknowledgesadviceandhelpfromRobertoCipolla,RichardPrager,HughHunt,MauriceRinger,DavidManserghandMartinSzummer. B声明 42 本文是我在2011年寒假期间陆续做出来的。
随着本工作的展开,我越来越是怀疑本工作的必要性:因为我认为任何有一定的Matlab基础的人是很容易上手Octave。
所以这个工作陆续做下来之后我不免偷工减料,比如原文中的部分小节和章节并没有出现在本译稿中。
另外,我在文中添加了一节,Octave的这个功能对于我的日常数值计算有很大的帮助。
对于文中很多的不通顺的中文,我在这里向大家表示歉意。
而除了不通顺的中文外,文中的LATEX排版方面也有很多的不足,我的kile程序在编译的时候会给出大量的error信息。
原文中可能有的错误我也没有过多的核查,对于这样的错误我在译稿中姑且是以讹传讹,在这里也希望大家能够积极指出来。
总之,看到这份文稿的你对于该文档有任何的意见和建议都可以通过邮件与我取得联系:联系我:liuqiang@ 感谢父母在寒假期间对我生活上的无微不至的照顾,让我有时间在电脑前码字。

标签: #cdkey #cup #carrot #什么意思 #coolant #网络 #网络语言 #计算机