线性代数
在这个例子中,我们将展示如何解决简单的线性代数问题,如找到行列式,矩阵乘法和SVG因式分解。
首先,请使用代码运行准备单元格。
In [ ]:
Pkg.add(["LinearAlgebra", "Rotations"])
In [ ]:
using LinearAlgebra;
using Rotations;
using Plots;
plotlyjs();
求矩阵的行列式
求矩阵的行列式
In [ ]:
A = [1 2 3; 4 1 6; 7 8 1]
det(A)
Out[0]:
矩阵乘法
找到点(1,2,0)绕Z轴旋转一个角度时的坐标 .
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)
通过因式分解降低矩阵的维数
给出了三个对象的特征矩阵:
这些列包含对象的要素,但它们包含冗余信息。 使用SVD和附加操作将维度减少到两个变量。 具体算法步骤:
- 将基质分解成成分
U, s, VT使用函数svd(). - 创建空矩阵
Sigma与矩阵大小相同A,并用矢量元素填充其主对角线S. - 分离矩阵的2列
Sigma和矩阵的2行V使用命令查找矩阵在降维空间中的投影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]:
In [ ]:
# Приблизительное восстановление матрицы по сжатой информации
B = U * (Sigma * VT)
Out[0]: