Octave简介
Octave是一门类似Matlab的轻量级高级程序语言,在数值计算、统计作图等领域也有着很强大的功能。鉴于某些不可忽视的客观因素,选择学习Octave作为数学建模的语言工具。
基本语法
基本运算符
既然是用于数学领域的强大工具,首先就来了解了解这门语言对各种运算的支持。事实上,除了对数学中各种基本算术运算的支持(加减乘除,乘方,开方等),它还支持矩阵、数组运算。
运算符 | 说明 |
---|---|
+、-、* | 与数学中的运算无异,用于标量、矩阵 |
/ | 右除运算符,与数学中的除法运算无异,相当于“除以” |
\ | 左除运算符,相当于“除” |
^ | 标量、矩阵的求幂运算符 |
‘ | 矩阵转置 |
.* ./ .\ .^ .’ | 用于数组的乘法、右除、左除、求幂、转置 |
; | 分号,用于抑制显示(加上分号后的行不会显示结果到终端) |
[] | 数组声明 |
% | 注释 |
同时,还有一些特殊的变量、常量:
- ans,表示最近的计算结果
- pi,表示π
- NaN,非数字结果
- Inf,表示无穷大
变量
在Octave中,每一个变量都是一个数组或者矩阵。
平凡地,对于形如x = 3
之类的变量,它是一个1×1大小的矩阵。
变量的声明与使用与其他高级程序语言类似,此处不予赘述。
值得注意的是,可以使用who命令,显示已经使用过的所有变量名;whos命令将显示所有变量的更多信息。
格式化命令
format命令用于提高浮点数精度。比如,
- format long命令在小数点后显示16位数字;
- format short命令显示3位数字;
- format bank命令将数字四舍五入到小数点后两位
- format rat命令给出最接近计算结果的有理式。
创建向量
行向量
将元素集括在方括号中,使用空格或者逗号作为定界符。实际上,类似数组写法。
n = [1, 2, 3, 4, 5]
创建五维行向量。列向量
将元素集括在方括号中,使用分号作为定界符。
n = [1; 2; 3; 4; 5]
创建五维列向量。
创建矩阵
将元素集括在方括号中,使用空格或者逗号作为行内元素之间的定界符,使用分号作为行与行之间的定界符:
m = [1 2 3; 4 5 6; 7 8 9]
命令
这里记录的命令将用于管理会话框。
- clc,清除命令窗口
- clear,从内存中删除变量
- who/whos,列出当前所有存在的变量(详情)
- disp,显示数组或者字符串内容
- format,用于控制输出的数值格式
- input,显示提示并且等待输入
还有对向量、矩阵的命令,类似其他语言中相应数据结构的方法。
- cat,连接数组
- find,查找非零元素的索引
- max/min,返回最大元素/最小元素
- sort,对每一列进行排序
- eye,创建一个单位矩阵
- rank,计算矩阵的秩
- cross,计算矩阵叉积
- dot,计算矩阵点积
- inv,计算矩阵的逆
此外还有一些绘图命令,如axis、plot、grid等。
数据类型
一共有15种数据类型,不过常用的就那些:int8、double、logical(类似布尔)、structure(类似结构体)、char。
既然存在数据类型,就还有数据类型转换、数据类型的识别。
- char
- int2str
- …
- ischar
- isfloat
- isinteger
- isvector
以上的函数都接收参数使用。
运算符
octave提供的运算符与其他高级语言基本一致,包括算术运算符、逻辑运算符、关系运算符、按位运算符;当然也有很多独有的运算符,如
集合运算符:
- inersect(A, B) 返回A和B的交集,A、B均为数组
- setdiff(A, B) 返回A-B
- union(A, B) 返回A和B的并集
矩阵
矩阵其实就是二维数组。它的创建已经提过了;下面重点记录一下矩阵元素的引用。
矩阵元素的引用
单个元素的引用
matrix(m, n)
引用矩阵matrix第m行、第n列的元素。多个元素的引用
matrix(:, n)
引用矩阵matrix第n列的全部元素。matrix(:, m:n)
引用矩阵第m列到第n列的全部元素。
删除矩阵中的行、列
为矩阵中的行、列分配一组空的方括号,这样可以删除矩阵的整个行或者列。
a = [1 2 3 4; 5 6 7 8; 9 10 11 12];
a(4, : ) = [] % 删除矩阵a第四行的全部元素
数组
之前已经介绍过数组,这里再稍微详细地记录一下。数组在数学上表现为矩阵,一维数组就如同向量(1×n),二维数组就如同矩阵(m×n)。
特殊数组
特殊的矩阵当然需要生成API,常用的如下:
- zeros(n), 生成n阶方阵
- ones(n), 生成n阶全1方阵
- eye(n), 生成n阶单位矩阵
- rand(m, n), 生成m×n的随机数矩阵
数组操作
向已知的数组添加维度:
a = [2 3 1; 8 9 4; 8 7 5];
a(:, :, 2) = [1 2 3; 4 5 6; 7 8 9] % 表示为二维数组a添加第3维度的内容
需要注意的是,与其他高级语言不同,Octave中数组下标通常从1开始,表示向量/矩阵的第一个分量。从数学角度来看,这似乎更加符合常理(通常不称第0个分量)。
数组函数类似其他高级语言中对数组的各种处理方法,比如数组排序、变形、判空等。
单元数组
单元格数组是索引单元格的数组,每一个单元格都可以存储不同维度和数据类型的数组。
C = cell(dim1, ..., dimN)
C = cell(obj)
c = cell(2, 5);
c = {'R', 'B', 'G', 'Y', 'W'; 1 2 3 4 5}
对单元数组的元素的访问与矩阵元素的引用几乎一致。
冒号表示法
冒号:,是Octave中最有用的运算符之一,常用于
创建向量
begin: step: end
可以创建出以begin为首项、end为末项、step为步长(公差)的均匀元素组成的向量。step默认为1。下标数组
指定迭代
函数
就像其他高级语言一样,Octave也支持函数,它是完成某一功能代码的集合体。而在Octave中,函数是在单独的文件中定义的,文件名和函数名应该相同。
function [out1, out2, ...] = funcName(n1, n2, ...)
% out1, out2, ...是函数的输出参数
% n1, n2, ...是函数的输入参数
% funcName是函数名
% 函数以end作为结束符
end
在Octave中,任何一个函数文件都包含一个首先出现的必需主函数,除此之外,还可以在主函数之后定义任意数量的可选子函数,这些子函数可以互相调用。可以类比为C++中的main函数和其他自定义函数的关系。
另外,Octave支持函数的嵌套定义,即允许在一个函数体内部定义另一个函数。
如果某一个变量需要被全局共享(类似C++中的全局变量),需要在所有函数中将变量声明为全局变量——在变量名前面加上global关键字。
起源上看,西方的民主来源于古希腊时期的城邦政治,但是是把妇女等排除在外的,并不是真正的民主;中国古代体现出的思想则更加民主,比如“孟子“民贵君轻”思想,在一定程度上体现了民主思想;
另外,就制度而言,中国的民主是社会主义民主,是人人当家做主的民主,是保证了人民的权利,比如我们的人民代表大会制度;而西方是资本主义的民主,是一种更加形式上的民主,资本家们当然享有民主,但是穷人就不一样了。