셀형 배열의 데이터에 액세스하기
기본 인덱싱
셀형 배열은 셀로 이루어진 데이터형입니다. 셀은 인덱스 데이터의 컨테이너입니다. 각 셀에는 모든 데이터형이 포함될 수 있습니다. 셀형 배열은 형식이 일관되지 않은 파일의 데이터(예: 숫자형 데이터와 텍스트 데이터가 모두 포함된 열)를 담기 위해 사용하는 경우가 많습니다.
혼합된 데이터로 구성된 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 셀형 배열과 필드 f1
및 f2
를 가진 스칼라 구조체를 포함하는 셀형 배열을 예로 들 수 있습니다.
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은 쉼표로 구분된 목록을 반환합니다. 자세한 내용은 여러 셀의 요소 참조하기를 참조하십시오.