Engee 文档
Notebook

线性代数

在本例中,我们将展示如何解决简单的线性代数问题,如求行列式、矩阵乘法和 SVG 因式分解。

首先,请运行预备代码单元格。

In [ ]:
Pkg.add(["LinearAlgebra", "Rotations"])
In [ ]:
using LinearAlgebra;
using Rotations;
using Plots;
plotlyjs();

求矩阵行列式

求矩阵的行列式$\left [ \begin{array}{cc}1 & 2 & 3 \\4 & 1 & 6 \\ 7 & 8 & 1 \end{array} \right ]$

In [ ]:
A = [1 2 3; 4 1 6; 7 8 1]
det(A)
Out[0]:
104.0

矩阵乘法

将点(1,2,0)绕 Z 轴旋转一个角度后,求点(1,2,0)的坐标$90^{\circ}$ 。

In [ ]:
X = [1, 2, 0]
scatter([X[1]], [X[2]], [X[3]], framestyle = :zerolines, legend=false, aspect_ratio = 1)
Out[0]:
In [ ]:
R_euler = RotXYZ(0,0,90*pi/180);
Y = R_euler * X
scatter!([Y[1]], [Y[2]], [Y[3]], framestyle = :zerolines, legend=false, aspect_ratio = 1)
Out[0]:
In [ ]:
print(Y)
[-2.0, 1.0000000000000002, 0.0]

通过因式分解降低矩阵维数

下面给出一个包含三个对象的特征矩阵:

$A = \left [ \begin{array}{cc}1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\ 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 & 20\\ 21 & 22 & 23 & 24 & 25 & 26 & 27 & 28 & 29 & 30 \end{array} \right ]$

列中包含对象的特征,但其中包含冗余信息。使用 SVD 和其他操作将维度降低到两个变量。算法的具体步骤:

1.使用函数svd() 将矩阵分解为多个分量U, s, VT 。 2.2. 创建一个与矩阵A 大小相同的空矩阵Sigma ,并用向量S 的元素填充其主对角线。 3. 分离矩阵Sigma 的 2 列和矩阵V 的 2 行,使用命令T = U * Sigma 找出矩阵在缩小维度空间中的投影。

In [ ]:
A = [ 1 2 3 4 5 6 7 8 9 10;
      11 12 13 14 15 16 17 18 19 20;
      21 22 23 24 25 26 27 28 29 30 ];

U, s, VT = svd(A);
In [ ]:
# Создадим матрицу Sigma
Sigma = zeros(size(A,1), size(A,2));
Sigma[1:size(A,1), 1:size(A,1)] = diagm(s);

# Выберем только 2 признака для описания
n_elements = 2;
Sigma = Sigma[:, 1:n_elements];
VT = VT[1:n_elements, :];

# Находим проекцию матрицы в пространство уменьшенной размерности
T = U * Sigma
Out[0]:
3×2 Matrix{Float64}:
 -18.5216   6.47697
 -49.8131   1.91182
 -81.1046  -2.65333
In [ ]:
# Приблизительное восстановление матрицы по сжатой информации
B = U * (Sigma * VT)
Out[0]:
3×3 Matrix{Float64}:
  2.80454   7.16027  12.4563
 11.5326   25.8784   22.6968
 20.2608   44.5964   32.9373