Octave 控制语句

首先将v值设为一个10行1列的零向量。

现在写一个for循环,让i等于1到10,写出来就是 for i = 1:10  然后设v(i)的值等于2的i次方  循环的最后记得写上end;   这里的空格没有什么关系,加了一些空格只是为了让缩进后的代码看起来结构更清晰,但其实这里的空格没有意义,然后打印结果:

 

另一种方式是设置indices(索引)等于1到10,这时indices就是一个从1到10的序列。

那么也可以写for i = indices  这实际上和for i = 1:10是一样的  也可以写disp(i)  也能得到一样的结果。所以这就是一个for循环。

 

如果你对break语句和continue语句比较熟悉,也可以在Octave环境的循环里使用。但是首先需要先告诉你while循环是如何工作的?

那么先来写个while循环:

所以这是什么意思呢?让i的取值从1开始,然后让v(i)等于100,再让i递增1直到i大于5停止。

 

现在来看一下结果,原来的向量v是2的次方,而现在已经把向量v的前5个元素用100覆盖掉了,这就是一个while循环的句法结构。

 

现在来分析另外一个例子,这里将展示如何使用break语句:

这个逻辑是让i等于1,然后开始下面的增量循环,while语句重复设置v(i)等于999,不断让i加1,然后当i达到6时,就用break中止while循环,所以最好的效果是取向量v的前5个元素,把它们设置为999。

 

这就是if语句的句法结构和while语句,并且注意要有end,这里是有两个end的,第一个end结束的是if语句,第二个end结束的是while语句。

 

现在来看使用if-else语句时更一般的句法结构。

v(1)现在是等于999的,在下面的例子中,令v(1)等于2。

如果需要退出Octave,可以键入exit命令,然后回车,就会退出Octave,或者命令quit也可以。

 

最后来说一说函数,如何定义和调用函数?

这是我Octave的当前路径,在里面存了一个预先定义的文件,名为"squarethisnumber.m"。在Octave环境下定义函数,你需要创建一个文件,用你的函数名来命名,然后以.m的后缀结尾。当Octave发现这文件,它知道应该在什么位置查找squarethisnumber.m这个函数的定义。

这里只是想建议你,如果你使用的是微软的Windows系统,那么可以使用写字板程序而不是记事本来打开这些文件。如果你有别的什么文本编辑器也是可以的。记事本有时会把代码的间距弄得很乱。如果你只有记事本程序,那也能用。但如果你有写字板的话,建议你使用写字板或者其他的文本编辑器来编辑函数。

现在来说如何在Octave里定义函数

文件有三行,第一行写了function y = squareThisNumber(x)  这就告诉Octave我想返回一个值把它存放在变量y里,另外它告诉了Octave,这个函数有一个自变量x。定义的函数主体是y = x^2 

现在我们尝试来调用这个函数

这样实际上是行不通的,Octave说这个函数未被定义,这是因为Octave不知道在哪里找这个文件。所以像之前一样,使用pwd,现在不在正确目录下(这个函数在"C:\Octave\program"里面)。

因此我们把路径设为"C:\Octave\program"。

出错,修改squareThisNumber.m文件。注意,如果直接在word文档里改,可能还是会出现上张图的那种错误,可以进入Octave的squareThisNumber.m的这个文件里改。如下图所示:

现在如果键入squareThisNumber(5),返回值是25:

还有一种更高级的功能:

如果你知道search path(搜索路径)这个术语,如果你想要修改Octave的搜索路径。你可以把下面这部分作为一个进阶知识。仅适用于那些熟悉编程语言中搜索路径概念的人。

你可以使用addpath命令,添加路径"C:\Octave\program",将该目录添加到Octave的搜索路径,这样即使你跑到了其他路径下面,Octave依然知道会在"C:\Octave\program"目录下寻找函数。这样,即使现在在不同的目录下,它仍然知道在哪里可以找到"squareThisNumber"这个函数。

但是,如果你不熟悉搜索路径的概念,也没关系,只要确保在执行函数之前先用cd命令设置到函数所在的目录下,实际上也是一样的效果。

Octave还有一个其他许多编程语言都没有的概念。那就是它可以允许你定义一个函数能够返回多个值。这里有一个例子,定义一个函数叫"squareAndCubeThisNumber(x)",这说的就是该函数返回值是两个值y1和y2,y1是x^2,y2是x^3。这就是说函数会真的返回两个值。所以你们可能的熟悉C、C++或Java通常情况下认为作为函数返回值只能是一个值,但Octave的语法结构就不一样,可以返回多个值。

现在如果键入[a,b] = squareAndCubeThisNumber(5); 

所以这样往往很方便,如果你需要定义一个函数并且返回多个值。

 

最后来演示一个更复杂一点的函数的例子。

例如,现在有一个数据集,如下图所示,数据点为(1,1),(2,2),(3,3)。

要做的就是定义一个Octave函数来计算代价函数J(θ),不同θ值所对应的代价函数值J,首先把数据放到Octave里。

把设计矩阵设置为 X = [1 1;1 2;1 3]

第一项表示x_0项,矩阵的第一列。第二列表示训练样本的三个x值。

再来设置y = [1;2;3]

这三个数字是y轴的对应值。

现在我们设定θ为[0;1]

在我的Octave的当前路径里已经有我预先定义的代价函数J,如果打开函数的定义是下面这样的,里面有一些注释用于解释输入变量。接下来几步,设定m为训练样本的数量,因此行数为X。然后计算预测值X*theta。再下面就是计算平方误差,预测值减去y值,然后每一项进行平方。最后,就可以计算代价函数J,并且Octave知道J是要返回的值,因为J出现在了函数的定义里。

 

然后键入 J = costFunctionJ(X,y,theta)  就会计算出J = 0。

这是因为,如果数据集X为[1;2;3],y也为[1;2;3],然后设置theta_0 = 0,theta_1 = 1,这样形成的假设函数就恰好是倾斜度为45度的直线,这样就可以完美拟合数据集。而相反地,如果设置theta = [0;0],也就是theta_0 = 0,theta_1 = 0,那么这个假设预测所有的值都为0,然后再来计算代价函数。

实际上就等于1的平方(也就是第一个样本的平方误差),加上2的平方,再加上3的平方。然后除以2*m(也就是训练样本数的2倍)。

答案也是2.3333,因此这也就验证了,这里的函数计算出了正确的代价函数。至少用这几个简单的训练样本做的验证是没问题的。完整性检查证明定义的代价函数J确实是可以计算出正确的代价函数的,至少基于这里的训练集成立。也就是这里的x和y,这几个简单的训练样本。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值