我正在尝试使用Haskell来实现一些量子转换矩阵的功能。我设计了一个用于测试方阵是否为酉矩阵的函数,该函数通过构建逆矩阵和伴随矩阵然后进行测试来实现。
下面是该函数的代码,其中wrap是一个简单的函数,用于测试从inverse返回的Either值。
对于一些简单的测试矩阵,它可以正常工作,并在获取下面显示的矩阵时返回True:
什么可能导致第二组矩阵的等式测试失败?在代码中,有更正确的方法来表示复数吗?
下面是该函数的代码,其中wrap是一个简单的函数,用于测试从inverse返回的Either值。
isUnitary :: [[Copmlex Double]] -> Bool
isUnitary lists = let mat = fromLists lists --Create matrix from lists
conjugateTranspose = fmap conjugate $ Data.Matrix.transpose mat --Conjugate Transpose Matrix
inverseMat = debug("ConjugateTranspose: \n" ++ show conjugateTranspose ++ "\n")
wrap $ inverse mat --The inverse matrix
in if (conjugateTranspose) == inverseMat then debug("InverseMat: \n" ++ show inverseMat ++ "\n")
True
else debug("InverseMat: \n" ++ show inverseMat ++ "\n")
False
对于一些简单的测试矩阵,它可以正常工作,并在获取下面显示的矩阵时返回True:
ConjugateTranspose:
( 1.0 :+ (-0.0) 0.0 :+ (-0.0) )
( 0.0 :+ (-0.0) (-1.0) :+ (-0.0) )
InverseMat:
( 1.0 :+ 0.0 0.0 :+ 0.0 )
( 0.0 :+ (-0.0) (-1.0) :+ (-0.0) )
我的问题是,使用 ((1/sqrt(2) :+ 0) 和 ((-1/sqrt(2)) :+ 0)) 构建的 Hadamard 变换矩阵返回 False。
ConjugateTranspose:
( 0.7071067811865475 :+ (-0.0) 0.7071067811865475 :+ (-0.0) )
( 0.7071067811865475 :+ (-0.0) (-0.7071067811865475) :+ (-0.0) )
InverseMat:
( 0.7071067811865476 :+ 0.0 0.7071067811865476 :+ 0.0 )
( 0.7071067811865476 :+ 0.0 (-0.7071067811865476) :+ (-0.0) )
什么可能导致第二组矩阵的等式测试失败?在代码中,有更正确的方法来表示复数吗?