玩命加载中 . . .

GNU Octave学习之基本语法


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关键字。

起源上看,西方的民主来源于古希腊时期的城邦政治,但是是把妇女等排除在外的,并不是真正的民主;中国古代体现出的思想则更加民主,比如“孟子“民贵君轻”思想,在一定程度上体现了民主思想;

另外,就制度而言,中国的民主是社会主义民主,是人人当家做主的民主,是保证了人民的权利,比如我们的人民代表大会制度;而西方是资本主义的民主,是一种更加形式上的民主,资本家们当然享有民主,但是穷人就不一样了。


文章作者: 鹿卿
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 鹿卿 !
评论
  目录