我有一个包含大量行的矩阵。我有另一个矩阵,我将一次循环一行。对于第二个矩阵中的每一行,我需要在第一个矩阵中查找类似的行。找到所有相似的行后,我需要知道相似行的行号。这些行几乎不会精确,因此ismember
不起作用。
此外,解决方案最好(但不一定)给出一些设置相似程度的方法,这会触发代码说它相似并给我行号。
有没有办法做到这一点?我环顾四周,找不到任何东西。
答案 0 :(得分:3)
你可以使用余弦距离,它可以找到两个向量之间的角度。类似的向量(在您的情况下,行和您的比较向量)的值接近1,不同的向量的值接近0。
function d = cosSimilarity(u, v)
d = dot(u,v)/(norm(u)*norm(v));
end
要将此函数应用于矩阵M
和V
中的每对行,您可以使用嵌套的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
来帮助您避免循环。