我想找到一个复值矩阵A,它满足属性
A * Transpose(A) = B
。矩阵 B 是复数且对称的(不是埃尔米特矩阵),即 B = Transpose(B)
。
我在朱莉娅工作。我正在尝试以下优化代码,但它不起作用(而且速度也非常慢):
using LinearAlgebra
using Optim
# Define the objective function for optimization
function objective(A)
return sum(abs2.(A * transpose(A) - B)) # Sum of squared element wise differences
end
# Initialize a random initial guess for A
n = size(B, 1)
initial_guess = rand(ComplexF64, n, n)
# Perform optimization
result = optimize(objective, initial_guess, BFGS(), Optim.Options(show_trace=true))
# Get the optimized matrix_B_eta from the result
matrix_A_optimized = reshape(result.minimizer, n, n)
如何构造矩阵A?
这里有一个似乎可行的想法,但请注意下面的警告。另请注意,我是 Julia 新手(但在 Fortran 和 C 方面非常有经验),所以这可能是能够用任何语言编写 Fortran 的一个很好的例子......
function ComplexTranspose( Q::Matrix )
QT = similar( Q )
for j in axes( Q, 1 )
for i in axes( Q, 2 )
QT[ i, j ] = Q[ j, i ]
end
end
return QT
end
function GenQOrtho( Q::Matrix )
QOrtho = copy( Q )
for i in axes( QOrtho, 2 )
α = sum( QOrtho[ :, i ] .* QOrtho[ :, i ] )
α = sqrt( α )
QOrtho[ :, i ] = QOrtho[ :, i ] .* ( 1.0 / α )
end
return QOrtho
end
function SymmetricFactorComplexSymmetricMatrix( A::Matrix{ Complex } )
λ, Q = eigen( A )
QOrtho = GenQOrtho( Q )
return Diagonal( sqrt.( λ ) ) * ComplexTranspose( QOrtho )
end
function CheckIt( A::Matrix )
F = SymmetricFactorSymmetricMatrix( A )
return maximum( abs.( A - ComplexTranspose( F ) * F ) )
end
function ManyTest( ntests::Integer )
maxerror = 0.0
for i = 1:ntests
n = Int( floor( 10 * rand() + 1 ) )
A = Matrix( Symmetric( rand( ComplexF64, n, n ) ) )
error = CheckIt( A )
println( "Test ", i, " size ", n, " error ", error )
maxerror = max( error, maxerror )
end
printstyled( "Max error: ", maxerror, "\n"; color = :lightred )
return maxerror
end
在 REPL 中运行:
julia> ManyTest( 15 )
Test 1 size 4 error 1.336885555457667e-15
Test 2 size 8 error 3.1791949213824896e-15
Test 3 size 3 error 1.2187194808943674e-15
Test 4 size 10 error 4.4214205078807195e-15
Test 5 size 9 error 4.39205126597841e-15
Test 6 size 6 error 1.7271574597764355e-15
Test 7 size 5 error 1.6011864169946884e-15
Test 8 size 6 error 2.277987190955421e-15
Test 9 size 1 error 1.1102230246251565e-16
Test 10 size 1 error 0.0
Test 11 size 4 error 3.0847422370805075e-15
Test 12 size 1 error 2.482534153247273e-16
Test 13 size 2 error 6.753223014464259e-16
Test 14 size 4 error 1.8058898395134885e-15
Test 15 size 9 error 4.751962059186864e-15
Max error: 4.751962059186864e-15
它基于以下事实:复对称矩阵的特征向量在转置意义上是正交的,而不是通常的共轭转置意义上的正交。因此,我们可以使用正常的特征值机制,但必须仔细地重新规范化特征向量,以便向量的长度在转置中为 1,而不是伴随意义 - 这有点痛苦,因为大多数 Julia 工具,例如dot()
或
norm()
假设您想要共轭(就像您通常做的那样),所以在这里您必须“手动”做一些工作。我怀疑这就是您的解决方案不起作用的原因 - transpose
函数正在执行共轭,因为它看到一个复杂的矩阵。需要注意的是,我并不 100% 相信当你有退化时这总是有效。问题是 Julia 似乎没有专门的复杂对称对角线器,所以我不明白为什么对应于简并 eval 的 evec 保证是正交的(在任何意义上)。我可以看到如何解决这个问题(在子空间中对角化),但目前我无法生成这样的示例,而且我太累了,无论如何都无法编写代码。我周末看看是否可以。