如何找到复数矩阵 A 使得 A * Transpose(A) = B,其中 B = Transpose(B) 并且是复数?

问题描述 投票:0回答:1

我想找到一个复值矩阵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 linear-algebra
1个回答
0
投票

这里有一个似乎可行的想法,但请注意下面的警告。另请注意,我是 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 保证是正交的(在任何意义上)。我可以看到如何解决这个问题(在子空间中对角化),但目前我无法生成这样的示例,而且我太累了,无论如何都无法编写代码。我周末看看是否可以。

© www.soinside.com 2019 - 2024. All rights reserved.