Julia 中的特征分解和“组合”

问题描述

我在 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...