问题描述
我在 Julia 中经历了一些 tutorial on factorization。为了练习,我试图从矩阵中提取特征分解并使用公式重新创建原始矩阵:
A = VλV⁻¹
其中 V 是特征向量矩阵,λ 是特征值的对角矩阵,V⁻¹ 是逆矩阵 V。
令我困惑的是,特征值作为向量返回,而我发现的 guides 指出它应该作为对角矩阵返回。
代码示例:
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