我在Julia中学习了一些关于因子分解的教程。为了练习,我试图从矩阵中进行本征分解,并使用以下公式重新创建原始矩阵:
A=VλV⁻cco
其中V是特征向量的矩阵,λ是特征值的对角矩阵,V⁻cco是逆矩阵V。
让我困惑的是,本征值是作为向量返回的,而我找到的指南指出,它应该作为对角矩阵返回。
代码示例:
using LinearAlgebra
# Create matrix
A = rand(3, 3)
# Eigendecomposition
AEig = eigen(A)
λ = AEig.values
3-element Vector{Float64}:
V = AEig.vectors
3×3 Matrix{Float64}:
Acomp = V*λ*inv(V)
A ≈ Acomp
尝试将矢量和矩阵相乘会返回错误:
DimensionMismatch("A has dimensions (3,1) but B has dimensions (3,3)")
这是因为将V与λ相乘会返回一个3元素向量,然后尝试将其与V相乘⁻这是一个3×3矩阵。我的问题是,有没有一种简单的方法可以从向量创建对角矩阵?或者;重组;原始矩阵的另一种实现方式?
您可以使用LinearAlgebra
中的单位矩阵,表示为I
,如下所示:
julia> λ
3-element Vector{Float64}:
-0.4445656542213612
0.5573883013610712
1.310095519651262
julia> λ .* I(3)
3×3 Matrix{Float64}:
-0.444566 -0.0 -0.0
0.0 0.557388 0.0
0.0 0.0 1.3101
这里的.*
意味着向量的每个元素都与矩阵的相应行相乘。
[编辑:]在使用Diagonal()
函数发布问题后,我发现了另一种创建对角矩阵的方法。虽然上述解决方案有效,但这会创建一些更简单的语法:
julia> Diagonal(λ)
3×3 Diagonal{Float64, Vector{Float64}}:
-0.444566 ⋅ ⋅
⋅ 0.557388 ⋅
⋅ ⋅ 1.3101