매트랩 행렬 위치 찾기 - maeteulaeb haenglyeol wichi chajgi

※이 글은 매틀랩 도움말센터 MATLAB Documentation - MathWorks 한국을 가지고 따라 하며 만든 자료입니다

이번에는 배열 인덱싱입니다

저번 포스팅에서 matlab은 모든 변수는 데이터의 형과 관계없이 다차원 배열이라 말씀드렸습니다 이렇게 생성된 배열 내 특정 요소에 접근하는 걸 배열 인덱싱이라 합니다

원래는 논리 접근, 선형 접근, 위치 요소 접근 3가지 방법이 있습니다만 이번 도움말에서는 위치 요소와 선형 요소에 대한 접근만 다룹니다. 그럼 마방진 함수를 통해 배열을 만들고 특정 요소에 접근해보겠습니다.

위치 요소를 이용한 배열 인덱싱

마방진은 행과 열의 합계가 동일하고 1~N^2 범위의 정수로 생성된 NxN행렬을 말합니다  정상적인 마방진을 만들려면 들어가는 인수는 3보다 크거나 같아야 합니다 

magic(N)

배열 내 특정 요소를 참조하는 방법은 2가지가 있습니다 

  • 행 첨자와 열 첨자를 지정해서 접근하는 방법(위치 요소 인덱싱)
a=magic(4)
a(4,2)
매트랩 행렬 위치 찾기 - maeteulaeb haenglyeol wichi chajgi

a(4.2)를 통해 4행 2열에 올바르게 접근한 걸 볼 수 있습니다.

  • 단일 첨자를 이용하여 열을 순서대로 아래쪽을 향하여 세어 나가는 법이 있습니다(선형 인덱싱)
a=magic(4)
a(8)
매트랩 행렬 위치 찾기 - maeteulaeb haenglyeol wichi chajgi

화살표 방향으로 진행하며 세어서  접근합니다  이러한 단일 첨자를 사용하여 특정 요소를 참조하는 것을 선형 인덱싱(Linear Indexing)이라 합니다 

배열 요소 삽입

대입문 우변에서 배열 범위를 벗어난 요소를 참조하려고 하면 matlab에서 오류가 발생합니다

a=magic(4)
test=a(4,5)
매트랩 행렬 위치 찾기 - maeteulaeb haenglyeol wichi chajgi

하지만 반대로 대입문 좌변에서 현재 범위를 벗어난 요소를 지정할 수 있습니다 그러면 배열은 알아서 크기를 늘립니다

a=magic(4)
a(4,5)=17
매트랩 행렬 위치 찾기 - maeteulaeb haenglyeol wichi chajgi

배열 여러 요소를 참조하기

배열의 요소를 여러 개 참조하려면 콜론 연산자를 이용하여 접근할 수 있습니다 start:end 형식으로 범위를 지정할 수 있습니다

a의 2번째 열에 위치한 처음 3행의 요소를 가져와보겠습니다

a=magic(4)
a(1:3,2)
매트랩 행렬 위치 찾기 - maeteulaeb haenglyeol wichi chajgi
매트랩 행렬 위치 찾기 - maeteulaeb haenglyeol wichi chajgi
요렇게 이해하도록합시다

start:end 구조에서 양쪽 값을 지정하지 않고 콜론만 사용하면 해당 차원의 모든 요소를 지정할 수 있습니다 예를 들어 a배열의 3번째 행에 있는 모든 열을 가져와보겠습니다

a=magic(4)
a(3,:)
매트랩 행렬 위치 찾기 - maeteulaeb haenglyeol wichi chajgi

또한 콜론 연산자를 이용하면 start:step:end 구조의 step간격의 값으로 구성된 배열을 만들 수 있습니다

a=0:10:100
매트랩 행렬 위치 찾기 - maeteulaeb haenglyeol wichi chajgi

만약 step 부분을 생략하면 기본값은 1로 지정됩니다

5. find 함수 (기본) 


find 함수는 특정한 조건을 걸어주면 해당되는 행과 열을 찾아주는 함수입니다. 

예를 들어볼게요.

>> a=[0 2 1 5 3 0 2 4 0]

a =

     0     2     1     5     3     0     2     4     0

>> find(a)

ans =

     2     3     4     5     7     8

find(a)라는 함수를 썼는데 뭘 찾았죠?

0 이 아닌 열을 찾았습니다. 2,3,4,5,7,8 열이 nonzero 값입니다. 

디폴트가 뭔지 아시겠죠? 그냥 find 함수를 쓰면 0이 아닌 열을 찾아줍니다. 열만 찾아주는건 아니겠죠? 아래 예시를 보시죠

>> b = [1; 2; 0; 0; 1; 3; 0; 3]

b =

     1

     2

     0

     0

     1

     3

     0

     3

>> find(b)

ans =

     1

     2

     5

     6

     8

이번에는 0 이 아닌 행을 찾아줍니다. ans가 세로로 표시되구요. 그렇다면 행과열이 모두 1보다 큰 행렬의 경우는 어떨지 봅시다. 

>> c=[1 3 0;0 0 1;2 5 1;2 0 3]

c =

     1     3     0

     0     0     1

     2     5     1

     2     0     3

>> find(c)

ans =

     1

     3

     4

     5

     7

    10

    11

    12

흠..1열부터 아래로 내려가면서 0이 아닌 경우를 찾아주네요. 예를들어 7이라고 하면 3행3열이 되네요. 몇행몇열인지를 또 계산해주어야 하는데. 한번에 알 수 있는 방법이 있습니다. 아래처럼 해봅시다.

>> [row col]=find(c)

row =

     1

     3

     4

     1

     3

     2

     3

     4

col =

     1

     1

     1

     2

     2

     3

     3

     3

0이 아닌 행과 열을 보여줍니다. 순서대로 1행1열, 3행1열, 4행1열....이렇게 읽어주시면 됩니다.