Main Content

셀형 배열의 데이터에 액세스하기

기본 인덱싱

셀형 배열은 셀로 이루어진 데이터형입니다. 셀은 인덱스 데이터의 컨테이너입니다. 각 셀에는 모든 데이터형이 포함될 수 있습니다. 셀형 배열은 형식이 일관되지 않은 파일의 데이터(예: 숫자형 데이터와 텍스트 데이터가 모두 포함된 열)를 담기 위해 사용하는 경우가 많습니다.

혼합된 데이터로 구성된 2×3 셀형 배열을 예로 들어 보겠습니다.

C = {'one','two','three'; 
     100,200,rand(3,3)}
C=2×3 cell array
    {'one'}    {'two'}    {'three'   }
    {[100]}    {[200]}    {3x3 double}

요소가 각각 하나의 셀에 들어 있습니다. 표준 괄호를 사용하여 이 배열의 요소를 참조할 경우, 결과는 해당 셀이 포함된 셀형 배열 서브셋입니다.

C2 = C(1:2,1:2)
C2=2×2 cell array
    {'one'}    {'two'}
    {[100]}    {[200]}

특정 셀의 내용을 읽거나 쓰려면 인덱스를 중괄호로 묶습니다.

R = C{2,3}
R = 3×3

    0.8147    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575

C{1,3} = 'longer text in a third location'
C=2×3 cell array
    {'one'}    {'two'}    {'longer text in a third location'}
    {[100]}    {[200]}    {3x3 double                       }

여러 셀의 내용을 동시에 바꾸려면 괄호를 사용하여 셀을 참조하고 중괄호를 사용하여 상응하는 크기의 셀형 배열을 정의합니다.

C(1,1:2) = {'first','second'}
C=2×3 cell array
    {'first'}    {'second'}    {'longer text in a third location'}
    {[  100]}    {[   200]}    {3x3 double                       }

여러 셀에서 데이터 읽어오기

MATLAB®의 데이터 처리 함수 대부분은 동일한 데이터형을 갖는 사각형 배열에 대해 연산을 수행합니다. 셀형 배열에는 유형과 크기가 혼합되어 포함될 수 있으므로 해당 데이터를 처리하기 전에 셀에서 데이터를 추출하고 결합해야 할 수 있습니다. 이 섹션에서는 몇 가지 일반적인 시나리오에 대해 설명합니다.

특정 셀 내의 텍스트

전체 셀형 배열에 텍스트가 포함되어 있거나 텍스트가 포함된 셀들의 서브셋을 알고 있는 경우 해당 셀을 참조하여 MATLAB의 텍스트 처리 함수에 직접 전달할 수 있습니다. 예를 들어, C의 첫 번째 행에 있는 각 요소에서 문자 t가 나타나는 위치를 찾습니다.

ts = strfind(C(1,:),'t')
ts=1×3 cell array
    {[5]}    {0x0 double}    {[8 11 18 28]}

특정 셀의 숫자

셀형 배열에 포함된 숫자형 데이터를 처리하는 주요 방법은 다음 두 가지입니다.

  • 해당 셀들의 내용을 하나의 숫자형 배열로 결합한 다음 그 배열을 처리합니다.

  • 각 셀을 개별적으로 처리합니다.

숫자형 셀을 결합하려면 cell2mat 함수를 사용합니다. 각 셀의 배열은 서로 호환되는 크기를 가져야만 결합할 수 있습니다. 예를 들어, C의 두 번째 행에 있는 처음 2개 요소는 스칼라 값입니다. 이 요소를 1×2 숫자형 벡터로 결합합니다.

v = cell2mat(C(2,1:2))
v = 1×2

   100   200

개별 셀을 처리하려면 cellfun 함수를 사용하면 됩니다. cellfun을 호출할 때 각 셀에 적용할 함수를 지정합니다. @ 기호를 사용하여 함수임을 나타내고 함수 핸들을 만듭니다. 예를 들어, C의 두 번째 행에 있는 각 셀의 길이를 구합니다.

len = cellfun(@length,C(2,:))
len = 1×3

     1     1     3

인덱스를 알 수 없는 셀의 데이터

일부 셀에 처리하려는 데이터가 포함되어 있지만 정확한 인덱스를 모르는 경우 다음 옵션 중 하나를 사용할 수 있습니다.

  • 논리형 인덱싱을 사용하여 특정 조건을 충족하는 모든 요소를 찾은 다음 이들 요소를 처리합니다.

  • for 루프 또는 while 루프를 사용하여 셀을 한 번에 하나씩 검사하고 처리합니다.

예를 들어, 문자형 벡터가 포함된 셀만 처리하고자 한다고 가정하겠습니다. 논리형 인덱싱을 활용하려면 먼저 cellfun 함수에 ischar 함수를 사용하여 해당 셀을 찾습니다.

