매트랩 배열 저장 - maeteulaeb baeyeol jeojang

매트랩에서 2차원 배열을 히트맵 이미지로 출력하고 저장하는 방법

📂매트랩

Show

    how to plot and save arrays as heatmap images in matlab

    Imagesc

    imagesc 함수를 쓰면 2차원 배열을 히트맵으로 출력할 수 있다. colorbar는 스케일을 보여주는 컬러바를 같이 출력하는 설정이다.

    N=2^8;
    p=phantom('Modified Shepp-Logan',N);
    
    figure()
    imagesc(p)
    colorbar
    

    매트랩 배열 저장 - maeteulaeb baeyeol jeojang

    저장

    방법1

    saveas 함수를 써서 위에서 띄운 figure를 저장할 수 있다. 이때 설정 gcf는 현재 figure를 의미한다. 그러면 아래의 그림이 저장된다.

    N=2^8;
    p=phantom('Modified Shepp-Logan',N);
    
    figure()
    imagesc(p)
    colorbar
    
    saveas(gcf,'phantom.png')
    

    매트랩 배열 저장 - maeteulaeb baeyeol jeojang

    방법2

    아래 사진과 같이 figure창에서 직접 저장할 수도 있다.

    매트랩 배열 저장 - maeteulaeb baeyeol jeojang

    타언어

    • 줄리아에서

     MATLAB에서 벡터의 원소를 참조하거나 벡터의 원하는 위치에 값을 설정하려고 할때는 아래와 같이 한다.

    >> b = a(k)
    >> a(k) = b

    위에서 첫 번째 명령은 a벡터의 k번째 요소를 변수b에 저장하라는 것이고 두 번째 명령은 b변수값을 a벡터의 k번째 자리에 저장하라는 것이다. 여기서 a벡터는 행벡터이든 열벡터이든 동일하게 적용된다. 아래의 예를 보자

    >> a=[8:-2:2]’
    a =
    8
    6
    4
    2

    >> b=a(3)
    b =
    4

    >> a(2)=0
    a =
    8
    0
    4
    2

     행렬의 한 원소에 접근하여 원하는 위치에 값을 읽어오거나 바꿀려고 할 때는 아래와 같이 괄호 안에 행 수와 열 수를 콤마(,)로 구별하여 지정한다.

    >> B = A(k1,k2)
    >> A(k1,k2) = B

    즉, 행렬 A의 k1행 k2열 원소를 참조하고자 할 때 A(k1,k2)로 입력한다.

    >> A = [ 1 2 3; 4 5 6; 7 8 9 ]
    A =
    1 2 3
    4 5 6
    7 8 9
    >> A(1,2) 󰎠 % 1행 2열 원소
    2
    >> A(1,3) 󰎠 % 1행 3열 원소
    3
    >> A(3,3) 󰎠 % 3행 3열 원소
    9

    만약 어떤 행이나 어떤 열의 모든 원소를 선택하고자 하면, 선택하고자 하는 해당 열이나 행을 지정할 때 콜론(:)을 단독으로 사용한다. 행렬의 지정자로 콜론(:)이 단독으로 쓰이면 ‘전부(all)’라는 의미를 갖는다. 다음 예를 보자.

    >> A(1,:) 󰎠 % 1행의 모든 원소
    1 2 3

    >> A(:,3) 󰎠 % 3열의 모든 원소
    ans =
    3
    6
    9

    여기서 A(1,:)는 ‘1행, 전체’를 가리키고 A(:,3)은 ‘3열,전체’를 가리킨다.

    행이나 열의 특정한 부분만 선택하고자 하면 선택하고자 하는 해당 열이나 행를 벡터로 지정해주면 된다. 예를 들어

    >> A([1 3], :) %1행과 3행만 선택
    1 2 3
    7 8 9
    >> A(:, [2 3]) %2열과 3열만 선텍
    2 3
    5 6
    8 9
    >> A([1 3], [2 3])
    2 3
    8 9

    위에서 마지막 예제의 결과는 다음 그림을 보면 쉽게 이해할 수 있다.

    매트랩 배열 저장 - maeteulaeb baeyeol jeojang

    [그림 1] 선이 겹치는 부분이 선택된다.

    A행렬에서 지정한 행과 열이 겹치는 곳에 위치한 요소만 선택이 되어진다는 것을 [그림 1]을 보면 쉽게 이해할 수 있다. 즉 [그림 1]에서 1행과 3행에 가로선을 그리고 2열과 3열에 가로선을 그어보면 선들이 겹치는 부분만 선택되는 것이다.

     A([1 3], :) 명령어를 읽을 때 ‘A행렬의 1행 전체, 3행 전체’라고 읽으면 정확하고 결과값도 1행 밑에 3행이 위치한다. 그런데 다음 예제롤 하나 더 보고 넘어가자.

    >> A([3 1], :) %3행과 1행만 선택
    7 8 9
    1 2 3
    >> A(:, [3 2]) %3열과 2열만 선텍
    3 2
    6 5
    7 8

    A([3 1], :)명령어와 그 결과를 보면 ‘3행 먼저, 그 다음 1행’순으로 인덱스 벡터에 써준 순서대로 요소를 뽑아낸다는 것을 알 수 있다. A(:, [3 2])도 마찬가지로 ‘3열 먼저. 그 옆에 2열’이라는 것을 알 수 있다.

    이번 포스팅에서는 array를 생성하는 방법과 array 내의 element들을 참조하는 방법에 대해서 알아보도록 하겠습니다.

    구체적인 방법론에 들어가기 앞서, array의 정의가 무엇인지 알 필요가 있을 것 같습니다.

    본 교재에 의하면, MATLAB에서의 array란 수 또는 문자(결국 문자도 수로 표현)가 row 또는 column을 따라 열거된 목록입니다.

    Data type 포스팅에서도 언급했듯, MATLAB에서 array는 data를 저장 및 조작하는 데에 사용하는 근본적인 구조입니다.

    때문에 우리는 앞으로 다양한 변수를 자유롭게 다루고 처리하기 위해서는 array를 다루는 데에 능숙해져야 합니다.

    그럼 이제 array를 선언(생성)하는 방법부터 알아보겠습니다.

    가장 단순한 1D array, 즉 vector를 생성하는 것부터 시작합시다.

    Vector에는 row vector와 column vector가 있습니다.

    Row vector를 선언하기 위해서는 대괄호([ ]) 안에 element들을 입력합니다. Row vector의 element를 구분할 때에는 반드시 space 또는 반점(,)을 사용합니다.

    Column vector 선언 시에도 마찬가지로 대괄호([ ]) 안에 element들을 입력하면 됩니다. 다만, row vector와는 달리 column vector의 element를 구분할 때에는 세미콜론(;) 또는 enter를 이용하여 구분시켜줍니다.

    Fig 1. Assignment of row vectors(arr1, arr2) and column vectors(arr3, arr4)

    Fig 1과 같이 사용자 지정 vector를 간단히 생성할 수 있습니다.

    하지만 [1 2 3 ... 99 100]과 같이 element의 갯수가 상당히 많은 경우에는 이 방법이 비효율적이겠죠.

    이러한 경우를 위한 효율적인 array 생성 방법이 따로 있습니다.

    보편적인 표현을 사용하자면, 특정 범위 내에서 일정한 간격을 가지는 1D array를 생성하는 방법이겠네요.

    여기에는 두 가지 방법이 있습니다.

    첫째는 시작점과 종결점, 그리고 간격을 입력하는 방법입니다.

    대괄호([ ]) 안에 시작점, 간격, 종결점을 순서대로 입력합니다. 각 입력은 콜론(:)으로 구분해주어야 합니다.

    만약 간격이 입력되지 않았을 경우에는 default로 간격이 1로 설정됩니다.

    Fig 2. 1D arrays with constant interval using colon

    간격이 종결점에서 정확이 맞춰지지 않더라도 array는 정상적으로 생성됩니다(Fig 2의 arr7 참고).

    다만 array의 마지막 element는 종결점을 넘어가지 않도록 설정됩니다.

    만약 아래와 같이 array를 선언하면 어떻게 될까요?

    >> arr_test[20:2:10]

    이 경우, array는 생성되지만 element는 아무것도 갖지 않는 빈 array가 만들어집니다.

    두번째 방법은 시작점과 종결점, 그리고 element 갯수를 입력하는 방식입니다.

    함수 linspace를 이용하는 방법인데요, 순서대로 시작점, 종결점, 원하는 element 갯수를 입력합니다.

    만약 element 갯수가 입력되지 않았을 경우에는 default로 총 100개의 element를 가지는 array를 반환합니다.

    Fig 3. 1D arrays with constant interval using linspace

    그럼 이제 2D array, 즉 matrix 생성에 대해서 알아봅시다

    2D array 선언 방식은 1D array 선언 방식과 매우 유사합니다.

    대괄호([ ]) 안에 element를 입력하는데요, row1의 element들을 입력한 다음 row2의 element를 입력, 다음에는 row3의 element를 입력하는 row by row 입력 방식을 따릅니다. Row 내의 element를 구분할 때에는 row vector 선언 시와 마찬가지로 space 또는 반점(,)을 사용하며, column 구분 시에는 column vector 선언과 마찬가지로 세미콜론(;) 또는 enter를 사용하여야 합니다.

    Fig 4. Assignment of 2D arrays

    1D array 선언 시에도 마찬가지지만, element들이 반드시 직접적인 숫자 형태를 띄지 않아도 됩니다.

    수학적 표현을 element로 입력해줄 수도 있으며, 2D array의 경우 row 크기만 동일하다면 앞서 배운 linspace 함수를 이용하는 것 또한 가능합니다(Fig 4의 arr12 참고).

    생성된 array의 이름 옆에 작은따옴표(')를 붙이면 transposed array를 확인할 수 있습니다.

    매트랩 배열 저장 - maeteulaeb baeyeol jeojang

    Fig 5. Transposed arrays

    등차 수열의 1D array를 생성하는 linspace처럼, 특별한 2D array를 생성하기 위한 함수도 있습니다.

    아래 Table 1과 Fig 6를 보시면 쉽게 이해하실 수 있을 것입니다.

     zeros(m,n)

     모든 element가 0인 mxn array 생성

     ones(m,n)

     모든 element가 1인 mxn array 생성

     rand(m,n)

     0부터 1 사이의 임의의 값을 element로 가지는 mxn array 생성

     eye(n)

     nxn identity matrix 생성

    Table 1. Functions for special 2D arrays assignment

    Fig 6. Several special 2D arrays

    그렇다면 이제는 생성된 array 내부의 특정 element를 참조(indexing)하는 법에 대해 알아보겠습니다.

    1D array에서 k번째 값을 참조하려면 어떻게 하면 될까요?

    바로, 소괄호(( ))를 이용하여, 원하는 위치(여기서는 k)를 입력하면 됩니다.

    Fig 7. Indexing in 1D array

    주의할 점은, array의 첫 element의 index가 0이 아니라 1이라는 점입니다.

    많은 언어에서는 0부터 시작하지만, MATLAB에서는 1부터 시작한다는 점을 유의하시기 바랍니다.

    1D array에서의 참조 방식을 보니, 2D array의 참조 방식도 짐작이 가실 것입니다.

    (m,n)자리의 element를 참조하기 위해서는 1D array와 마찬가지로 소괄호(( ))를 사용하시면 됩니다.

    (이 부분은 간단하니 그림 첨부 없이 넘어가도록 하겠습니다)

    하지만 하나의 element만 참조하리란 법은 없죠.

    특정 범위의 element들을 모두 참조해야할 때도 있을 것입니다.

    그 때는 바로 콜론(:)을 사용하시면 됩니다.

    1D array의 m번째 element부터 n번째 element까지를 모두 참조하기 위해서는 아래의 명령어를 사용하시면 됩니다.

    >> arr(m:n)

    만약 m과 n이 입력되지 않는다면 어떻게 될까요?

    바로, 모든 element를 참조합니다(row vector와 column vector 상관 없이 모든 element 참조).

    그런데 이 경우, 1D array의 형태에 상관없이 결과값은 column vector의 형태로 반환되는군요(Fig 8, 9 참고).

    Fig 8. Indexing using colon in a row vector

    Fig 9. Indexing using colon in a column vector

    당연히 콜론(:)을 이용하여 2D array에서도 여러 element를 참조할 수 있습니다.

    앞서 'arr(m,n)'의 방식으로 m번째 row의 n번째 column에 저장된 element를 참조할 수 있다고 배웠는데요,

    그렇다면 아래는 어떤 element를 참조하는지 생각해봅시다.

    >> arr(m:n,p)

    네, 바로 m번째 row부터 n번째 row까지의 element 중에서 p번째 column에 해당하는 element들을 참조하게 됩니다.

    아래 Table 2에 보다 구체적으로 정리해놓았으니 참고하시면 되겠습니다.

     arr(:,n)

     n번째 column의 모든 element를 참조

     arr(m,:)

     m번째 row의 모든 element를 참조

     arr(:,p:q)

     p번째 column부터 q번째 column까지의 모든 element를 참조

     arr(m:n,:)

     m번째 row부터 n번째 row까지의 모든 element를 참조

     arr(m:n,p:q)

     m번째 row부터 n번째 row까지의 모든 element 중, p번째 column부터 q번째 column 사이에 해당되는 모든 element를 참조 

    Table 2. Indexing using colon in a 2D array

    Fig 10. Indexing using colon in a 2D array

    지금까지 배웠던 참조 방식을 응용하면 아래와 같이 복잡한 참조 또한 가능합니다.

    Fig 11. Complex indexing using square brackets, colons, and commas

    참조 방식을 이용하여 기존에 선언된 array를 부분 추가, 부분 삭제와 같은 수정을 할 수도 있습니다.

    예를 들어 arr라는 이름의 2x3 2D array가 이미 선언되있을 때, 아래와 같은 명령어를 입력하면 부분 추가가 가능합니다.

    >> arr(4,4) = 17

    원래 2x3 크기의 arr는 위의 명령에 의해 4x4 matrix로 확장되며, 동시에 (4,4) 자리에는 17이 추가됩니다.

    그러면 그 외의 자리는 어떻게 될까요? 모두 default로 0이 assign 됩니다.

    Fig 12. Adding elements in a 2D array

    Fig 13과 같이, row 또는 column의 크기만 같다면 두 matrix를 합칠 수도 있습니다.

    물론 vector 또한 가능하구요.

    Fig 13. Appending two matrices

    부분 삭제 또한 간단합니다. 삭제하고자 하는 부분을 참조하고, 그 자리에 빈 array를 assign하면 됩니다.

    Fig 14. Delete elements in a 2D array

    마지막으로 array의 size에 관한 함수 두 가지를 소개해드리며 오늘 포스팅을 마무리 짓겠습니다.

     length(A)

     1D array인 A의 길이를 반환

     >> A = [5 9 2 4];

     >> length(A)

     ans =

             4

     size(A)

     2D array인 A의 row와 column의 갯수를 반환

     >> A = [5 1 6; 8 0 2];

     >> size(A)

     ans =

             2     3

    Table 3. Functions related to size of array

    다음에는 array간의 연산에 관하여 포스팅하겠습니다.

    감사합니다