在VBA Excel中计算汉明重量和/或距离



我正在尝试逐个比较客户,其质量可以通过二元选择来定义(例如,客户是否使用产品)。
在网上进行了大量搜索后,看起来我需要为此使用汉明距离或等效物:在两个单词之间找到异或运算结果的汉明权重。

举个具体的例子,汉明距离在1001和1011之间:

计算数字 1001 XOR 1011= 0010
汉明权重 0010 = 1(位数设置为 1 in 0010)

我需要在最多 96 位的单词中执行此操作。

我找到了一些关于

http://people.revoledu.com/kardi/tutorial/Similarity/HammingDistance.html

http://trustedsignal.blogspot.ca/2015/06/xord-play-normalized-hamming-distance.html

和大量的代码段,例如

汉明权重只写在二进制操作中?

但仅限于C,Java,Perl,O,opencl...除了Excel VBA之外的任何内容。

到目前为止,这是我设法整理的内容。

它可以工作,但不幸的是仅适用于 30 位或更少的字,并且使用了一种有点粗糙的方法:对两个数字 X 和 Y 进行 XOR,然后转换为表示二进制数的字符串。然后在取出 1 后计算字符串的长度。我想有一种更优雅和更有效的方法。

Public Function HamDist(x As Long, y As Long, NbBit As Integer)
Dim i As Long, BinStrg As String, bxor As Long 
bxor = x Xor y 
BinStrg = "" 
For i = NbBit To 0 Step -1 ‘going from left to right 
         If bxor And (2 ^ i) Then
            BinStrg = BinStrg + "1" ‘add a 1 to the string 
         Else
            BinStrg = BinStrg + "0"
         End If
      Next
 HamDist = Len(BinStrg) - Len(Replace(BinStrg, "1", "")) ' replace the 1 by nothing and count  the length of the resulting string 
End Function

您能否通过计算汉明权重或距离来帮助使其适用于 Excel 96 及更低版本(udf 或 sub)中的 2010 位字

如果您以字符串形式存储质量链(例如,仅由字母"T"和"F"组成的字符串),则可以使用循环轻松完成此操作。

Function hammingDistance(qualities1 As String, qualities2 As String) As Integer
    If Len(qualities1) <> Len(qualities2) Then
        hammingDistance = -1
        Exit Function
    End If
    Dim i, result As Integer
    result = 0
    For i = 1 To Len(qualities1)
        If Mid(qualities1, i, 1) <> Mid(qualities2, i, 1) Then result = result + 1
    Next
    hammingDistance = result
End Function

相关内容

  • 没有找到相关文章

最新更新