16.2 重新排列矩阵

 
B = fliplr (A)

将数组左右翻转。

返回 A 的副本,其中列的顺序被颠倒。换句话说,A 围绕垂直轴左右翻转。例如:

fliplr ([1, 2; 3, 4])
     ⇒   2  1
         4  3

另请参阅: flipud, flip, rot90, rotdim.

 
B = flipud (A)

将数组上下翻转。

返回 A 的副本,其中行的顺序被颠倒。换句话说,A 围绕水平轴上下翻转。例如:

flipud ([1, 2; 3, 4])
     ⇒   3  4
         1  2

另请参阅: fliplr, flip, rot90, rotdim.

 
B = flip (A)
B = flip (A, dim)

返回数组 A 沿维度 dim 翻转后的副本。

如果未指定 dim,则默认为第一个非单一维度。

示例:

## 行向量
flip ([1  2  3  4])
      ⇒   4  3  2  1

## 列向量
flip ([1; 2; 3; 4])
      ⇒   4
          3
          2
          1

## 沿维度 1 翻转二维矩阵
flip ([1 2; 3 4])
      ⇒   3  4
          1  2

## 沿维度 2 翻转二维矩阵
flip ([1 2; 3 4], 2)
      ⇒   2  1
          4  3

另请参阅: fliplr, flipud, rot90, rotdim, permute, transpose.

 
B = rot90 (A)
B = rot90 (A, k)

将数组按 90 度增量旋转。

返回 A 的副本,其中元素以 90 度增量的逆时针方向旋转。

第二个参数是可选的,指定要应用多少个 90 度旋转(默认值为 1)。k 为负值时,则按顺时针方向旋转矩阵。例如:

rot90 ([1, 2; 3, 4], -1)
    ⇒   3  1
        4  2

将给定矩阵顺时针旋转 90 度。以下语句都是等价的:

rot90 ([1, 2; 3, 4], -1)
rot90 ([1, 2; 3, 4], 3)
rot90 ([1, 2; 3, 4], 7)

旋转总是在前两个维度(即行和列)构成的平面上进行。要在其他平面上执行旋转,请使用 rotdim

另请参阅: rotdim, fliplr, flipud, flip.

 
B = rotdim (A)
B = rotdim (A, n)
B = rotdim (A, n, plane)

返回 A 的副本,其中元素以 90 度增量逆时针旋转。

第二个参数 n 是可选的,指定要应用的 90 度旋转次数(默认值为 1)。如果 n 为负值,则按顺时针方向旋转矩阵。

第三个参数也是可选的,用于定义旋转的平面。如果存在,plane 是一个包含矩阵两个不同有效维度的二元向量。如果未给出 plane,则使用前两个非单一维度。

例如:

rotdim ([1, 2; 3, 4], -1, [1, 2])
     ⇒   3  1
         4  2

将给定矩阵顺时针旋转 90 度。以下语句都是等价的:

rotdim ([1, 2; 3, 4], -1, [1, 2])
rotdim ([1, 2; 3, 4], 3, [1, 2])
rotdim ([1, 2; 3, 4], 7, [1, 2])

另请参阅: rot90, fliplr, flipud, flip.

 
A = cat (dim, array1, array2, …, arrayN)

将 N 维数组对象 array1, array2, …, arrayN 沿维度 dim 连接起来并返回结果。

A = ones (2, 2);
B = zeros (2, 2);
cat (2, A, B)
  ⇒   1 1 0 0
      1 1 0 0

或者,我们也可以按以下方式沿第二维度连接 AB

[A, B]

dim 可以大于 N 维数组对象的维度,因此结果将具有 dim 个维度,如下例所示:

cat (4, ones (2, 2), zeros (2, 2))
  ⇒   ans(:,:,1,1) =

       1 1
       1 1

     ans(:,:,1,2) =

       0 0
       0 0

另请参阅: horzcat, vertcat.

 
A = horzcat (array1, array2, …, arrayN)

将 N 维数组对象 array1, array2, …, arrayN 沿维度 2 进行水平连接并返回结果。

数组也可以使用创建新矩阵的语法进行水平连接。例如:

A = [ array1, array2, ... ]

这种语法效率略高,因为 Octave 解析器可以在没有函数调用开销的情况下连接数组。

另请参阅: cat, vertcat.

 
A = vertcat (array1, array2, …, arrayN)

将 N 维数组对象 array1, array2, …, arrayN 沿维度 1 进行垂直连接并返回结果。

