이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

쉼표로 구분된 목록(CSV)

쉼표로 구분된 목록이란?

쉼표로 구분된 일련의 숫자를 입력하면 쉼표로 구분된 목록이 생성됩니다. MATLAB®은 개별적으로 각각의 값을 반환합니다.

1,2,3
ans =

     1


ans =

     2


ans =

     3

이러한 목록은 그 자체로는 그다지 유용하지 않습니다. 그러나 MATLAB 구조체 및 셀형 배열과 같이 규모가 크고 복잡한 데이터 구조에서 쉼표로 구분된 목록을 사용하면 MATLAB 코드를 간소화할 수 있습니다.

쉼표로 구분된 목록 생성

이 섹션에서는 셀형 배열 또는 MATLAB 구조체에서 쉼표로 구분된 목록을 생성하는 방법에 대해 설명합니다.

셀형 배열에서 목록 생성하기

셀형 배열에서 여러 요소를 추출하면 쉼표로 구분된 목록이 생성됩니다. 아래에 표시된 것과 같이 4x6 셀형 배열이 주어졌다고 가정해 봅니다.

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
C
C = 

    [2]    [10]    [18]    [26]    [34]    [42]
    [4]    [12]    [20]    [28]    [36]    [44]
    [6]    [14]    [22]    [30]    [38]    [46]
    [8]    [16]    [24]    [32]    [40]    [48]

5번째 열을 추출하면 다음과 같이 쉼표로 구분된 목록이 생성됩니다.

C{:,5}
ans =

    34


ans =

    36


ans =

    38


ans =

    40

이는 명시적으로 입력하는 것과 동일합니다.

C{1,5},C{2,5},C{3,5},C{4,5}

구조체에서 목록 생성하기

구조체의 경우, 해당 차원 중 하나에 걸쳐 존재하는 구조체의 필드를 추출하면 쉼표로 구분된 목록이 생성됩니다.

먼저, 위에 사용된 셀형 배열을 f1부터 f6까지의 6개 필드가 포함된 4x1 MATLAB 구조체로 변환합니다. 모든 행에 대해 필드 f5를 읽습니다. 그러면 MATLAB이 쉼표로 구분된 목록을 반환합니다.

S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
S.f5
ans =

    34


ans =

    36


ans =

    38


ans =

    40

이는 명시적으로 입력하는 것과 동일합니다.

S(1).f5,S(2).f5,S(3).f5,S(4).f5

쉼표로 구분된 목록의 출력값 대입하기

간단한 대입문을 사용하여 쉼표로 구분된 목록의 임의 요소나 연속된 전체 요소를 변수에 대입할 수 있습니다. 이전 섹션에서 설명한 셀형 배열 C를 사용하여 첫 번째 행을 변수 c1 ~ c6에 대입합니다.

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
[c1,c2,c3,c4,c5,c6] = C{1,1:6};
c5
c5 =

    34
표현식에서 반환하는 출력값 개수보다 적은 출력 변수를 지정할 경우 MATLAB에서는 지정된 N개의 변수에 첫 N개의 출력값을 대입한 다음 나머지 출력값은 모두 삭제합니다. 다음 예제에서, MATLAB은 C{1,1:3}을 변수 c1, c2, c3에 대입한 다음 C{1,4:6}을 삭제합니다.
[c1,c2,c3] = C{1,1:6};
동일한 방식으로 구조체의 출력값을 대입할 수 있습니다.
S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
[sf1,sf2,sf3] = S.f5;
sf3
sf3 =

    38
이를 위해 deal 함수를 사용할 수도 있습니다.

쉼표로 구분된 목록에 대입하기

여러 값을 쉼표로 구분된 목록에 대입하는 가장 간단한 방법은 deal 함수를 사용하는 것입니다. 이 함수는 해당 입력 인수 모두를 쉼표로 구분된 목록 요소에 분산시킵니다.

이 예제에서는 deal을 사용하여 쉼표로 구분된 목록에 포함된 각각의 요소를 덮어씁니다. 먼저, 목록을 생성합니다.

c{1} = [31 07]; 
c{2} = [03 78];
c{:}
ans =

    31     7


ans =

     3    78

deal을 사용하여 목록에 포함된 각각의 요소를 덮어씁니다.

[c{:}] = deal([10 20],[14 12]);
c{:}
ans =

    10    20


ans =

    14    12

이 예제에서는 구조체 필드의 벡터를 쉼표로 구분한 목록을 사용하여 위와 동일한 작업을 수행합니다.

s(1).field1 = [31 07];
s(2).field1 = [03 78];
s.field1
ans =

    31     7


ans =

     3    78

deal을 사용하여 구조체 필드를 덮어씁니다.

[s.field1] = deal([10 20],[14 12]);
s.field1
ans =

    10    20


ans =

    14    12

쉼표로 구분된 목록을 사용하는 방법

쉼표로 구분된 목록에 대한 일반적인 용도는 다음과 같습니다.

다음 섹션에서는 셀형 배열에 쉼표로 구분된 목록을 사용하는 예제를 제공합니다. 이러한 예제는 MATLAB 구조체에도 적용됩니다.

배열 생성하기

행렬 또는 배열을 생성할 때 쉼표로 구분된 목록을 사용하여 일련의 요소를 입력할 수 있습니다. 셀 자체를 추가하는 것과 반대로 요소의 목록을 삽입할 때 어떤 결과가 발생하는지 참고하십시오.

