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
有关更多可用于操作向量和矩阵、查找特征值等的运算符和函数的描述,请参见 线性代数 部分。