在本节中,咱们将学习如何为Octave程序写控制语句。编程
首先,咱们先学习如何使用for循环。咱们将v设为一个10行1列的零向量。编程语言
接着,咱们写一个for循环,让i等于1到10。写出来就是for i = 1:10。我要设v(i)的值等于2编辑器
的i次方,即输入 v(i) = 2^i ,循环的最后要记得写上 end 。这里的空格实际上是没有意义的,它们只是为了看起来更加好看。按照这样作,那么结果就以下图所示。函数
因此这个语句的做用就是:让i遍历1到10的值。还有另一种方法:设置indices(索引)等于1到10,即输入indices = 1:10; ,这时indices就是一个从1到10的序列。如何能够输入for i = indices. ,这其实是和for i = 1:10. 是同样的。而后输入disp(i); end 也能获得一个一样的结果。学习
若是你对 “break” 和 “continue” 语句比较熟悉,Octave里也有 “break” 和 “continue”语句,你也能够在 Octave环境里使用那些循环语句。
可是首先让我告诉你一个 while 循环是如何工做的:ui
让咱们写一个while循环,i=1; while 1<=5, v(i)=100; i=i+1;end; 。这是什么意思呢?我让i取值从1开始,而后我要让v(i)等于100,再让i递增1,直到i大于5中止。
如今来看一下结果,我如今已经取出了向量的前五个元素,把他们用100覆盖掉,这就是一个while循环的句法结构。this
如今咱们来分析另一个例子,在这个例子中将展现怎么使用break语句。spa
固然这也是咱们第一次使用一个if 语句,因此我但愿大家能够理解这个逻辑,让i等于1而后开始下面的增量循环,while语句重复设置v(i)等于999,不断让i增长,而后当i 达到6,作一个停止循环的命令,尽管有while循环,语句也就此停止。因此最后的结果是取出向量v前5个元素,而且把它们设置为999。设计
因此,这就是if 语句和while 语句的句法结构。而且要注意要有end,这个例子有两个end语句。上面的例子里第一个end 结束的是if 语句,第二个end 结束的是while 语句。如今让我告诉你使用if-else 语句:(首先咱们设置v(1)=2)3d
最后,提醒一件事:若是你须要退出 Octave,你能够输入exit命令而后回车就会退出Octave,或者命令quit也能够。
最后,让咱们来讲说如何定义和调用函数。
我在桌面上存了一个预先定义的文件名为 “squarethisnumber.m”,这就是在 Octave 环境下定义的函数。你须要建立一个文件,用你的函数名来命名,而后以.m的后缀结尾。当Ocatve发现这文件,它知道应该在什么位置查找。
让咱们打开这个文件。请注意,我使用的是微软的写字板程序来打开这个文件,我只是想建议你,若是你也使用微软的Windows系统,那么可使用写字板程序,而不是记事原本打开这些文件。若是你有别的什么文本编辑器也能够,但记事本有时会把代码的间距弄得很乱。若是你只有记事本程序,那也能用。但若是你有写字板或者其余的,我建议你用写字板或者其余能够编辑函数的文本编辑器来编辑函数。
如今咱们来讲如何在 Octave 里定义函数:
这个文件只有三行:
第一行写着function y = squareThisNumber(x),这就告诉Octave,我想返回一个值,而且返回的这个值将被存放于变量y里。另外,它告诉了Octave这个函数有一个自变量,就是x,定义的函数主体是y=x2。
如今让咱们尝试调用这个函数。输入squareThisNumber(5),实际上这是行不通的。Ocatve说这个函数未被定义。这是由于Ocatve不知道在哪里找这个文件。
像以前同样,咱们使用pwd显示如今路径,而后更改路径cd 'C:\Users\ang\desktop',而后调用这个函数,就会获得返回值25。
还有一种更高级的功能,若是你知道search path (搜索路径)这个术语。你能够把下面这部分做为一个进阶知识,或者选学材料,仅适用于那些熟悉编程语言中搜索路径概念的同窗。因此若是你想要修改Octave的搜索路径,你能够使用addpath 命令添加路径,添加路径"C:\Users\ang\desktop";将该目录添加到Octave的搜索路径,这样即便你跑到其余路径底下,Octave依然知道会在Users\ang\desktop目录下寻找函数。这样,即便我如今在不一样的目录下,它仍然知道在哪里能够找到SquareThisNumber这个函数。
可是,若是你不熟悉搜索路径的概念,不用担忧,只要确保在执行函数以前,先用cd命令设置到你函数所在的目录下,实际上也是同样的效果。
Octave还有一个其余许多编程语言都没有的概念,那就是它能够容许你定义一个函数,使得返回值是多个值。这里就是一个例子,定义一个函数叫:squareAndCubeThisNumber(x)。这说的就是该函数返回值是两个值y1和y2。y1=x^2,y2=x^3。好比大家可能熟悉的C或C++,一般状况下,认为做为函数返回值只能是一个值,但Octave 的语法结构就不同,能够返回多个值。
若是我输入[a,b] = SquareAndCubeThisNumber(5),而后,a就等于25,b就等于125。
因此说若是你须要定义一个函数而且返回多个值,这一点经常会带来不少方便。最后,我来给你们演示一下一个更复杂一点的函数的例子。比方说,我有一个数据集,像这样,数据点为(1,1), (2,2),(3,3),我想作的事是定义一个Octave 函数来计算代价函数J(θ),就是计算不一样θ值所对应的代价函数值。
首先让咱们把数据放到Octave 里,我把设计矩阵设置为X = [1 1; 1 2; 1 3];(第一列表示x0项,第二列表示训练样本的x值),y设置为y=[1 ; 2 ; 3](这是y轴对应值)。如今咱们设定θ为[ 0 ; 1 ]。
如今打开预先定义好的函数,请仔细看一下这个函数的定义,确保你明白了定义中的每一步。
如今当我在Octave 里运行时,我输入J = costFunctionJ (X, y, theta),它就计算出J=0。
这是由于若是个人数据集x为[1;2;3],y 也为[1;2;3]而后设置θ0=0,θ1=1,这给了我刚好45度的斜线,这条线是能够完美拟合个人数据集的。
而相反地,若是我设置θ等于[0;0],那么这个假设就是0是全部的预测值,和刚才同样,设置θ0=0,θ1=0,而后我计算的代价函数,结果是2.3333。实际上,他就等于1的平方,也就是第一个样本的平方偏差,加上2的平方,加上3的平方,而后除以2m,也就是训练样本数的两倍,这就是2.33。
所以这也反过来验证了咱们这里的函数,计算出了正确的代价函数。完整性检查证实咱们对定义的代价函数J确实是能够计算出正确的代价函数的。至少基于这里的训练集是成立的。
如今你知道如何在Octave 环境下写出正确的控制语句,好比for循环、while循环和if语句,以及如何定义和使用函数。在接下来的课程中,将学习向量化,这是一种可使你的Octave程序运行很是快的思想。