zoukankan      html  css  js  c++  java
  • Matlab计算两集合间的海明距离

    一.问题描述

    B1[1 2 3      

    4 5 6

    7 8 9]

    B2[12 13 14

    21 31 41

    51  1 1

    81 1 1]

    两个十进制矩阵,行数不一样,分别是n1和n2,列数必须一致,为nwords,输出的矩阵Dh是[n1,n2],这和求两句真的欧氏距离一样的。

    输出[1 1] = 1和12海明+2和13海明 + 3和14海明,[1 2] = 1和21 + 2和31 + 3和41,也就是说[i j]是B1第i行和B2第j行的海明距离。

    二.问题分析

    1和12 21 51 81分别求海明距离,防御a(一个航向量);2和13 31 1 1求海明距离,放于b;3和14 41 1 1 防御c;然后a+b+c就得到了,B1中第一行和B2中各行的海明距离。

    为了加快运算,可以打表,两个nwords=8的数异或后还是0到255(bitxor异或得到的是10禁止数),所以吧0到255共256个数每个数包含几个1(就是海明距离)存在一个矩阵bit_in_char中。

    三.实现

    function Dh=hammingDist(B1, B2)
    %
    % Compute hamming distance between two sets of samples (B1, B2)
    %
    % Dh=hammingDist(B1, B2);
    %
    % Input
    %    B1, B2: compact bit vectors. Each datapoint is one row.
    %    size(B1) = [ndatapoints1, nwords]
    %    size(B2) = [ndatapoints2, nwords]
    %    It is faster if ndatapoints1 < ndatapoints2
    % 
    % Output
    %    Dh = hamming distance. 
    %    size(Dh) = [ndatapoints1, ndatapoints2]
    
    % example query
    % Dhamm = hammingDist(B2, B1);
    % this will give the same result than:
    %    Dhamm = distMat(U2>0, U1>0).^2;
    % the size of the distance matrix is:
    %    size(Dhamm) = [Ntest x Ntraining]
    
    % loop-up table:
    bit_in_char = uint16([...
        0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4 1 2 2 3 2 3 ...
        3 4 2 3 3 4 3 4 4 5 1 2 2 3 2 3 3 4 2 3 3 4 ...
        3 4 4 5 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 1 2 ...
        2 3 2 3 3 4 2 3 3 4 3 4 4 5 2 3 3 4 3 4 4 5 ...
        3 4 4 5 4 5 5 6 2 3 3 4 3 4 4 5 3 4 4 5 4 5 ...
        5 6 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 1 2 2 3 ...
        2 3 3 4 2 3 3 4 3 4 4 5 2 3 3 4 3 4 4 5 3 4 ...
        4 5 4 5 5 6 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 ...
        3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 2 3 3 4 3 4 ...
        4 5 3 4 4 5 4 5 5 6 3 4 4 5 4 5 5 6 4 5 5 6 ...
        5 6 6 7 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 4 5 ...
        5 6 5 6 6 7 5 6 6 7 6 7 7 8]);
    
    n1 = size(B1,1);
    [n2, nwords] = size(B2);
    
    Dh = zeros([n1 n2], 'uint16');
    for j = 1:n1
        for n=1:nwords
            y = bitxor(B1(j,n),B2(:,n));
            Dh(j,:) = Dh(j,:) + bit_in_char(y+1);
        end
    end
    
  • 相关阅读:
    三栏布局
    两栏布局
    WEB前端开发笔试题(1)
    JavaScript document 对象
    设计一个有3个超链接的页面,单击这些链接时分别打开和关闭窗口以及关闭本身窗口。
    在窗体中有两个多选列表,用户可以从左侧列表中选择任意项,添加到右侧列表中。反之亦然。
    How and when: ridge regression with glmnet
    Fitting Bayesian Linear Mixed Models for continuous and binary data using Stan: A quick tutorial
    An Introduction to Stock Market Data Analysis with R (Part 1)
    Lesser known purrr tricks
  • 原文地址:https://www.cnblogs.com/hxsyl/p/4591708.html
Copyright © 2011-2022 走看看