【问题标题】:Calculate Hamming weight and/or distance in VBA Excel在 VBA Excel 中计算汉明权重和/或距离
【发布时间】:2016-07-02 22:19:07
【问题描述】:

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

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

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

对于最多 96 位的字,我需要这样做。

我找到了一些关于

的信息

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

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

还有大量的代码,例如

Hamming weight written only in binary operations?

但仅限于 C、Java、Perl、O、opencl... 除了 Excel VBA。

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

它有效,但不幸的是仅适用于 30 位或更少的单词,并且使用了一种有点粗略的方法:对两个数字 X 和 Y 进行异或,然后转换为表示二进制数的字符串.然后在取出 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

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

【问题讨论】:

  • 您的xy 不能是Long。对于 96 位,您必须使用字符串作为输入,而不是 IntegerLongLongLongDouble,因为这些都存储 64 位或更少的位。这很笨拙,需要您编写大量算术函数like here

标签: excel hamming-distance hammingweight vba


【解决方案1】:

如果您以字符串形式存储质量链(例如,仅由字母 '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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2016-06-05
    • 2022-01-16
    • 2015-03-21
    相关资源
    最近更新 更多