2014-12-17 2 views
0

많은 행이있는 행렬이 있습니다. 한 번에 한 행을 반복 할 다른 행렬이 있습니다. 두 번째 행렬의 각 행에 대해 첫 번째 행렬에서 비슷한 행을 찾아야합니다. 비슷한 행이 모두 발견되면 유사한 행의 행 번호를 알아야합니다. 이 행은 거의 정확하지 않으므로 ismember이 작동하지 않습니다.MATLAB에서 유사한 행 찾기

또한 해결책은 코드가 비슷하고 행 번호를 부여하도록 트리거하는 유사성 수준을 설정하는 방법을 제공하는 것이 바람직합니다 (그러나 반드시 그런 것은 아닙니다).

이렇게 할 방법이 있습니까? 나는 주변을 둘러 보았고 아무 것도 찾을 수 없었다.

+5

유사점에 대한 척도는 무엇입니까? 'pdist2'는 당신을 도울 것입니다 – Dan

+2

@ServerS'pdist2'는 유클리드 –

답변

3

코사인 거리를 사용하면 두 벡터 사이의 각도를 찾을 수 있습니다. 유사 벡터 (케이스에서 행과 비교 벡터)은 행의 모든 ​​쌍에 각각에이 기능을 적용하기 위해 1 이종 벡터가 0

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

에 가까운 값을 갖도록 가까운 값을 가질 행렬 MV은 중첩 된 for 루프를 사용할 수 있습니다. 거의 대부분의 우아한하지만 작동합니다

대신 중첩 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 

, 확실히 다른 방법이 없습니다. this 질문에서 솔루션을 살펴 보는 것으로 시작할 수 있습니다. 그러면 매트릭스의 행을 셀 배열의 셀로 변환 한 다음 cellfun과 함께 함수를 적용하여 루프를 피하는 데 도움이됩니다.

+0

뿐만 아니라 다른 거리에서도 사용할 수 있습니다. 그래서'V'가 제 두번째 매트릭스입니까? – ServerS

+0

Agh, thought V는 당신이 비교하고 싶은 벡터입니다. 귀하의 질문을 읽지 마십시오. 그래서 V의 각 행을 M의 각 행과 비교하고 싶습니까? 곧 다시 방문 할 것입니다. – ohruunuruus

+0

오른쪽에서 M보다 V 값이 적을지라도 비슷한 행의 행 번호가 M에 있어야합니다. – ServerS