Octave的基本语句及函数的使用入门—ML Note 31
本文是吴恩达《机器学习》视频笔记第31篇,对应第2周第13个视频。
“Octave Tutorial——For, while, if statements, and functions”
01
—
笔记
本节的内容,还是很简单的。如果学过C语言的,基本可以跳过了,但为了保证课程的整体性,还是把这个小文贴在专辑里。
For循环
先定义一个10*1的全0列向量。
>>v = zeros(10,1)
v =
0
0
0
0
0
0
0
0
0
0
如果我想按照一定规则对上面的向量的值进行更改,而这个更改和v的元素的位置有关,比如:
>>for i=1:10, %注意,这里的后面是个逗号
> v(i)=2^i; %2的i次方,注意前面的空格不是必须的,和python不一样
> end %for循环的结束
>>v
v =
2
4
8
16
32
64
128
256
512
1024
这里的for循环很有意思,它以for开头(循环条件的后面是个逗号),以end结尾,循环体里面是分号结尾的语句。Octave for循环的写法比较有个性。
while循环
我们通过一个while循环将上面的列向量v的前5个元素置为100.
>>i = 1;
>>while i<=5,
> v(i)=100;
> i=i+1;
> end;
>>v
v =
100
100
100
100
100
64
128
256
512
1024
上面代码可以看出,while循环比for循环麻烦一点。还有一点要注意的是,Octave中的向量元素的标号是从1开始的,不是从0开始的,这个和其它语言不一样。
另外,我们可以用break跳出循环,比如:
>>while true,
> v(i)=999;
> i = i+1;
> if i>=6,
> break;
> end;
> end;
>>
这个循环体里面如果不加break的话就是个死循环,因为循环条件一直都是true的。但是加了break之后,等i到6的时候就跳出循环。
上面的代码还用到了if语句,if的条件后面也是跟的逗号。
if语句
当然,if后面还可以跟else或者elseif,比如:
>>if v(1)==1,
> disp('value is 1');
> elseif v(1)==2,
> disp('value is 2');
> else,
> disp('value is not 1 or 2');
> end;
value is not 1 or 2
函数
怎样定义和使用函数呢?
首先呢,要先创建一个以函数名为文件名、以“.m”为扩展名的*.m文件。比如:squareThisNumber.m文件。
可以用微软的写字板打开,然后编辑为:
函数的定义方式还是比较简洁的,关键字function后面跟一个y表示函数的返回变量,squareThisNumber为函数名,后面跟着小括号里面的x表示这个函数会有一个输入值,后面的一句为函数体,函数体当然也可以很复杂。
这个时候如果我们在Octave的命令行里面调用这个函数会报错:
说我们的squareThisNumber函数没定义。是因为我们没有把刚刚定义的函数的m文件放到当前的工作路径下,只要把m文件移过去就可以了。
用pwd命令看一下工作路径,然后把m文件移动过去即可。
还有一种办法,就是用命令把我们存放函数文件的路径加到Octave的搜索路径中,如下图。
另外一种办法,是用cd命令将Octave的工作路径改为函数文件的存放路径。
Octave返回两个值的函数
很多计算机语言要想让函数返回多个值是很麻烦的,但是Octave就方便了。
方法是:
调用也很简单:
一个复杂一点的函数的例子
假设我们在二维直角坐标系中有三个点,(1,1)、(2,2)、(3,3)。
我们用一个直线去拟合这三个点,直线的方程为:
我们给定一组theta,就可以算出预测值,然后根据预测值和真实值的方差,即Cost函数。
那我们先来定义设计矩阵,上面的y的式子中theta1的x_0是1,所以设计矩阵X为:
>>X=[1 1; 1 2; 1 3]
X =
1 1
1 2
1 3
y为训练数据的实际值:
>>y=[1;2;3]
y =
1
2
3
我们任意设置一个系数向量theta,然后计算这个theta向量对应的cost函数。假设:
>>theta=[0;2]
theta =
0
2
所以cost函数定义为costFunctionJ,如下:
然后,调用这个函数算一下,得出cost函数的值:
如果改一下theta,又可以得到不一样的cost值。
好了,Octave的基本语句和函数的使用就介绍到这里,下一个视频是第二周的最后一个视频,将介绍Octave中的矢量。
- 安装nginx出现的问题
- 18.11 LVS DR模式搭建
- Linux基础(day64)
- 我的WCF之旅(9):如何在WCF中使用tcpTrace来进行Soap Trace
- 物联网设备已沦陷,咖啡机也不能例外
- 我的WCF之旅(13):创建基于MSMQ的Responsive Service
- 开发自己的Data Access Application Block[上篇]
- 18.9/18.10 LVS NAT模式搭建
- 谈谈WCF中的Data Contract (1):Data Contract Overview
- Linux基础(day66)
- 字符串的驻留(String Interning)
- 19.5 忘记Admin密码如何做
- 19.3/19.4/19.6 安装zabbix
- 欲火焚身,心静则凉--只靠冲动是不能长久地
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法