在之前的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; 

Oct1.png

另外我们也可以通过设置索引-indices的方式来代替 1 : 10,比如我可以:

indices = 1 : 10;
for i = indices,
    v(i) = 2 ^ i;
end; 

这和之前的程序的结果是一样的:

Oct2.png

如果你对 “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; 

其结果也和我们预想的一样:

Oct3.png

同样我们也可以用上break语句:

i = 1;
while true,
    v(i) = 100;
    i = i + 1;
    if(i == 6),
        break;
    end;
end;

结果也是一样的:

Oct4.png

所以这就是 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:

Oct5.png

最后提醒一件事,如果你需要退出 Octave 你可以键入 exit 命令然后敲击回车就会退出 Octave,命令 quit 也有一样的效果。

函数调用

下面让我们来看看Octave中的函数是如何定义和调用的。 实现在我的文件夹里存储了一个文件名为“squareThisNumber.m” 的文件,这就是在 Octave 环境下定义的函数,其以 .m 的后缀结尾,让我们用写字板打开这个程序,其内容为:

Oct7.png

代表了我这个函数要读入一个参数 x ,返回值是 y 其值等于 x^2.

如果这时我们直接调用这个函数 SquareThisNumber(5)是行不通的,Octave 会说这个方程未被定义,这是因为 Octave 不知道在哪里找这个文件。所以我们要先通过cd更改文件目录,这时 SquareThisNumber(5) 的返回值是25:

Oct6.png

还有一种更高级的功能,我们可以使用 addpath 命令添加路径 添加路径 “C:\Users\84293\Desktop\data” 将该目录添加到 Octave 的搜索路径,这样即使你跑到其他路径底下进行操作 Octave依然知道会在 Users\84293\Desktop\data 目录下寻找函数:

Oct8.png

Octave 还有一个其他许多编程语言都没有的概念,那就是它可以允许你定义一个函数,其返回值是多个值或多个参数。举个例子定义一个函数叫 “squareAndCubeThisNumber(x)” (x的平方以及x的立方):

Oct10.png

这说的就是,函数返回值是两个数- y1 和 y2 分别数是 x 被平方后的数和被立方后的结果。然后我们在Octave中使用命令 [a,b] = squareAndCubeThisNumber(5),就得到了我们想要的结果:

Oct9.png

最后我们来看一个更复杂一点的函数的例子,假设有如下数据集[1,1], [2,2], [3,3]:

Oct11.png

我们要定义一个Octave函数来计算对于不同 θ 取值的代价函数J(θ)。首先让我们把数据放到 Octave 里,设置矩阵 X = [1 1; 1 2; 1 3]; 在我们设计的矩阵 X 中第一列表示x0项(恒为1),第二列表示我的三个训练样本的 x 值,现在我再来设置向量 y 其值为训练样本中的有值 [1; 2; 3],现在我们设定 θ 为 [0;1]。

这样数据就准备好了,现在我的文件夹里已经有我预定义的代价函数 J 其函数的定义是这样的:

Oct12.png

我们来理解一下函数内容,先设定 m 为训练样本的数量也就是 X 的行数,然后计算预测值 predictions = X * theta ,下面就是计算平方误差公式就是预测值减去 y 值然后每一项进行平方,最后计算代价函数 J 并且返回 J的值就可以了。

在 Octave 里运行时,我们通过更改 θ 的值为[0;1],[0;0]之类的,可以得到不同直线对应的代价函数的值:

Oct13.png

还是非常方便的。

结语

通过这篇BLOG,相信你已经掌握如何在 Octave 环境下写出正确的控制语句以及如何定义和使用函数。而Octave的使用讲到这就结束了。最后喜欢你喜欢这个系列,喜欢这篇BLOG!

Last modification:March 4th, 2021 at 03:44 am
If you think my article is useful to you, please feel free to appreciate