2014-05-23 4 views
3

나는 문자열의 세포 배열의 두 세포 배열의 조합을 할 방법을 찾고 있어요. 예를 들어 :세포의 세포 배열의 조합

A = {{'one' 'two'};{'three' 'four'};{'five' 'six'}}; 
B = {{'five' 'six'};{'seven' 'eight'};{'nine' 'ten'}}; 

그리고 내가 좋아하는 뭔가 좀하고 싶습니다 :

C = {{'one' 'two'};{'three' 'four'};{'five' 'six'};{'seven' 'eight'};{'nine' 'ten'}}; 

을하지만 C = union(A, B)를 사용할 때 MATLAB 말하는 오류를 반환 : 클래스 셀의

입력 A와 클래스 셀의 입력 B는 문자열이 아닌 한 문자열의 셀 배열이어야합니다.

아무도 잘하면 간단한 방법으로 이런 식으로하는 방법을 알고 있습니까? 나는 그것을 크게 고맙게 생각한다.

대체 : 문자열의 셀 배열의 셀 배열과 다른 방식으로 구분 된 문자열의 셀 배열을 갖는 방법도 유용 할 수 있지만, 내가 아는 한 불가능합니다.

감사합니다.

+1

문자열의 셀 배열의 셀 배열 대신 m- times-n 문자열의 셀 배열을 사용할 수 있습니다. 모든 행에 같은 수의 열이 없으면 (예를 들어도 마찬가지 임) 빈 문자열로 채울 수 있습니다. m-times-n 셀 배열을 사용하면 원하는 것을 단순화 할 수 있습니다. 구분자 (예약 된 문자)로 개별 문자열로 구성된 행마다 단일 문자열을 사용하는 것이 더 좋습니다. 그렇다면'union '을 사용할 수 있습니다. –

+1

제 다른 기능을 수정해야만했습니다.하지만 실제로 이것이 최상의 솔루션이라고 생각합니다! 고맙습니다! Daniel의 코드를 구현하고 { 'one'two '}가 {'two 'one'}와 같다고 생각한 후에이 작업을 시도했지만 나에게 적합하지 않습니다. – ACenTe25

답변

2
C=[A;B]  
allWords=unique([A{:};B{:}]) 
F=cell2mat(cellfun(@(x)(ismember(allWords,x{1})+2*ismember(allWords,x{2}))',C,'uni',false)) 
[~,uniqueindices,~]=unique(F,'rows') 

C(sort(uniqueindices)) 

내 코드가 무엇을 : 그것은 모든 단어 allwords의 목록을 구축,이 목록은 사이의 상관 관계를 포함하는 매트릭스를 구축하는 데 사용됩니다 행과 단어가 포함되어 있습니다. 1 = 첫 번째 단어에 대해 일치, 2 = 두 번째 단어에 일치. 마지막으로,이 숫자 행렬 unique에 색인을 가져 오는 데 적용 할 수 있습니다.

내 업데이트를 포함하여 셀당 2 단어가 하드 코드되었습니다. 이 제한을 없애기 위해 익명 함수 (@(x)(ismember(allWords,x{1})+2*ismember(allWords,x{2})))를보다 일반적인 구현으로 대체하는 것이 일반적입니다. 아마도 cellfun을 다시 사용했을 것입니다.

+0

이것은 훌륭하게 작동하지만 { 'one'two '}는 {'two ''one '}와 같은 것으로 간주됩니다. 이것이 일어나서는 안된다는 것을 명시하지 않은 것에 대해 유감스럽게 생각합니다. 그래도 좋은 생각입니다. – ACenTe25

+0

@ ACenTe25 : 답변을 업데이트했습니다. – Daniel

0

Union은 셀 배열과 호환되지 않는 것처럼 보입니다. 따라서 우리는 몇 가지 대안을 찾아야합니다.

한 가지 방법은 A와 B의 데이터를 수직으로 연결하는 것입니다. 그런 다음 각 열을 따라 문자열의 각 셀에 고유 한 ID를 지정하십시오. 그런 다음이 ID를 'rows'옵션과 함께 사용하여 원하는 출력을 얻을 수있는 가능성을 열어주는 double 배열로 결합 할 수 있습니다. 이것은 여기서 정확하게 달성됩니다.

%// Slightly complicated input for safest verification of results 
A = {{'three' 'four'}; 
    {'five' 'six'}; 
    {'five' 'seven'}; 
    {'one' 'two'}}; 

B = {{'seven' 'eight'}; 
    {'five' 'six'}; 
    {'nine' 'ten'}; 
    {'three' 'six'};}; 

t1 = [A ; B] %// concatenate all cells from A and B vertically 
t2 = vertcat(t1{:}) %// Get all the cells of strings from A and B 

t22 = mat2cell(t2,size(t2,1),ones(1,size(t2,2))); 
[~,~,row_ind] = cellfun(@(x) unique(x,'stable'),t22,'uni',0) 
mat1 = horzcat(row_ind{:}) 

[~,ind] = unique(mat1,'rows','stable') 
out1 = t2(ind,:) %// output as a cell array of strings, used for verification too 
out = mat2cell(out1, ones(1,size(out1,1)),size(out1,2)) %//desired output 

출력 -

out1 = 
    'three' 'four' 
    'five'  'six' 
    'five'  'seven' 
    'one'  'two' 
    'seven' 'eight' 
    'nine'  'ten' 
    'three' 'six'