计算汉明权重 and/or 在 VBA Excel 中的距离
Calculate Hamming weight and/or distance in VBA Excel
我正在尝试逐个比较客户,他们的品质可以通过二元选择来定义(例如,客户是否使用某种产品)。
在网上搜索了很多之后,看起来我需要使用汉明距离,或者它的等价物:找到两个词之间异或运算结果的汉明权重。
举个具体的例子,1001和1011之间的海明距离:
Calculate the number 1001 XOR 1011= 0010
Hamming weight of 0010 = 1 (numbers of bit set to
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
和大量代码,例如
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 的 Excel 2010 及以下版本(udf 或 sub)的 96 位字中工作吗?汉明重量或距离?
如果您以字符串形式存储质量链(例如,仅由字母 '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
我正在尝试逐个比较客户,他们的品质可以通过二元选择来定义(例如,客户是否使用某种产品)。
在网上搜索了很多之后,看起来我需要使用汉明距离,或者它的等价物:找到两个词之间异或运算结果的汉明权重。
举个具体的例子,1001和1011之间的海明距离:
Calculate the number 1001 XOR 1011= 0010
Hamming weight of 0010 = 1 (numbers of bit set to 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
和大量代码,例如
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 的 Excel 2010 及以下版本(udf 或 sub)的 96 位字中工作吗?汉明重量或距离?
如果您以字符串形式存储质量链(例如,仅由字母 '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