在之前的BLOG中,我们重点学习了Octave中的一些算术运算和系统自带的函数。这次我们将要打开结构化程序设计的大门,探寻Octave中的控制语句及函数调用的使用方法。
控制语句
何谓控制语句?我们称诸如 "for" "while" "if" 这些语句为控制语句。下面就让我们逐一进行讲解。
for循环
我们先来一起看看如何使用 “for” 循环。若从 a 到 b 循环,则其语法结构是
for i = a : b,
do somthing;
…………;
end;
比如,我要设值一个含有 10 个元素的向量的 v 的值,第 i 个元素等于 2 的 i 次方,我只要:
for i = 1 : 10,
v(i) = 2 ^ i;
end;
另外我们也可以通过设置索引-indices的方式来代替 1 : 10,比如我可以:
indices = 1 : 10;
for i = indices,
v(i) = 2 ^ i;
end;
这和之前的程序的结果是一样的:
如果你对 “break” 和 “continue” 语句比较熟悉的话,其实Octave里也有 “break” 和 “continue” 语句,你也可以在 Octave环境里,使用这些语句。
while循环
接下来我们来看看一个 while 循环是如何工作的,其语法结构是:
while 发生条件,
do somthing;
…………;
end;
让我们举个例子,用回上一个例子中的 v 向量。我们想要向量的前五个元素用100替换掉,我们就可以这样写:
i = 1;
while i <= 5,
v(i) = 100;
i = i + 1;
end;
其结果也和我们预想的一样:
同样我们也可以用上break语句:
i = 1;
while true,
v(i) = 100;
i = i + 1;
if(i == 6),
break;
end;
end;
结果也是一样的:
所以这就是 while 语句的句法结构,并且要注意要有end,这里是有两个 end ,其中第一个 end 结束的是 if 语句,第二个 end 结束的是 while 语句。
if-else 语句
接下来让我们看看 if-else 语句吧, 其句法结构为:
if(条件语句),
do something;
elseif(条件语句),
do something;
elseif(条件语句),
do something;
…………
else
do something;
举个例子,我们先设v(1) 等于999,然后
if(v(1) == 1),
disp('one');
elseif(v(1) == 2),
disp('two');
else
disp('other');
end;
其输出结果就为other:
最后提醒一件事,如果你需要退出 Octave 你可以键入 exit
命令然后敲击回车就会退出 Octave,命令 quit
也有一样的效果。
函数调用
下面让我们来看看Octave中的函数是如何定义和调用的。 实现在我的文件夹里存储了一个文件名为“squareThisNumber.m” 的文件,这就是在 Octave 环境下定义的函数,其以 .m 的后缀结尾,让我们用写字板打开这个程序,其内容为:
代表了我这个函数要读入一个参数 x ,返回值是 y 其值等于 x^2.
如果这时我们直接调用这个函数 SquareThisNumber(5)是行不通的,Octave 会说这个方程未被定义,这是因为 Octave 不知道在哪里找这个文件。所以我们要先通过cd更改文件目录,这时 SquareThisNumber(5) 的返回值是25:
还有一种更高级的功能,我们可以使用 addpath 命令添加路径 添加路径 “C:\Users\84293\Desktop\data” 将该目录添加到 Octave 的搜索路径,这样即使你跑到其他路径底下进行操作 Octave依然知道会在 Users\84293\Desktop\data 目录下寻找函数:
Octave 还有一个其他许多编程语言都没有的概念,那就是它可以允许你定义一个函数,其返回值是多个值或多个参数。举个例子定义一个函数叫 “squareAndCubeThisNumber(x)” (x的平方以及x的立方):
这说的就是,函数返回值是两个数- y1 和 y2 分别数是 x 被平方后的数和被立方后的结果。然后我们在Octave中使用命令 [a,b] = squareAndCubeThisNumber(5)
,就得到了我们想要的结果:
最后我们来看一个更复杂一点的函数的例子,假设有如下数据集[1,1], [2,2], [3,3]:
我们要定义一个Octave函数来计算对于不同 θ 取值的代价函数J(θ)。首先让我们把数据放到 Octave 里,设置矩阵 X = [1 1; 1 2; 1 3]; 在我们设计的矩阵 X 中第一列表示x0项(恒为1),第二列表示我的三个训练样本的 x 值,现在我再来设置向量 y 其值为训练样本中的有值 [1; 2; 3],现在我们设定 θ 为 [0;1]。
这样数据就准备好了,现在我的文件夹里已经有我预定义的代价函数 J 其函数的定义是这样的:
我们来理解一下函数内容,先设定 m 为训练样本的数量也就是 X 的行数,然后计算预测值 predictions = X * theta
,下面就是计算平方误差公式就是预测值减去 y 值然后每一项进行平方,最后计算代价函数 J 并且返回 J的值就可以了。
在 Octave 里运行时,我们通过更改 θ 的值为[0;1],[0;0]之类的,可以得到不同直线对应的代价函数的值:
还是非常方便的。
结语
通过这篇BLOG,相信你已经掌握如何在 Octave 环境下写出正确的控制语句以及如何定义和使用函数。而Octave的使用讲到这就结束了。最后喜欢你喜欢这个系列,喜欢这篇BLOG!