2014-07-15 3 views
1

두 개의 셀 어레이가 있으며 크기는 1x20033과 1x19입니다. 이 두 셀 배열을 A와 B라고합시다. A의 각 셀과 B의 각 셀을 비교하여 공통 요소가 있는지 확인하려고합니다.Matlab, 두 셀 배열의 공통 요소 찾기

마지막으로, 이진 행렬을 만들고 일치가있을 때 하나를 넣어야합니다.

나는이 시도 :

BinaryMatrix=zeros(20033,19); 

for i=1:1:20033 

    for j=1:1:19 
     match=find(ismember(A{i},B{j}));   
     if match==1 
      BinaryMatrix(i,j)= 1;   
     end 
    end 
end 

을하지만 난이 오류에 직면 ". 하나는 문자열이 아닌 문자열의 셀 어레이해야 클래스 셀의 클래스를 두 번 입력 B의 입력 A를"

알려주십시오. 해결 방법 어떻게해야합니까?

+0

'find'를'any'로 바꾸시겠습니까? 또한 세포에는 무엇이 들어 있습니까? –

+0

각 셀에는 일련의 단어가 들어 있습니다.이 문자열의 길이는 다릅니다. 하나는 20이고 다른 하나는 300 일 수도 있습니다. – user36729

+0

'intersect'를 사용해 보셨습니까? – rayryeng

답변

2

거의 작동하는 코드입니다. 내가 권장하는 것은 AB에있는 공백으로 나뉘어 진 문자열을 나눈 것입니다. 따라서 ABA 또는 B의 각 요소가 인 인 요소의 셀 배열입니다. 공백은 단어 분리를위한 구분 기호로 사용됩니다.

intersect을 사용하면 A에있는 단어와 B에있는 단어 사이에 일반적인 단어가 있는지 확인할 수 있습니다. intersect은 두 배열 (숫자 배열, 셀 배열 등이 될 수 있음)을 고려하여 작동하며 CD을 세트로 사용하며 두 배열 사이의 교차 집합을 반환합니다.

CD은 공백으로 구분 된 단어의 셀 배열이 AB입니다. intersect(C,D)은 문자열의 셀 배열을 반환합니다. 여기서 출력의 각 요소는 에있는 문자열이고CD입니다. 따라서이 셀 배열이 비어 있지 않은 경우 CD 사이에 하나 이상의 공통 단어가 발견되었습니다. 이 경우, 다음, 즉 (1)에 행렬의 위치에서 이진 플래그를 설정 :

BinaryMatrix = false(20033,19); 

for i=1:1:20033 
    for j=1:1:19 
     Asplit = strsplit(A{i}); 
     Bsplit = strsplit(B{j}); 
     if (~isempty(intersect(Asplit, Bsplit))) 
      BinaryMatrix(i,j)= true;   
     end 
    end 
end 

당신은 내가 false(20033,19)에, zeros(20033,19)에서 행렬을 변경 한 것을 알 수 있습니다. 그 이유는 zeros을 수행함으로써 행렬에 배정도가 만들어지기 때문에 행렬에 숫자 당 8 바이트를 할당하기 때문입니다. false을 수행하면 대신 logical 행렬이되며 숫자 당 1 바이트를 할당합니다. BinaryMatrixtrue 또는 false 중 하나가되도록하려면 double - logical을 사용하지 마십시오. 난 둘 다 셀 어레이가 얼마나 큰 모르는, 그래서이 일을하는 것은

strsplit 년 이후 R2013a 및에서만 사용할 수 있습니다 8. ​​

마이너 참고하여 메모리 소비를 줄일 것이다. R2012b 이하의 MATLAB 버전을 사용하는 경우 strsplitregexp으로 대체하십시오. 따라서 for 루프의 두 줄을 다음과 같이 바꿉니다.

Asplit = regexp(A{i}, ' ', 'split'); 
Bsplit = regexp(B{j}, ' ', 'split'); 

+0

위대한 답변! +1 –

+0

@ 루이스 멘도 - 나는 거인의 어깨에 서있다. 나는 너를 포함하여 최고로 배웠다. 고맙습니다! – rayryeng

+0

하하하, 고마워! 위대한 발명품,이 스택 오버플로 –