2026a

# 重构和重新排列数组


Syslab 中的许多函数都可以提取现有数组的元素,然后按照不同的形状或顺序放置。这样有助于预处理数据,便于之后进行计算或分析。

# 重构

reshape 函数可以更改数组的大小和形状。例如,将 3×4 矩阵重构成 2×6 矩阵。

using TyMath
A = [1 4 7 10; 2 5 8 11; 3 6 9 12]
A =
3×4 Matrix{Int64}:
 1  4  7  10
 2  5  8  11
 3  6  9  12
B = reshape(A,2,6)
B =
2×6 Matrix{Int64}:
 1  3  5  7   9  11
 2  4  6  8  10  12

只要不同形状中的元素数量相同,就可以将它们重构成具有任意维度的数组。使用 A 中的元素,创建一个 2×2×3 的多维数组。

C = reshape(A,2,2,3)
C =
2×2×3 Array{Int64, 3}:
[:, :, 1] =
 1  3
 2  4

[:, :, 2] =
 5  7
 6  8

[:, :, 3] =
  9  11
 10  12

# 转置和翻转

线性代数中常见的任务是转置矩阵,即将矩阵的行变成列,将列变成行。要实现此目的,可以使用 transpose 函数或 ' 运算符。

创建一个 3×3 矩阵并计算其转置。

A = magic(3)
A =
3×3 Matrix{Int64}:
 8  1  6
 3  5  7
 4  9  2
B = A'
B =
3×3 adjoint(::Matrix{Int64}) with eltype Int64:
 8  3  4
 1  5  9
 6  7  2

类似的运算符 ' 可以计算复矩阵的共轭转置。此操作计算每个元素的复共轭并对其进行转置。创建一个 2×2 复矩阵并计算其共轭转置。

A = [1+im 1-im; -im im]
A =
2×2 Matrix{Complex{Int64}}:
 1+1im  1-1im
 0-1im  0+1im
B = A'
B =
2×2 adjoint(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
 1-1im  0+1im
 1+1im  0-1im

reverse 上下左右翻转矩阵的行和列。

A = [1 2; 3 4]
A =
2×2 Matrix{Int64}:
 1  2
 3  4
B = reverse(A, dims = 1)
B =
2×2 Matrix{Int64}:
 3  4
 1  2
C = reverse(A, dims = 2)
C =
2×2 Matrix{Int64}:
 2  1
 4  3

# 平移和旋转

使用 circshift 函数,可以将数组的元素平移一定的位置数。例如,创建一个 3×4 矩阵,然后将其各列向右平移 2 个位置。第二个参数 [0 2] 要求 circshift 将各行平移 0 个位置,将各列向右平移 2 个位置。

A = [1 2 3 4; 5 6 7 8; 9 10 11 12]
A =
3×4 Matrix{Int64}:
 1   2   3   4
 5   6   7   8
 9  10  11  12
B = circshift(A,[0 2])
B =
3×4 Matrix{Int64}:
  3   4  1   2
  7   8  5   6
 11  12  9  10

要将 A 的各行向上平移 1 个位置而各列保持不动,请将第二个参数指定为 [-1 0]。

C = circshift(A,[-1 0])
C =
3×4 Matrix{Int64}:
 5   6   7   8
 9  10  11  12
 1   2   3   4

rotl90 函数可以将矩阵逆时针旋转 90 度。

A = [1 2; 3 4]
A =
2×2 Matrix{Int64}:
 1  2
 3  4
B = rotl90(A) 
B =
2×2 Matrix{Int64}:
 2  4
 1  3

如果再旋转 3 次(使用第二个参数指定旋转次数),最后将得到原始矩阵 A。

C = rotl90(B,3)
C =
2×2 Matrix{Int64}:
 1  2
 3  4

# 排序

对数组中的数据进行排序也是一项实用功能,Syslab 提供了几种排序方法。例如,sort 函数可以按升序或降序对矩阵的每一行或每一列中的元素进行排序。创建矩阵 A,并按升序对 A 的每一列进行排序。

A = magic(4)
A =
4×4 Matrix{Int64}:
 16   2   3  13
  5  11  10   8
  9   7   6  12
  4  14  15   1
B = sort(A, dims=1)
B =
4×4 Matrix{Int64}:
  4   2   3   1
  5   7   6   8
  9  11  10  12
 16  14  15  13

按降序对每一行进行排序。第二个参数值 2 指定您希望逐行排序。

C = sort(A,dims=2, rev=true)
C =
4×4 Matrix{Int64}:
 16  13  3  2
 11  10  8  5
 12   9  7  6
 15  14  4  1

要整行排序,请使用 sortslices 函数。例如,根据第一列中的元素按升序对 A 的各行排序。行的位置发生变化,但每一行中元素的顺序不变。

D = sortslices(A, dims=1) 
D =
4×4 Matrix{Int64}:
  4  14  15   1
  5  11  10   8
  9   7   6  12
 16   2   3  13