일부 양자 변환 행렬을 구현하기 위해 Haskell을 사용하는 것이 엉망입니다. 나는 square matrix가 unitary인지 아닌지를 테스트하기위한 함수를 가지고있다. 역행렬과 adjoint 행렬을 만들고 둘 다 테스트하면된다. 랩가 어느 값을 테스트하는데 사용되는 간단한 함수 인 함수가 다음과 같다Haskell 행렬 평등 실패
는 역로부터 반환. 행렬은 다음과 같이하기 때 진정한 반환 잘 작동 몇 가지 간단한 테스트 매트릭스에 대한
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
:
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))
내 문제는 마드가 ((사용하여 내장 된 변환 행렬에 대한 함수가 False를 반환한다는 것입니다 1/SQRT (2) + 0) 및 ((- 1/sqrt (2))와 같다 : + 0))
실패 행렬의 두 번째 쌍 항등 테스트를 야기 할 수있는 것을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))
? 코드에 복소수를 표현하는 더 정확한 방법이 있습니까?
하나의 그럴듯한 이유는 누적 된 오류로 인해 부동 소수점 산술에 몇 가지 문제가있을 수 있다는 것입니다. –