idx = cellfun(@ischar,C)
idx = 2x3 logical array

   1   1   1
   0   0   0

그런 다음 논리형 배열을 사용하여 셀형 배열 C(idx)의 요소를 참조합니다. 인덱싱 연산의 결과는 열 벡터이며, 이를 strlength 같은 텍스트 처리 함수에 전달할 수 있습니다.

len = strlength(C(idx))
len = 3×1

     5
     6
    31

다른 접근 방식은 루프를 사용하여 각 셀의 내용을 검사한 후 처리하는 것입니다. 예를 들어, 셀들을 순회하면서 문자 t가 포함된 셀을 찾아 string형 배열로 결합합니다. 루프가 string형 배열에 추가하는 요소의 수를 변수 n에서 추적합니다.

n = 0;
for k = 1:numel(C)
    if ischar(C{k}) && contains(C{k},"t")
        n = n + 1;
        txt(n) = string(C{k});
    end
end
txt
txt = 1x2 string
    "first"    "longer text in a third location"

여러 셀의 요소 참조하기

중괄호 인덱싱을 사용하여 여러 셀을 참조하는 경우 MATLAB은 셀의 내용을 쉼표로 구분된 목록으로 반환합니다. 예를 들어 아래 구문은

C{1:2,1:2}

아래 구문과 동일합니다.

C{1,1}, C{2,1}, C{1,2}, C{2,2}.

각 셀이 서로 다른 데이터형을 포함할 수 있으므로 이 목록을 하나의 변수에 할당할 수 없습니다. 그러나, 이 목록을 셀과 동일한 개수의 변수에 할당할 수 있습니다.

[v1,v2,v3,v4] = C{1:2,1:2}
v1 = 
'first'
v2 = 
100
v3 = 
'second'
v4 = 
200

각 셀이 크기가 호환되는 동일한 데이터형을 포함하는 경우 배열 결합 연산자 []를 쉼표로 구분된 목록에 적용하여 하나의 변수를 생성할 수 있습니다.

v = [C{2,1:2}]
v = 1×2

   100   200

셀 내용을 결합할 수 없는 경우 새 셀형 배열, 테이블 또는 기타 이종 컨테이너에 결과를 저장합니다. 예를 들어, C의 두 번째 행에 있는 숫자형 데이터를 테이블로 변환합니다. C의 첫 번째 행에 있는 텍스트 데이터를 변수 이름에 사용합니다.

t = cell2table(C(2,:),VariableNames=C(1,:))
t=1×3 table
    first    second    longer text in a third location
    _____    ______    _______________________________

     100      200               {3x3 double}          

셀 내 배열의 요소 참조하기

셀에 배열이 포함된 경우 두 수준의 인덱스를 사용하여 배열 내의 특정 요소에 액세스할 수 있습니다. 먼저 중괄호를 사용하여 셀 내용에 액세스합니다. 그런 다음 그 셀의 배열 유형에 표준 인덱싱 구문을 사용합니다.

예를 들어, C{2,3}은 난수로 구성된 3×3 행렬을 반환합니다. 괄호 인덱싱을 사용하여 이 행렬의 두 번째 행을 추출합니다.

C{2,3}(2,:)
ans = 1×3

    0.9058    0.6324    0.5469

셀에 셀형 배열이 포함된 경우 중괄호를 사용하여 인덱싱하고, 셀에 구조체형 배열이 포함된 경우 점 표기법을 사용하여 특정 필드를 참조합니다. 다음과 같이 2×1 셀형 배열과 필드 f1f2를 가진 스칼라 구조체를 포함하는 셀형 배열을 예로 들 수 있습니다.

c = {'A'; ones(3,4)};
s = struct("f1",'B',"f2",ones(5,6)); 
C = {c,s}
C=1×2 cell array
    {2x1 cell}    {1x1 struct}

중첩 셀형 배열과 구조체에서 1로 구성된 배열을 추출합니다.

A1 = C{1}{2}
A1 = 3×4

     1     1     1     1
     1     1     1     1
     1     1     1     1

A2 = C{2}.f2
A2 = 5×6

     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1

임의 개수의 셀형 배열과 구조체형 배열을 중첩할 수 있습니다. 계층 구조의 하위 수준에 동일한 인덱싱 규칙을 적용합니다. 예를 들어, 다음 구문은 참조된 셀에 셀형 배열 또는 구조체형 배열이 요청한 대로 포함되어 있다면 유효한 구문입니다.

C{1}{2}{3}

C{4}.f1.f2(1)

C{5}.f3.f4{1}

어떤 인덱싱 수준에서든, 여러 셀을 참조하는 경우 MATLAB은 쉼표로 구분된 목록을 반환합니다. 자세한 내용은 여러 셀의 요소 참조하기를 참조하십시오.

참고 항목

| |

관련 항목