我有两个矩阵,我需要比较它们,但我不想比较位置,我认为这不是最好的方法。我想到哈希函数,有没有人知道如何计算矩阵的哈希值?
答案 0 :(得分:4)
如果您的矩阵是作为数组实现的,我建议您使用memcmp()
中的string.h
来判断它们是否相等。
如果涉及浮点值并且值来自实际计算,则无法按值检查它们,因为您必须包含epsilons以容纳数字错误。
答案 1 :(得分:3)
您可以计算整个浮点数组的哈希值(作为字节序列)。如果您希望比较函数能够处理系数中的微小差异,则可以比较从每个矩阵计算的平凡标量和向量。如果必须将每个矩阵与多个矩阵进行比较,这是有意义的。想到的例子:
trace of the matrix
vector of L0, L1, L2 norms of all columns or rows
diagonal of LU factorization
tridiagonal reduction (if symmetric)
diagonal of eigenvalues (if possible)
diagonal of SVD
答案 2 :(得分:1)
首先,哈希不会告诉你两个矩阵是否相等,只能告诉你它们是否不同;因为可能会(并且会有,墨菲定律总是潜伏着)碰撞。
你可以通过链接元素上的任何函数来计算哈希...如果你可以将元素转换为整数值(不是截断,而是二进制表示),也许你可以对它们进行异或(但请记住,如果某些值相同但具有不同的表示形式(如-0和+0或NaN),则无效。
所以我的建议是你可以预先计算某种哈希函数(即使所有元素的总和都是有效的)(这很重要,每次你想要进行比较时计算哈希都没有意义,然后比较哈希值以快速丢弃一些不同的矩阵,但如果哈希值相同,则必须比较每个位置。
答案 3 :(得分:0)
当你说 hash 时,我想你想校验和矩阵并比较校验和以确认相等。假设您的每个矩阵都存储为一个连续的数据块,您可以计算每个块的起始地址和长度(以字节为单位),然后为两者生成校验和(因为您希望它们有时相等,长度将是相同)。如果校验和相同且概率非常高,则两个矩阵也相等。如果正确性至关重要,那么一旦校验和匹配,就可以在两个矩阵上运行比较循环。这样你就不会调用比较的代价,除非很可能是相等的。