数组也可以使用创建新矩阵的语法进行垂直连接。例如:

A = [ array1; array2; ... ]

这种语法效率略高,因为 Octave 解析器可以在没有函数调用开销的情况下连接数组。

另请参阅: cat, horzcat.

 
B = permute (A, perm)

返回 N 维数组对象 A 的广义转置。

排列向量 perm 必须包含元素 1:ndims (A) (按任意顺序,但每个元素只能出现一次)。A 的第 N 个维度被重新映射到维度 PERM(N)。例如:

x = zeros ([2, 3, 5, 7]);
size (x)
   ⇒   2   3   5   7

size (permute (x, [2, 1, 3, 4]))
   ⇒   3   2   5   7

size (permute (x, [1, 3, 4, 2]))
   ⇒   2   5   7   3

## 恒等排列
size (permute (x, [1, 2, 3, 4]))
   ⇒   2   3   5   7

另请参阅: ipermute.

 
A = ipermute (B, iperm)

permute 函数的逆运算。

表达式

ipermute (permute (A, perm), perm)

返回原始数组 A

另请参阅: permute.

 
B = reshape (A, m, n, …)
B = reshape (A, [m n …])
B = reshape (A, …, [], …)
B = reshape (A, size)

返回一个具有指定维度(m, n, …)的矩阵,其元素取自矩阵 A

矩阵的元素按列主序访问(就像 Fortran 数组的存储方式一样)。

以下代码演示了将 1x4 行向量重塑为 2x2 方阵:

reshape ([1, 2, 3, 4], 2, 2)
      ⇒   1  3
          2  4

请注意,原始矩阵中的元素总数(prod (size (A)))必须与新矩阵中的元素总数(prod ([m n …]))相匹配。

返回矩阵的单个维度可以留空不指定,Octave 会自动确定其大小。空矩阵([])用于标记未指定的维度。

另请参阅: resize, vec, postpad, cat, squeeze.

 
B = resize (A, m)
B = resize (A, m, n, …)
B = resize (A, [m n …])

调整 A 的大小,必要时截断元素。

在结果中,如果某个索引在 A 的范围内,则该索引对应的元素等于 A 中的对应值;否则,该元素被设置为零。

换句话说,语句

B = resize (A, dv)

等价于以下代码:

B = zeros (dv, class (A));
sz = min (dv, size (A));
for i = 1:length (sz)
  idx{i} = 1:sz(i);
endfor
B(idx{:}) = A(idx{:});

但执行效率更高。

如果只提供了 m 且它是一个标量,则结果的维度为 m×m。如果 m, n, … 都是标量,则结果的维度为 m×n×...。如果给定一个向量作为输入,则结果的维度由该向量的元素给出。

一个对象可以被调整到比其当前维度更多的维度;在这种情况下,缺失的维度被假定为 1。将对象调整到更少的维度是不可能的。

另请参阅: reshape, postpad, prepad, cat.

 
y = circshift (x, n)
y = circshift (x, n, dim)

循环移位数组 x 的值。

n 必须是一个整数向量,其长度不超过 x 的维度数。n 的值可以是正数或负数,这决定了 x 值的移位方向。如果 n 的某个元素为零,则 x 的对应维度不会被移位。如果 n 是标量且未指定 dim,则移位应用于第一个非单一维度。

如果给定了标量 dim,则沿指定的维度进行操作。在这种情况下,n 也必须是标量。

示例:

x = [1, 2, 3;
     4, 5, 6;
     7, 8, 9];
## 行方向正移位(第一个非单一维度)
circshift (x, 1)
  ⇒ 
       7   8   9
       1   2   3
       4   5   6
## 行方向负移位(第一个非单一维度)
circshift (x, -2)
  ⇒ 
       7   8   9
       1   2   3
       4   5   6
## 行不移位,列移位 1(第二个维度)
circshift (x, [0,1])
  ⇒ 
       3   1   2
       6   4   5
       9   7   8
## 列方向移位(第二个维度)
circshift (x, 1, 2)
  ⇒ 
       3   1   2
       6   4   5
       9   7   8

另请参阅: permute, ipermute, shiftdim.

 
y = shiftdim (x, n)
[y, ns] = shiftdim (x)

x 的维度移位 n 个位置。n 必须是整数标量。

n 为正时,x 的维度向左移动,前面的维度循环到末尾。如果 n 为负,则 x 的维度向右移动,末尾添加 n 个单一维度。

