Octave 编程教程/向量和矩阵
以下是我们在 Octave 中指定行向量的示例
octave:1> x = [1, 3, 2] x = 1 3 2
请注意
- 向量用方括号括起来;
- 每个元素之间用可选的逗号分隔。
x = [1 3 2]会产生相同的行向量。
要指定列向量,只需将逗号替换为分号
octave:2> x = [1; 3; 2] x = 1 3 2
由此可见,我们使用逗号移动到向量(或矩阵)的下一列,并使用分号移动到下一行。因此,要指定矩阵,请键入行(用逗号分隔每个元素),并使用分号移动到下一行。
octave:3> A = [1, 1, 2; 3, 5, 8; 13, 21, 34] A = 1 1 2 3 5 8 13 21 34
可以使用标准运算符来
- 加(
+), - 减(
-),以及 - 乘(
*)
矩阵、向量和标量。请注意,这些运算符要起作用,矩阵需要具有匹配的维数(在乘法情况下,是内部维数)。
- 转置运算符是单引号:
'。继续上一节的示例,
octave:4> A' ans = 1 3 13 1 5 21 2 8 34
(注意:这实际上是复共轭转置运算符,但对于实矩阵,这与转置相同。要计算复矩阵的转置,请使用点转置 (.') 运算符。)
- 幂运算符 (
^) 也可以用于计算方阵的实幂。
当您有两个相同大小的矩阵时,可以对它们执行逐元素运算。例如,以下代码将A中的每个元素除以B中的对应元素
octave:1> A = [1, 6, 3; 2, 7, 4] A = 1 6 3 2 7 4 octave:2> B = [2, 7, 2; 7, 3, 9] B = 2 7 2 7 3 9 octave:3> A ./ B ans = 0.50000 0.85714 1.50000 0.28571 2.33333 0.44444
请注意,您使用点除 (./) 运算符来执行逐元素除法。还有类似的运算符用于乘法 (.*) 和幂运算 (.^)。
让我们引入一个标量供将来使用。
a = 5;
点除运算符还可以与标量一起以以下方式使用。
C = a ./ B
返回一个矩阵C,其中每个条目由下式定义
即a被B中的每个条目除。类似地
C = a .^ B
返回一个矩阵,其中
您可以通过索引来处理矩阵和向量的部分内容。您使用一个整数向量来告诉 Octave 使用向量或矩阵的哪些元素。例如,我们创建一个向量
octave:1> x = [1.2, 5, 7.6, 3, 8] x = 1.2000 5.0000 7.6000 3.0000 8.0000
现在,要查看x的第二个元素,请输入
octave:2> x(2) ans = 5
您还可以按如下方式查看元素列表。
octave:3> x([1, 3, 4]) ans = 1.2000 7.6000 3.0000
最后一个命令显示了向量x的第 1、3 和 4 个元素。
要从矩阵中选择行和列,我们使用相同的原理。让我们定义一个矩阵
octave:4> A = [1, 2, 3; 4, 5, 6; 7, 8, 9] A = 1 2 3 4 5 6 7 8 9
并选择第 1 行和第 3 行以及第 2 列和第 3 列
octave:5> A([1, 3], [2, 3]) ans = 2 3 8 9
冒号运算符 (:) 可用于从矩阵中选择所有行或列。因此,要选择第 2 行中的所有元素,请输入
octave:6> A(2, :) ans = 4 5 6
您也可以像这样使用: 来选择所有矩阵元素
octave:7> A(:,:) ans = 1 2 3 4 5 6 7 8 9
我们还可以从矩阵中选择一系列行或列。我们使用以下方法指定范围
start:step:stop
您实际上可以在 Octave 提示符下键入范围以查看结果。例如,
octave:3> 1:3:10 ans = 1 4 7 10
第一个显示的数字是start,第二个是start + step,第三个是start + (2 * step)。最后一个数字小于或等于stop。
通常,您只需将步长设置为 1。在这种情况下,您可以省略步长参数并键入
octave:4> 1:10 ans = 1 2 3 4 5 6 7 8 9 10
如您所见,范围命令的结果只是一个整数向量。我们现在可以使用它来索引向量或矩阵。要选择A左上角的 子矩阵,请使用
octave:4> A(1:2, 1:2) ans = 1 2 4 5
最后,有一个名为end的关键字,它可以在索引矩阵或向量时使用。它指的是行或列中的最后一个元素。例如,要查看矩阵的最后一列,可以使用
octave:5> A(:,end) ans = 3 6 9
以下函数可用于创建和操作矩阵。
tril(A)返回A的下三角部分。
triu(A)返回A的上三角部分。
eye(n)返回 单位矩阵。您还可以使用eye(m, n)来返回 矩形单位矩阵。
ones(m, n)返回一个 矩阵,其中所有元素均为 1。类似地,ones(n)返回一个 方阵。
zeros(m, n)返回一个 矩阵,其中所有元素均为 0。类似地,zeros(n)返回一个 方阵。
rand(m, n)返回一个 矩阵,其中元素是从 范围内均匀随机生成的。类似地,rand(n)返回一个 方阵。
randn(m, n)返回一个 矩阵,其中元素是正态分布的随机数。
randperm(n)返回一个行向量,包含数字 的随机排列。
diag(x)或diag(A)。对于向量 x,此函数返回一个方阵,对角线上为 x 的元素,其他位置为 0。对于矩阵 A,此函数返回一个向量,包含 A 的对角线元素。例如,
octave:16> A = [1, 2, 3; 4, 5, 6; 7, 8, 9] A = 1 2 3 4 5 6 7 8 9 octave:17> x = diag(A) ans = 1 5 9 octave:18> diag(x) ans = 1 0 0 0 5 0 0 0 9
linspace(a, b, n)返回一个包含 n 个值的向量,第一个元素等于 a,最后一个元素等于 b,相邻元素之间的差值恒定。最后一个参数 n 是可选的,默认值为 100。
octave:186> linspace(2, 4, 2) ans = 2 4 octave:187> linspace(2, 4, 4) ans = 2.0000 2.6667 3.3333 4.0000 octave:188> linspace(2, 4, 6) ans = 2.0000 2.4000 2.8000 3.2000 3.6000 4.0000
logspace(a, b, n)返回一个包含 n 个值的向量,第一个元素等于 ,最后一个元素等于 ,相邻元素之间的比率恒定。最后一个参数 n 是可选的,默认值为 50。
octave:189> logspace(2, 4, 2)
ans =
100 10000
octave:190> logspace(2, 4, 4)
ans =
1.0000e+02 4.6416e+02 2.1544e+03 1.0000e+04
octave:191> logspace(2, 4, 5)
ans =
1.0000e+02 3.1623e+02 1.0000e+03 3.1623e+03 1.0000e+04
还有一些创建特殊矩阵的函数,如下所示:
hankel(汉克尔矩阵)hilb(希尔伯特矩阵)invhilb(希尔伯特矩阵的逆矩阵)sylvester_matrix(西尔维斯特矩阵) - 在 v3.8.1 版本中,有一个警告:sylvester_matrix 已过时,将在未来版本的 Octave 中移除;请使用 hadamard(2^k) 代替。toeplitz(托普利兹矩阵)vander(范德蒙德矩阵)
使用 help 命令可以获取有关如何使用这些函数的更多信息。
fliplr(A)返回矩阵 A 的副本,其中列的顺序反转,例如,
octave:49> A = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12] A = 1 2 3 4 5 6 7 8 9 10 11 12 octave:50> fliplr(A) ans = 4 3 2 1 8 7 6 5 12 11 10 9
flipud(A)返回矩阵 A 的副本,其中行的顺序反转,例如,
octave:51> flipud(A) ans = 9 10 11 12 5 6 7 8 1 2 3 4
rot90(A, n)返回矩阵 A 的副本,该副本已逆时针旋转 (90n)°。第二个参数 是可选的,默认值为 1,可以为负值。
octave:52> rot90(A) ans = 4 8 12 3 7 11 2 6 10 1 5 9
reshape(A, m, n)创建一个 矩阵,其元素取自 A。A 中的元素数量必须等于 。元素从 A 中按列优先顺序获取,这意味着第一列中的值()首先被读取,然后是第二列(),等等。
octave:53> reshape(A, 2, 6) ans = 1 9 6 3 11 8 5 2 10 7 4 12
sort(x)返回向量 x 的副本,其中元素按升序排序。
octave:54> x = rand(1, 6) x = 0.25500 0.33525 0.26586 0.92658 0.68799 0.69682 octave:55> sort(x) ans = 0.25500 0.26586 0.33525 0.68799 0.69682 0.92658
有关更多可用于操作向量和矩阵、查找特征值等的运算符和函数的描述,请参见 线性代数 部分。