Engee 文档
Notebook

阵列排列和形状变化

Engee 的许多函数都使用数组元素,并赋予它们不同的形状或序列。这对于预处理数据、后续计算或分析数据都很有用。

改变形状

reshape 函数可以改变数组的大小和形状。例如,将大小为 3$\times$ 4 的矩阵转换为大小为 2$\times$ 6 的矩阵。

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

使用 A 中的元素可以创建一个多维数组,其中包含 3 个大小为 2$\times$ 2 的矩阵。

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

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

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

反转和翻转

线性代数中的一个常见任务是矩阵转置,即把行变成列,把列变成行。为此,可使用函数transpose 或运算符'

In [ ]:
A = rand(3, 3)
Out[0]:
3×3 Matrix{Float64}:
 0.671146  0.15141   0.445067
 0.205738  0.600742  0.832939
 0.992871  0.645874  0.623041
In [ ]:
A'
Out[0]:
3×3 adjoint(::Matrix{Float64}) with eltype Float64:
 0.671146  0.205738  0.992871
 0.15141   0.600742  0.645874
 0.445067  0.832939  0.623041
In [ ]:
B = [1+im 1-im; -im im]
Out[0]:
2×2 Matrix{Complex{Int64}}:
 1+1im  1-1im
 0-1im  0+1im
In [ ]:
transpose(B) 
Out[0]:
2×2 transpose(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
 1+1im  0-1im
 1-1im  0+1im

函数reverse 根据关键字dims 的值上下移动行,左右移动列。

dims = 1 # 处理行
dims = 2 # 使用列
In [ ]:
A = [1 2; 3 4]
Out[0]:
2×2 Matrix{Int64}:
 1  2
 3  4
In [ ]:
B = reverse(A, dims=1)
Out[0]:
2×2 Matrix{Int64}:
 3  4
 1  2
In [ ]:
С = reverse(A, dims=2)
Out[0]:
2×2 Matrix{Int64}:
 2  1
 4  3

偏移和旋转

您可以使用函数circshift 将数组元素移动一定的位置。例如,创建一个大小为 3$\times$ 4 的矩阵,并将其列向右移动 2 位。第二个参数 [0 2] 告诉circshift 将行向右移动 0 位,列向右移动 2 位。

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

如果要将 A 的行向上移动 1 位并保持列不变,则第二个参数为 [-1 0]。

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

排序

对数组中的数据进行排序也是一种有价值的工具。例如,函数sort 可以按升序或降序分别对矩阵的每一行或每一列进行排序。dims 关键字的值会告诉你哪一行或哪一列正在排序。

创建一个矩阵 A,将 A 中的每一列按升序排序。

In [ ]:
A = rand(4,4)
Out[0]:
4×4 Matrix{Float64}:
 0.461938  0.0393388  0.227309  0.0815622
 0.278592  0.850108   0.563387  0.646155
 0.385563  0.42562    0.851425  0.859178
 0.655341  0.601584   0.659288  0.238689
In [ ]:
B = sort(A, dims=1) 
Out[0]:
4×4 Matrix{Float64}:
 0.278592  0.0393388  0.227309  0.0815622
 0.385563  0.42562    0.563387  0.238689
 0.461938  0.601584   0.659288  0.646155
 0.655341  0.850108   0.851425  0.859178

如果指定关键字rev = true 的值,排序将不是升序,而是降序。

In [ ]:
C = sort(A, dims=2, rev=true)
Out[0]:
4×4 Matrix{Float64}:
 0.461938  0.227309  0.0815622  0.0393388
 0.850108  0.646155  0.563387   0.278592
 0.859178  0.851425  0.42562    0.385563
 0.659288  0.655341  0.601584   0.238689

结论

本文介绍了一些矩阵变换函数:重塑、跨距、移位和旋转,以及排序。有关矩阵运算的更多信息,请参阅 Linear Algebra