使用单个参数调用时,shiftdim 会删除前导的单一维度,并在第二个输出参数 ns 中返回被删除的维度数量。

例如:

x = ones (1, 2, 3);
size (shiftdim (x, -1))
  ⇒    1   1   2   3
size (shiftdim (x, 1))
  ⇒    2   3
[b, ns] = shiftdim (x)
  ⇒  b =
        1   1   1
        1   1   1
  ⇒  ns = 1

另请参阅: reshape, permute, ipermute, circshift, squeeze.

 
[s, i] = sort (x)
[s, i] = sort (x, dim)
[s, i] = sort (x, mode)
[s, i] = sort (x, dim, mode)

返回 x 的副本,其中元素按递增顺序排列。

对于矩阵,sort 对列内的元素进行排序。

例如:

sort ([1, 2; 2, 3; 3, 1])
   ⇒   1  1
       2  2
       3  3

如果给定了可选参数 dim,则矩阵沿 dim 定义的维度进行排序。可选参数 mode 定义了值的排序顺序。mode 的有效值为 "ascend""descend"

sort 函数也可以用于生成一个包含排序矩阵中元素的原始行索引的矩阵。例如:

[s, i] = sort ([1, 2; 2, 3; 3, 1])
  ⇒  s = 1  1
         2  2
         3  3
  ⇒  i = 1  3
         2  1
         3  2

对于相等的元素,其索引使得相等元素按它们在原始列表中出现的顺序列出。

复数值的排序首先按模(abs (z))进行,如模相同则按幅角(angle (z))进行。例如:

sort ([1+i; 1; 1-i])
    ⇒   1 + 0i
       1 - 1i
       1 + 1i

NaN 值被视为大于任何其他值,并被排序到列表的末尾。

sort 函数也可用于对字符串和字符串元胞数组进行排序,此时使用字符串的 ASCII 字典顺序(大写字母 "A" 排在小写字母 "a" 之前)。

sort 中使用的算法针对部分有序列表的排序进行了优化。

另请参阅: sortrows, issorted.

 
[s, i] = sortrows (A)
[s, i] = sortrows (A, c)

根据 c 中指定的列顺序对矩阵 A 的行进行排序。

默认情况下(省略 c,或 c 中未指定的特定列)使用升序排序。但是,如果 c 的元素为负数,则相应列按降序排序。如果 A 的元素是字符串,则使用字典序排序。

示例:先按第 2 列降序排序,然后按第 3 列升序排序

x = [ 7, 1, 4;
      8, 3, 5;
      9, 3, 6 ];
sortrows (x, [-2, 3])
   ⇒   8  3  5
      9  3  6
      7  1  4

另请参阅: sort.

 
tf = issorted (A)
tf = issorted (A, mode)
tf = issorted (A, "rows", mode)

如果向量 A 已排序,则返回 true。排序方式由 mode 决定,可以是 "ascend""descend""either""monotonic""either""monotonic" 是等价的)。

默认情况下,mode"ascend"。NaN 的处理方式与 sort 相同。

如果提供了可选参数 "rows",则检查矩阵是否按行排序,如同函数 sortrows(无参数调用)的输出那样。注意: "rows" 参数不能用于稀疏矩阵。

另请参阅: sort, sortrows.

 
nel = nth_element (x, n)
nel = nth_element (x, n, dim)

使用 sort 定义的顺序选择向量的第 n 个最小元素。

结果等价于 sort(x)(n)

n 也可以是一个连续的范围,可以是升序 l:u 或降序 u:-1:l,此时将返回一系列元素。

如果 x 是一个数组,nth_element 沿 dim 定义的维度进行操作。如果未给出 dim,则使用第一个非单一维度。

编程说明:nth_element 封装了 C++ 标准库算法 nth_element 和 partial_sort。平均而言,操作的复杂度为 O(M*log(K)),其中 M = size (xdim)K = length (n)。此函数适用于比值 K/M 较小的情况;否则,使用 sort 可能更好。

另请参阅: sort, min, max.

 
A_LO = tril (A)
A_LO = tril (A, k)
A_LO = tril (A, k, pack)

返回通过提取矩阵 A 的下三角部分并设置所有其他元素为零而形成的新矩阵。

可选的第二个参数指定主对角线以上或以下多少条对角线也应设置为零。k 的默认值为 0,表示包含主对角线作为结果的一部分。如果 k 的值为非零整数,则元素的选择从偏移 k 条对角线开始,正 k 表示主对角线上方,负 k 表示主对角线下方。k 的绝对值不能大于次对角线或超对角线的数量。

