당신은 당신에게 효율적인 사전 기반 구조를 제공하는 Map을 악용 할 수 있습니다에있는 각각의 고유 한 단어,
A = {'life is wonderful', 'matlab makes your dreams come true'};
B = {'life would be meaningless without wonderful matlab', 'what a wonderful world', 'the shoemaker makes shoes', 'rock and roll baby'};
mapA = containers.Map();
sizeA = size(A,2);
for i = 1:size(A,2) % for each string
a = regexpi(A(i),'\w+','match');
for w = a{:} % for each word extracted
str = cell2mat(w);
if(mapA.isKey(str)) % if word already indexed
occ = mapA(str);
else % new key
occ = zeros(1,sizeA);
end
occ(i) = occ(i)+1;
mapA(str) = occ;
end
end
% same for B
mapB = containers.Map();
sizeB = size(B,2);
for i = 1:size(B,2)
a = regexpi(B(i),'\w+','match');
for w = a{:}
str = cell2mat(w);
if(mapB.isKey(str))
occ = mapB(str);
else
occ = zeros(1,sizeB);
end
occ(i) = occ(i)+1;
mapB(str) = occ;
end
end
다음 각 문자열의 발생을 보여주는 벡터를 저장 각 단어를 들어
을 A, B와 일치를 계산
match = zeros(size(A,2),size(B,2));
for w = mapA.keys
str = cell2mat(w);
if (mapB.isKey(str))
match = match + diag(mapA(str))*ones(size(match))*diag(mapB(str));
end
end
결과 :
,363,210
match =
2 1 0 0
1 0 1 0
당신이 #wordsA + #wordsB + #singleWordsA 대신 # wordsA * # wordsB
편집의 복잡성이이 방법 : 또는 Map
을 좋아하지 않는 경우, 저장할 수있는 단어를 - 알파벳 순으로 정렬 된 벡터의 간섭 벡터. 당신이 '를 찾고 있다면
(우리가 w
속성은 단어 문자열과 occ
하는 구조체를 사용하는 가정이 발생 벡터이다)
i = 1; j = 1;
while(i<=size(wordsA,2) && i<=size(wordsB,2))
if(strcmp(wordsA(i).w, wordsB(j).w))
% update match
else
if(before(wordsA(i).w, wordsA(i).w)) % before: fancy function returning 1 if the first argument comes (alphabetically) before the second one (no builtin function comes to my mind)
i = i+1;
else
j = j+1;
end
end
: 그럼 당신은 일치 동시에 두 벡터를 확인 찾아보실 수 있습니다 matlab '그리고 10 번째 위치에서 알 수 있듯이'생명 '은 알파벳 순서로 정렬되기 때문에 전에 위치를 확인하는 것은 쓸모가 없습니다. 그래서 우리는 중첩 루프 솔루션의 # wordsA + # wordsB 반복 vs. # wordsA * # wordsB를 가지고 있습니다.
@ Amro의 해결책과 비교해 보았습니까? – Jonas
은 더 큰 데이터 세트로도 거의 동일하게 보입니다. – Batsu