C{:, 5}를 사용하여 요소의 목록을 지정하면 MATLAB은 4개의 개별 요소를 삽입합니다.

A = {'Hello',C{:,5},magic(4)}
A = 

    'Hello'    [34]    [36]    [38]    [40]    [4x4 double]

C 셀 자체를 지정하면 MATLAB은 전체 셀형 배열을 삽입합니다.

A = {'Hello',C,magic(4)}
A = 

    'Hello'    {4x6 cell}    [4x4 double]

배열 표시하기

목록을 사용하여 구조체 또는 셀형 배열의 전부나 일부를 표시할 수 있습니다.

A{:}
ans =

Hello


ans = 

    [2]    [10]    [18]    [26]    [34]    [42]
    [4]    [12]    [20]    [28]    [36]    [44]
    [6]    [14]    [22]    [30]    [38]    [46]
    [8]    [16]    [24]    [32]    [40]    [48]


ans =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

결합

쉼표로 구분된 목록을 대괄호 안에 넣으면 목록에서 지정된 요소가 추출되어 결합됩니다.

A = [C{:,5:6}]
A =

    34    36    38    40    42    44    46    48

함수 호출 인수

함수 호출에 대한 코드를 작성할 때 각 인수를 쉼표로 구분하여 목록 형식으로 입력 인수를 입력합니다. 이러한 인수가 구조체 또는 셀형 배열에 저장되어 있는 경우, 대신 구조체 또는 셀형 배열에서 인수 목록의 일부를 생성할 수 있습니다. 이는 개수가 가변적인 인수를 전달할 때 특히 유용합니다.

이 예제에서는 여러 개의 특성(Attribute)-값 인수를 plot 함수에 전달합니다.

X = -pi:pi/10:pi;
Y = tan(sin(X)) - sin(tan(X));
C = cell(2,3);
C{1,1} = 'LineWidth';
C{2,1} = 2;
C{1,2} = 'MarkerEdgeColor';
C{2,2} = 'k';
C{1,3} = 'MarkerFaceColor';
C{2,3} = 'g';
figure
plot(X,Y,'--rs',C{:})

함수 반환 값

MATLAB 함수는 호출자에 둘 이상의 값을 반환할 수도 있습니다. 이러한 값은 각각의 값이 쉼표로 구분된 목록으로 반환됩니다. 각각의 반환 값을 나열하는 대신, 구조체나 셀형 배열에서 쉼표로 구분된 목록을 사용할 수 있습니다. 이는 반환 값의 개수가 가변적인 함수에 더욱 유용합니다.

이 예제에서는 셀형 배열에 세 개의 값을 반환합니다.

C = cell(1,3);
[C{:}] = fileparts('work/mytests/strArrays.mat')
C = 

    'work/mytests'    'strArrays'    '.mat'

고속 푸리에 변환(Fast Fourier Transform) 예제

fftshift 함수는 배열에서 각 차원의 왼쪽 절반과 오른쪽 절반을 서로 바꿉니다. [0 2 4 6 8 10]과 같은 간단한 벡터의 경우 출력값은 [6 8 10 0 2 4]입니다. 다차원 배열의 경우, fftshift는 각 차원을 따라 이러한 전환을 수행합니다.

fftshift는 인덱스로 구성된 벡터를 사용하여 전환 작업을 수행합니다. 위에 나와 있는 벡터의 경우, 인덱스 [1 2 3 4 5 6]이 재배열되어 새로운 인덱스 [4 5 6 1 2 3]을 생성합니다. 그런 다음, 이 함수는 이렇게 생성된 인덱스 벡터를 사용하여 요소를 재배치합니다. 다차원 배열의 경우, fftshift는 각 차원에 대해 인덱스 벡터를 생성해야 합니다. 쉼표로 구분된 목록을 사용하면 이 작업이 더욱 간단해집니다.

다음은 fftshift 함수입니다.

function y = fftshift(x)
    numDims = ndims(x);
    idx = cell(1,numDims);
    for k = 1:numDims
        m = size(x,k);
        p = ceil(m/2);
        idx{k} = [p+1:m 1:p];
    end
    y = x(idx{:});
end

이 함수는 셀형 배열 idx에 인덱스 벡터를 저장합니다. 이 셀형 배열을 작성하는 작업은 상대적으로 간단합니다. N차원 각각에 대해, 해당 차원의 크기를 확인하고 중간점에 가장 가까운 정수 인덱스를 찾습니다. 그런 다음, 해당 차원의 두 절반을 서로 바꾸는 벡터를 생성합니다.

인덱싱 작업에 셀형 배열을 사용하여 인덱스 벡터와 쉼표로 구분된 목록을 저장함으로써 fftshift는 단일 연산 y = x(idx{:})만 사용하여 임의의 차원 배열을 전환합니다. 명시적 인덱싱을 사용하려면 함수가 처리하게 할 차원 각각에 대해 하나의 if 문을 작성해야 합니다.

    if ndims(x) == 1
        y = x(index1);
    else if ndims(x) == 2
        y = x(index1,index2);
        end
    end

쉼표로 구분된 목록을 사용하지 않고 이를 처리할 수 있는 또 다른 방법은 각 차원에 대해 루프를 실행하여 한 번에 하나씩 차원을 변환하고 매번 데이터를 이동하는 것입니다. 쉼표로 구분된 목록을 사용하면 데이터를 한 번만 이동하면 됩니다. 쉼표로 구분된 목록을 사용하면 임의의 차원 수로 전환하는 작업을 매우 간단하게 일반화할 수 있습니다.