由于可以使用标准
eigen
从原始矩阵中获取特征值,因此可以构建结果。这在目前的形式中可能是错误的,但它是一个概念验证:
using Random
Random.seed!(123)
A = randn(6, 6)
B = A - A'
# B will be the matrix we want to decomposition on
egv = eigen(B).values
F = [(iseven((i+j)÷2) || (abs(i-j) != 1)) ?
0.0 : sign(j-i)*abs(egv[max(i,j)])
for i in axes(B,1), j in axes(B,2)]
现在
F
看起来像:
6×6 Matrix{Float64}:
0.0 4.72892 0.0 0.0 0.0 0.0
-4.72892 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 1.28596 0.0 0.0
0.0 0.0 -1.28596 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.634589
0.0 0.0 0.0 0.0 -0.634589 0.0
并且具有相同的特征值。
eigen
已经很优化了,所以这个方法应该是有竞争力的。请注意,对于奇数大小的矩阵,实特征值也参与其中,这必须单独处理(也许将 egv
中的值显式配对可能是明智的)。