2012-06-03 3 views
0

Matlab의 데이터가 다른 항목을 나타내는 열이있는 셀 배열 형식입니다. 셀 어레이는 다음 예에서와 같이, 서로 다른 열이 :Matlab의 다른 셀 배열의 데이터 조인

a = {'A', 'B', 'C' ; 1, 1, 1; 2, 2, 2 } 

A =

'A' 'B' 'C' 
[1] [1] [1] 
[2] [2] [2] 

b = {'C', 'D'; 3, 3; 4, 4} 

B =

'C' 'D' 
[3] [3] 
[4] [4] 

내가 다른 셀 어레이에 가입 할 수 있도록하고 싶습니다 다음 방식으로 :

c =

'A' 'B' 'C' 'D' 
[1] [1] [1] [NaN] 
[2] [2] [2] [NaN] 
[NaN] [NaN] [3] [3] 
[NaN] [NaN] [4] [4] 

실제 예제에서는 수백 개의 열과 여러 행이 있으므로 새 셀 배열을 수동으로 만드는 것은 나를위한 옵션이 아닙니다.

+0

에 당신이에서 첫 번째 두 개의 열과 C에서 다른 사람되고 싶어 ? 하지만 첫 번째 행만 혼합하면됩니까? – petrichor

+0

안녕하세요, Emrea가 아래에 언급했듯이, 첫 번째 행을 기반으로 셀 배열에 참여하려고합니다. 감사. – Andrew

+0

이 페이지 확인 : [열 또는 행 레이블을 기반으로 두 개의 행렬을 병합 할 수있는 MATLAB의 함수가 있습니까?] (http://www.mathworks.com/support/solutions/en/data/1-143J0O/index. html? product = ML & solution = 1-143J0O) – Amro

답변

3

당신이 (또는 이러한 목적을 위해 데이터 세트 배열로 변환) 데이터 집합 배열에 데이터를 저장하고자한다면, 다음을 수행 할 수 있습니다 :

여기
>> d1 
d1 = 
    A B C 
    1 1 1 
    2 2 2 
>> d2 
d2 = 
    C D 
    3 3 
    4 4 
>> join(d1,d2,'Keys','C','type','outer','mergekeys',true) 
ans = 
    A  B  C D 
     1  1 1 NaN 
     2  2 2 NaN 
    NaN NaN 3  3 
    NaN NaN 4  4 
3

첫 번째 행을 기준으로 두 개의 배열을 결합하고자한다고 가정합니다.

% get the list of all keys 
keys = unique([a(1,:) b(1,:)]); 

lena = size(a,1)-1; lenb = size(b,1)-1; 

% allocate space for the joined array 
joined = cell(lena+lenb+1, length(keys)); 

joined(1,:) = keys; 

% add a 
tf = ismember(keys, a(1,:)); 
joined(2:(2+lena-1),tf) = a(2:end,:); 

% add b 
tf = ismember(keys, b(1,:)); 
joined((lena+2):(lena+lenb+1),tf) = b(2:end,:); 

이것은 NaN 대신 빈 셀을 사용한다는 점을 제외하고는 조인 된 배열을 제공합니다. 나는 이것이 괜찮길 바란다.

1

내 솔루션은에 old another에서 적응 비슷한 질문 (단순히 트랜스 행/열) :

>> c' 
ans = 
    'A'  'B'  'C' 'D' 
    [ 1] [ 1] [1] [NaN] 
    [ 2] [ 2] [2] [NaN] 
    [NaN] [NaN] [3] [ 3] 
    [NaN] [NaN] [4] [ 4] 
: 여기
%# input cell arrays 
a = {'A', 'B', 'C' ; 1, 1, 1; 2, 2, 2 }; 
b = {'C', 'D'; 3, 3; 4, 4}; 

%# transpose rows/columns 
a = a'; b = b'; 

%# get all key values, and convert them to indices starting at 1 
[allKeys,~,ind] = unique([a(:,1);b(:,1)]); 
indA = ind(1:size(a,1)); 
indB = ind(size(a,1)+1:end); 

%# merge the two datasets (key,value1,value2) 
c = cell(numel(allKeys), size(a,2)+size(b,2)-1); 
c(:) = {NaN};       %# fill with NaNs 
c(:,1) = allKeys;      %# available keys from both 
c(indA,2:size(a,2)) = a(:,2:end);  %# insert 1st dataset values 
c(indB,size(a,2)+1:end) = b(:,2:end); %# insert 2nd dataset values 

는 (원래의 방향과 일치하는 전치) 결과입니다

또한 여기에 통계 도구 상자에서 DATASET 클래스를 사용하여 솔루션입니다 :

aa = dataset([cell2mat(a(2:end,:)) a(1,:)]) 
bb = dataset([cell2mat(b(2:end,:)) b(1,:)]) 
cc = join(aa,bb, 'Keys',{'C'}, 'type','fullouter', 'MergeKeys',true) 

cc = 
    A  B  C D 
     1  1 1 NaN 
     2  2 2 NaN 
    NaN NaN 3  3 
    NaN NaN 4  4 
관련 문제