티스토리 뷰

matlab

cell array의 특이한 동작

게으른 the lazy 2020. 7. 14. 01:51

cell array를 활용하는 특별한 방법 두 가지를 소개합니다.

 

1) structure array의 특정 field 값을 모두 가져오고 싶을 때

 

현재 폴더 내에 있는 모든 tif 파일의 목록은 아래처럼 불러올 수 있습니다.

 

현재 폴더 내의 모든 tif 파일목록 (=비밥호의 탑승객들)

 

폴더 내 모든 tif 파일 목록 생성

 

files는 크기가 5x1인 structure array이고 name, folder... 등 6개의 field를 가지고 있습니다. 이 array에서 모든 원소들의 name을 어떻게 가져올까요? files.name을 하면...

 

files.name의 결과

 

이렇게 각 원소의 name을 따로따로 다섯 번 가져온 꼴이 됩니다. 따라서 ans에는 마지막 원소의 name만 남습니다. 그럼 변수에 넣어볼까요?

 

files.name을 하나의 변수에 할당

 

변수에 넣어보려고 했더니 이렇게 첫번째 원소의 name만 가져옵니다. 물론 이 문제는 for문을 쓰면 쉽게 해결되지만, cell array를 쓰면 for문을 쓰지 않고도 해결할 수 있습니다. 아래처럼 할 수도 있고,

 

모든 files.name 값을 한번에 가져오는 방법1

 

아래처럼 할 수도 있습니다.

 

모든 files.name 값을 한번에 가져오는 방법2

 

깔끔한 표현을 위해 뒤에 transpose(')를 붙였지만, 이는 선택사항입니다. { } 대신 [ ]를 쓰면 numeric array로 가져올 수도 있습니다. 단, 위와 같이 문자열을 가져올 때 [ ]를 쓰면 1행에 모든 문자열이 붙으므로 의미가 없습니다. Numeric array로 가져오는 것은 숫자일 때 의미가 있습니다.

 

모든 파일들의 크기를 한번에 받아오기

 

2) 함수의 출력을 원하는 개수만큼 받아올 때

 

함수의 출력을 받을 때, 받는 인자의 개수를 dynamically하게 조절하고 싶으면 어떻게 할까요? 예를 들어, max 함수는 아래와 같이 쓰면 출력을 하나만 받아오며,

 

max 함수의 출력 인자를 하나만 받을 때

 

아래와 같이 쓰면 두 개의 출력을 받아옵니다.

 

max 함수의 출력 인자를 두 개 받을 때

 

출력을 하나만 받을지 두 개를 받을지 programmatically하게 조절할 수 있을까요? 즉, 코드 상단에 1을 쓰면 maxVal만 받도록, 2를 쓰면 maxVal과 maxIdx를 모두 받도록 할 수 있을까요? 우선 한가지 알아둘 것은, 함수가 실제로 출력인자 몇 개를 내놓을지는 호출할 때 이미 결정됩니다. 함수 호출 시 함수에게 요청하는 개수만큼만 함수는 출력인자를 내놓게 됩니다. (출처) 즉, maxVal만 요청하면서 은근슬쩍 maxIdx까지 받아올 방법은 없습니다.

 

물론 이 문제는 if-else를 쓰면 간단히 해결되지만, 좀 더 그럴싸한 방법이 있습니다. 여기에도 cell array가 이용됩니다.

 

cell array를 이용하여 함수의 출력을 받기

 

이렇게 out을 원하는 크기의 cell array로 만들어두면 out의 크기만큼 함수의 출력을 받아오게 됩니다. 물론 cell array의 크기는 함수의 최대 출력인자 개수를 넘지 않아야 합니다. 위의 max 함수는 최대 출력이 2개이므로, out의 길이가 3을 넘어가면 출력인자를 너무 많이 받으려 한다는 에러메시지가 뜹니다.

 

함수의 출력 인자보다 더 많은 개수를 요청했을 때

 

여기에 cell의 특별한 다른 기능 중 하나인 content distribution을 이용할 수도 있겠습니다.

 

cell array의 각 원소를 여러 변수에 나눠담기

 

지금까지 cell array의 특별한 기능 두 가지를 살펴봤습니다.

 

- 게으른 맽랩

댓글