Main Content

쉼표로 구분된 목록(CSV)

쉼표로 구분된 목록이란?

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

1,2,3
ans =

     1


ans =

     2


ans =

     3

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

쉼표로 구분된 목록 생성

셀형 배열 또는 MATLAB 구조체에서 쉼표로 구분된 목록을 생성할 수 있습니다.

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

셀형 배열에서 여러 요소를 추출하면 쉼표로 구분된 목록이 결과로 생성됩니다. 4×6 셀형 배열을 정의합니다.

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

  4×6 cell array

    {[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개 필드가 포함된 4×1 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을 사용하여 쉼표로 구분된 목록에 포함된 각각의 요소를 덮어씁니다. 먼저, 요소를 2개 가진 목록을 초기화합니다. :을 인덱스로 사용할 경우 정의되지 않은 변수에 쉼표로 구분된 목록을 사용하여 값을 대입할 수 없기 때문에 이 단계가 필요합니다. 자세한 내용은 정의되지 않은 변수에 쉼표로 구분된 목록 대입하기 항목을 참조하십시오.

c{1} = []; 
c{2} = [];
c{:}
ans =

     []


ans =

     []

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

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

    10    20


ans =

    14    12

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

s(1).field1 = [[]];
s(2).field1 = [[]];
s.field1
ans =

     []


ans =

     []

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

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

    10    20


ans =

    14    12

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

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

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

배열 생성하기

행렬 또는 배열을 생성할 때 쉼표로 구분된 목록을 사용하여 일련의 요소를 입력할 수 있습니다. C{:,5}를 사용하여 요소의 목록을 지정하면 MATLAB은 4개의 개별 요소를 삽입합니다.

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
A = {'Hello',C{:,5},magic(4)}
A =

  1×6 cell array

    {'Hello'}    {[34]}    {[36]}    {[38]}    {[40]}    {4×4 double}

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

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

  1×3 cell array

    {'Hello'}    {4×6 cell}    {4×4 double}

배열 표시하기

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

A{:}
ans =

    'Hello'


ans =

  4×6 cell array

    {[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

함수 호출 인수

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

이 예제에서는 여러 개의 이름-값 인수를 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 =

  1×3 cell array

    {'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

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

쉼표로 구분된 목록을 사용한 작업의 문제 해결하기

일반적인 MATLAB 작업과 인덱싱 기법 중에는 쉼표로 구분된 목록에 직접 사용할 수 없는 경우가 있습니다. 이 섹션에서는 쉼표로 구분된 목록을 사용할 때 발생할 수 있는 몇 가지 오류의 세부 정보를 제공하고 근본적인 문제를 해결하는 방법을 설명합니다.

중간 인덱싱에서 쉼표로 구분된 목록이 생성됨

중괄호 또는 점을 사용한 복합 인덱싱 표현식은 쉼표로 구분된 목록을 생성할 수 있습니다. 이 목록의 개별 요소에 액세스하려면 이들 요소를 참조해야 합니다.

예를 들어, 2개의 3×3 double형 행렬을 포함하는 1×2 셀형 배열을 생성해 보겠습니다.

A = {magic(3),rand(3)}
A =

  1×2 cell array

    {3×3 double}    {3×3 double}

중괄호 인덱싱을 사용하여 두 요소를 표시합니다.

A{1,:}
ans =

     8     1     6
     3     5     7
     4     9     2


ans =

    0.7922    0.0357    0.6787
    0.9595    0.8491    0.7577
    0.6557    0.9340    0.7431

이러한 방식으로 A의 요소를 참조하면 셀형 배열에 포함된 두 행렬을 모두 포함하는 목록이 쉼표로 구분된 형태로 생성됩니다. 이 경우 괄호 인덱싱을 사용하여 목록의 두 행렬에서 (1,2)에 있는 항목을 가져올 수 없습니다.

A{1,:}(1,2)
Intermediate brace '{}' indexing produced a comma-separated list with 
2 values, but it must produce a single value when followed by 
subsequent indexing operations.

셀형 배열의 두 행렬에서 (1,2)에 있는 항목을 가져오려면 셀의 요소를 개별적으로 참조해야 합니다.

A{1,1}(1,2)
A{1,2}(1,2)
ans =

     1


ans =

    0.0357

표현식에서 단일 값 대신 쉼표로 구분된 목록이 생성됨

조건문, 논리 연산자, 루프 및 switch 문에 대한 인수는 쉼표로 구분된 목록일 수 없습니다. 예를 들어, for 루프를 사용하여 쉼표로 구분된 목록 내용을 직접 순환할 수 없습니다.

처음 세 개의 소수로 구성된 셀형 배열을 만듭니다.

A = cell(1,3);
A{1} = 2;
A{2} = 3;
A{3} = 5;

A{:}은 이 3개의 값을 쉼표로 구분된 목록으로 생성합니다.

A{:}
ans =

     2


ans =

     3


ans =

     5

A{:}으로 생성된 쉼표로 구분된 목록을 for를 사용하여 순환하면 오류가 발생합니다.

for c = A{:}
disp(c)
end
A brace '{}' indexing expression produced a comma-separated list with
3 values where only a single value is allowed.

A의 내용을 순환하려면 A{:}을 대괄호로 묶어 값을 벡터로 결합합니다.

for c = [A{:}]
disp(c)
end
     2

     3

     5

간단한 대입문을 사용하여 여러 개의 요소 대입하기

배열을 사용할 때와 달리, 쉼표로 구분된 목록의 여러 요소에 간단한 대입문을 사용하여 값을 대입하면 오류가 발생합니다. 예를 들어, 2×3 셀형 배열을 정의해 보겠습니다.

B = cell(2,3);

:B의 인덱스로 사용하여 배열의 모든 셀에 값 5를 대입하면 오류가 발생합니다.

B{:} = 5
Assigning to 6 elements using a simple assignment statement is not
supported. Consider using comma-separated list assignment.

이 대입을 수행하는 방법 중 하나는 B{:}을 대괄호로 묶고 deal 함수를 사용하는 것입니다.

[B{:}] = deal(5)
B =

  2×3 cell array

    {[5]}    {[5]}    {[5]}
    {[5]}    {[5]}    {[5]}

정의되지 않은 변수에 쉼표로 구분된 목록 대입하기

:을 인덱스로 사용하여, 정의되지 않은 변수에 쉼표로 구분된 목록을 대입할 수 없습니다. 쉼표로 구분된 목록에 대입하기의 예제에서는 :을 인덱스로 사용하여 변수 x에 새 값을 대입하기 전에 명시적 인덱스를 사용하여 쉼표로 구분된 목록으로 이 변수를 정의했습니다.

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

    10    20


ans =

    14    12

초기화되지 않은 변수에 동일한 대입을 수행하면 오류가 발생합니다.

[y{:}] = deal([10 20],[14 12]);
Comma-separated list assignment to a nonexistent variable is not
supported when any index is a colon (:). Use explicit indices or
define the variable before performing the assignment.

이 문제를 해결하려면 x와 동일한 방식으로 y를 초기화하거나, deal 함수로 생성된 값 개수를 수용할 정도로 충분한 명시적 인덱스를 사용하여 y를 생성하십시오.

[y{1:2}] = deal([10 20],[14 12])
y =

  1×2 cell array

    {[10 20]}    {[14 12]}

참고 항목

| |