在MATLAB中查找类似的行

时间:2014-12-17 14:08:09

标签: matlab matrix rows

我有一个包含大量行的矩阵。我有另一个矩阵,我将一次循环一行。对于第二个矩阵中的每一行,我需要在第一个矩阵中查找类似的行。找到所有相似的行后,我需要知道相似行的行号。这些行几乎不会精确,因此ismember不起作用。

此外,解决方案最好(但不一定)给出一些设置相似程度的方法,这会触发代码说它相似并给我行号。

有没有办法做到这一点?我环顾四周,找不到任何东西。

1 个答案:

答案 0 :(得分:3)

你可以使用余弦距离,它可以找到两个向量之间的角度。类似的向量(在您的情况下,行和您的比较向量)的值接近1,不同的向量的值接近0。

function d = cosSimilarity(u, v)
  d = dot(u,v)/(norm(u)*norm(v));
end

要将此函数应用于矩阵MV中的每对行,您可以使用嵌套的for循环。几乎没有最优雅,但它会起作用:

numRowsM = size(M, 1)
numRowsV = size(V, 1)
similarThresh = .9

for m = 1:numRowsM
    for v = 1:numRowsV 
        similarity = cosSimilarity(V(v,:), M(m, :))

        % Notify about similar rows
        if similarity > similarThresh
            disp([num2str(m) ' is similar to a row in V'])
        end
    end
end

而不是嵌套的for循环,肯定还有其他方法。您可以从查看this问题的解决方案开始,这将通过将矩阵的行转换为单元格数组的单元格,然后将函数应用于cellfun来帮助您避免循环。