繁体   English   中英

Haskell Matrix平等失败

[英]Haskell Matrix equality failing

我正忙着使用Haskell来实现一些量子变换矩阵。 我有一个函数,用于通过构建反矩阵和伴随矩阵然后测试两者来测试方阵是否是单一的。

该函数如下所示,其中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) )

什么可能导致第二对矩阵的相等性测试失败? 有没有更正确的方法让我在代码中显示复杂的数字?

Double是浮点数,浮点数本质上是不准确的。 ==将执行完全相等的检查,您可能希望进行“足够接近”的相等检查。

或者,您可以使用1)具有固定精度(例如,或2)无限内存使用的不同数字类型,以实现无限精度。 scientific是一个很好的选择, fixed

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM