与很多高级语言不同,Octave中的变量的类型是不用声明的。
Octave 所有的变量都是浮点型或者字符串
ans 即为Octave中的一个变量,用于存储每次最近运算的结果,这个变量可以想普通变量一样使用
Octave 中的变量名区分大小写
Octave本身已经定义了一些变量,如 pi , sin,cos ,i,j 等,Octave允许逆重更新定义这些内置变量,但是不提倡
若需要查看某个变量的值,输入其变量名并回车即可;若想要查看当前命令名或者使用的函数名和变量名,输入 who命令
若想要从当前的变量空间中删除某个变量,clear命令能移除所有的变量,clear name 移除名为 name 的某个变量
>> deg = pi/180
deg = 0.017453
>> 3
ans = 3
>> new = 2 *ans
new = 6
>>new
new = 6
>>who
Variables visible from the current scope:
ans deg new
>>clear deg
>>who
Variables visible from the current scope:
ans new
>>clear
>>who
>>
Octave中的数值,和计算机中存储的数值一样,事宜二进制的形式二不是以十进制的形式存储的
Octave通常只显示一定的有效数字,format 命令能选择数值显示的不同方式,
format long 将让 octave 以 15 位的有效数字显示数值,这也是 octave 程序本身的计算精度。format short将让 octave 以默认的方式显示数值Octave 使用科学记数法来表达数值很大或者很小的数字,例如 13142*.6 = 1.*31426 × 104, 而在 Octave 中 这个科学数值被显示为 1.3143e+04,这样的数值输入形式也同样能被 Octave 认可
能被 Octave 识别并计算的数据形式还有:
>> deg = pi/180
deg = 0.017453
>> format long
>> deg
deg = 1.745329251994330e-02
>>format short
>>deg
deg = 0.017453
>> 3+4i
ans = 3 + 4i
>> 3/0
ans = Inf
>>0/0
ans = NaN
在编程语言中一组数据通常被称为数组 (array)。在 Octave 中
这样的概念被称为向量 (vector),而向量本身也是矩阵类数据的一个特例——只有一行或者一列的矩阵分别 为行向量 (· · ·) 或者列向量 (… .)
构造矩阵或者向量的方法有很多。其中最直接简单的方法就是在一个方括号 [] 中给出其元素
在方括号中由空格或者逗号隔开的一组数据被定义为行向量; 而由分号或者回车隔开的一组数据被定义为列向量
可以通过已经定义的向量来定义新的向量
>> a = [1 4 5]
a =
1 4 5
>> a =[1,4,5]
a =
1 4 5
>> b =[1;4;5]
b =
1
4
5
>> c= [a,6]
c =
1 4 5 6
冒号表达式的规则是告诉 octave 创建一个以第一个数字开始并以一递增至第二个数的向量。在第一和第 二个数之间可以插入第三个参数来声明向量中元素之间的递增量,形如 a : b : c。
如果向量中的增量不是恰好达到尾数,octave 将产生不超过尾数的一组向量。增量可以是 负数并相应产生有一个递减的向量。
>> e = 2:6
e =
2 3 4 5 6
>> e = 2:2:8
e =
2 4 6 8
>> e = 2:3:7
e =
2 5
>>
| 函数 | 作用 |
|---|---|
| zeros(M,N) | 创建一个 M×N 的零矩阵 |
| ones(M,N) | 创建一个 M×N 的全1矩阵 |
| linspace(x1,x2,N) | 创建一个 N 个元素的向量, 均匀分布于 x1 和x2 |
| logspace(x1,x2,N) | 创建一个 N 个元素的向量,指数分布与10的x1次方 和 10的x2 次方之间 |
其中 zeros 和 ones 适用于向量和矩阵,而这两个函数的参数,M 和 N,分别指定矩阵的行数和列数
zeros(2,3)
ans =
0 0 0
0 0 0
>> ones(2,3)
ans =
1 1 1
1 1 1
>> linspace(1,10,5)
ans =
1.0000 3.2500 5.5000 7.7500 10.0000
>> logspace(1,2,5)
ans =
10.000 17.783 31.623 56.234 100.000
>>
向量中的元素通过括号 (),而第一个元素的编号为 1, 而不是像 C 或者 C++ 那样从 0 开始
通过以下命令 v(i) 访问到该向量的第i个元素
冒号的表示法同样可以用于声明向量中的元素的范围
v(m:n):得到向量中元素编号为[m,n]范围中的所有元素v(m:s:n):得到向量中元素编号为[m,n]范围中每隔s个元素的所有元素>> v = [1:2:6 0 -1]
v =
1 3 5 0 -1
>> v(2)
ans = 3
>> v(2:4)
ans =
3 5 0
>> v(2:2:5)
ans =
3 0
>>
向量中每个都乘(除)以一个数可以通过对该向量乘(除)以一个数来实现,也可以使用 for 循 环来实现,但是 Octave 向量操作方式更简单
使用 +− 算符,你同样可以对该向量中的每个元素都加 上或者减去一个数值。
两个向量的相乘遵循矩阵的乘法法则,向量乘法并不并不是对应元素的相乘。如果要进行对应元素的乘除法, 你可以使用* /算符,注意每个算符前的.表示为一个元素对元素的计算
逐个元素的乘方计算同样也很有用。该计算的算符为 ^
只要两个向量有相同的大小和形状,它们就可以进行元素之间的 加减乘除和乘方运算。
> a = [1:5]
a =
1 2 3 4 5
>> a*2
ans =
2 4 6 8 10
>> a/2
ans =
0.5000 1.0000 1.5000 2.0000 2.5000
>> b = [2:6]
b =
2 3 4 5 6
>> a.*b
ans =
2 6 12 20 30
>> v.+a
warning: the '.+' operator was deprecated in version 7 and will not be allowed in a future versi
on of Octave; please use '+' instead
ans =
3 5 7 9 11
>> a.^2
ans =
1 4 9 16 25
>> a.^b
ans =
1 8 81 1024 15625
>>
>> A =[5 7 9
-1 3 -2]
A =
5 7 9
-1 3 -2
>> B =[1 2;3 4;5 6]
B =
1 2
3 4
5 6
>> C = [1:3;8:-2:4]
C =
1 2 3
8 6 4
>> D =[1 2 3];
>> D =[D;4 5 6];
>> D =[D;7 8 9]
D =
1 2 3
4 5 6
7 8 9
>>
矩阵乘法必需满足一定的矩阵大小规则,一般地,在矩阵乘法中, 矩阵大小为 (l × m) ∗ (m × n) → (l × n)
矩阵的乘法用 * 表示
方阵还可以使用矩阵乘方计算
其中 A2 = A ∗ A。而对于矩阵中每个元素的相乘,则使用.* 算符。除法和乘方的元素之间的计算以此类推。
>> A*B
ans =
71 92
-2 -2
>> A*C
error: operator *: nonconformant arguments (op1 is 2x3, op2 is 2x3)
>> A =[1 2;1 2]
A =
1 2
1 2
>> A^2
ans =
3 6
3 6
>> A =[1 2;1 2]
A =
1 2
1 2
>> B = [1 2; 3 4]
B =
1 2
3 4
>> A.*B
ans =
1 4
3 8
>>
一个向量的转置将其由行向量转为列向量或者由列向量转换为行向量。矩阵的转置将其行和列交换。
在 数学上,矩阵 A 的转置表示为 AT。在 octave 中转置操作用上引号 ' 实现
>> A = [1 2 3;4 5 6]
A =
1 2 3
4 5 6
>> A'
ans =
1 4
2 5
3 6
>>
ones 和 zeros 这两个创建全 1 和 全 0 的矩阵
单位矩阵:(除了主对角线上元素为1,其他元素都为0)任何矩阵与该矩阵相乘结果不变。在数学上通常用 I 来表示单位矩阵。Octave 中使用 eye 矩阵来创建单位矩阵,该函数要求一个输入参数
对角矩阵:(除了主对角线上元素不为0,其他元素都为0)diag 函数来创建这样的矩阵,输入参数为该对角矩阵的对角元向量:
diag 的功能很强大,如果对一个矩阵使用该函数,该函数将返回该矩阵的对角元
要创建一个空矩阵来向其中添加矩阵元。定义这样的矩阵用方括号实现
>> A = ones(2,3)
A =
1 1 1
1 1 1
>> A = zeros(2,3)
A =
0 0 0
0 0 0
>> I = eye(3)
I =
Diagonal Matrix
1 0 0
0 1 0
0 0 1
>> A = diag([1 3 5])
A =
Diagonal Matrix
1 0 0
0 3 0
0 0 5
>> A = [1 2 3;4 5 6;7 8 9]
A =
1 2 3
4 5 6
7 8 9
>> diag(A)
ans =
1
5
9
>> E = []
E = [](0x0)
>>
若需要用一些小矩阵来创建一个复合矩阵,你只需要注意各个子矩阵的行列数的匹配。
>> A = [1 2 3 ;4 5 6]
A =
1 2 3
4 5 6
>> B = [2 0;0 -1;1 0]
B =
2 0
0 -1
1 0
>> copm = [eye(3) B;A zeros(2,2)]
copm =
1 0 0 2 0
0 1 0 0 -1
0 0 1 1 0
1 2 3 0 0
4 5 6 0 0
>>
引用矩阵中的元素与向量中的操作一样,使用括号 ()。对于矩阵,你需要指定其行号和列号
其中冒号用来指定元素的的范围,单独使用该符号表示整行或者整列
这样的表达式同样可以用于矩阵元的赋值
>> A = [1:3;4:6;7:9]
A =
1 2 3
4 5 6
7 8 9
>> A(1,1)
ans = 1
>> A(2,3)
ans = 6
>> A(1:2,3)
ans =
3
6
>> A(2,:)
ans =
4 5 6
>> A(3,2:3)=[-1 0]
A =
1 2 3
4 5 6
7 -1 0
>>
| 函数名 | 作用 |
|---|---|
| eye(N) | 创建一个NxN 的单位矩阵 |
| zeros(M,N) | 创建一个 M×N 的全零矩阵 |
| ones(M,N) | 创建一个 M×N 的全1矩阵 |
| rand(M,N) | 创建一个 M×N 的随机数矩阵 |
| diag([对角元元素]) / diag(A) | 创建一个对角矩阵/提取A 矩阵的对角元 |
| inv(A) | 求矩阵A的逆矩阵 |
| det(A) | 求矩阵A的行列式 |
| trace(A) | 求矩阵A的迹(主对角线元素之和) |
| eig(A) | 求矩阵A的特征向量和特征值 |
| rank(A) | 求矩阵A的秩 |
| null(A) | 计算矩阵的度空间的一组基 |
| rref(A) | 对增广矩阵进行高斯消去 |
| lu(A) | 计算矩阵的 LU分解 |
| qr(A) | 计算矩阵的 QR分解 |
| svd(A) | 计算矩阵的SVD |
| pinv(A) | 计算矩阵的伪逆 |