示例 1:排除主对角线

tril (ones (3), -1)
     ⇒   0  0  0
         1  0  0
         1  1  0

示例 2:包括第一条超对角线

tril (ones (3), 1)
     ⇒   1  1  0
         1  1  1
         1  1  1

如果给出了第三个可选参数 "pack",则提取的元素不插入矩阵中,而是按列方式堆叠在一起,并作为列向量返回。

另请参阅: triu, istril, diag.

 
A_UP = triu (A)
A_UP = triu (A, k)
A_UP = triu (A, k, pack)

返回通过提取矩阵 A 的上三角部分并设置所有其他元素为零而形成的新矩阵。

可选的第二个参数指定主对角线以上或以下多少条对角线也应设置为零。k 的默认值为 0,表示包含主对角线作为结果的一部分。如果 k 的值为非零整数,则元素的选择从偏移 k 条对角线开始,正 k 表示主对角线上方,负 k 表示主对角线下方。k 的绝对值不能大于次对角线或超对角线的数量。

示例 1:排除主对角线

triu (ones (3), 1)
     ⇒   0  1  1
         0  0  1
         0  0  0

示例 2:包括第一条次对角线

triu (ones (3), -1)
     ⇒   1  1  1
         1  1  1
         0  1  1

如果给出了第三个可选参数 "pack",则提取的元素不插入矩阵中,而是按列方式堆叠在一起,并作为列向量返回。

另请参阅: tril, istriu, diag.

 
v = vec (x)
v = vec (x, dim)

返回通过将矩阵 x 的列从上到下堆叠而获得的向量。

不指定 dim 时,这等价于 x(:)

如果提供了 dim,则 v 的维度被设置为 dim,并且所有元素沿最后一个维度堆叠。这等价于 shiftdim (x(:), 1-dim)

另请参阅: vech, resize, cat.

 
v = vech (x)

返回通过消除方阵 x 中的所有上三角元素后获得的向量,并将结果按列从上到下堆叠。

这在矩阵演算中有应用,其中底层矩阵是对称的,因此将值保留在主对角线之上是没有意义的。

另请参阅: vec.

 
B = prepad (A, l)
B = prepad (A, l, c)
B = prepad (A, l, c, dim)

将标量值 c 前置到向量 A 的前面,直到长度等于 l。如果未给定 c,则使用值 0。

如果 length (A) > l,则从 A 的开头移除元素,直到获得长度为 l 的向量。

如果 A 是一个矩阵,则元素被附加到每一行的前面或从每一行的开头删除。

如果给定了可选参数 dim,则沿此维度进行操作。

如果 dim 大于 A 的维度数,则结果将具有 dim 个维度。

另请参阅: postpad, cat, resize.

 
B = postpad (A, l)
B = postpad (A, l, c)
B = postpad (A, l, c, dim)

将标量值 c 附加到向量 A 的末尾,直到长度等于 l。如果未给定 c,则使用值 0。

如果 length (A) > l,则从 A 的末尾移除元素,直到获得长度为 l 的向量。

如果 A 是一个矩阵,则元素被附加到每一行的末尾或从每一行的末尾删除。

如果给定了可选参数 dim,则沿此维度进行操作。

如果 dim 大于 A 的维度数,则结果将具有 dim 个维度。

另请参阅: prepad, cat, resize.

 
M = diag (v)
M = diag (v, k)
M = diag (v, m, n)
v = diag (M)
v = diag (M, k)

返回以向量 v 为第 k 条对角线的对角矩阵。

第二个参数是可选的。如果为正数,则向量放置在第 k 条超对角线上。如果为负数,则放置在第 -k 条次对角线上。k 的默认值为 0,向量放置在主对角线上。例如:

diag ([1, 2, 3], 1)
   ⇒   0  1  0  0
       0  0  2  0
       0  0  0  3
       0  0  0  0

三输入形式返回以向量 v 为主对角线的对角矩阵,结果矩阵的大小为 m 行 × n 列。

如果给定的是矩阵参数而不是向量,diag 提取该矩阵的第 k 条对角线。

 
M = blkdiag (A, B, C, …)

A, B, C, ... 构建一个分块对角矩阵。

所有参数都必须是数值,并且是二维矩阵或标量。如果任何参数是稀疏类型的,则输出也将是稀疏的。

另请参阅: diag, horzcat, vertcat, sparse.