매트랩은 기본적으로 벡터와 행렬 연산을 기반으로(주로) 동작합니다. 

따라서 매트랩 프로그래밍을 하는 과정중에 알고리즘에 의해 행렬이나 벡터의 원소 위치를 랜덤하게 바꾸어야(섞거나)하는 상황이 생기기도 합니다. 


 사실 포스팅 하기에는 매우 단순한 함수를 사용하지만 간혹 모르시는 분들이 계셔서 올려봅니다. 


그럼 간단한 예제와 함께 살펴보겠습니다.


예제 1) 


%일단 3x3 행렬을 만들어 보도록 하겠습니다. 

>> A=[1 2 3 ; 4 5 6 ; 7 8 9]

A= 

     1     2     3 
     4     5     6 
     7     8     9 

%이때, 행렬 A의 특정 위치의 원소값을 행과 열을 위치로 확인이 가능하지만 행렬의 전체 원소의 개수에 따라서 확인이 가능합니다. 

%매트랩은 기본적으로 열(column)벡터를 기준으로 연산하기 때문에 A(1)=1, A(3)=7, A(4)=2, etc., 와 같은 순서대로 배치가 됩니다.

%그럼 이어서 A 행렬의 첫번째 열의 순서를 랜덤하게 재배치 해보도록 하겠습니다.

>>idx = randperm(3)

idx = 

      3 1 2 

% randperm(n) 함수는 1에서 n(구간의 끝점 포함)까지의 정수로 구성된 난수 순열을 행 벡터로 

% 반환합니다. 즉, 내가 재배치하고 싶은 벡터의 길이(n)에 맞춰 난수를 생성하여 사용하면 됩니다.

>> A( : , 1 ) = A( idx, 1)

A = 

     7     2     3

     1     5     6

     4     8     9 

% A 행렬의 첫번째 열벡터의 원소 순서가 바뀐걸 확인할 수 있습니다. 

예제 2)


% 예제1을 응용하면 아까 말씀드린 행렬 원소 전체를 랜덤하게 재배치할 수 있습니다.

>> A=[1 2 3 ; 4 5 6 ; 7 8 9]

A= 

     1     2     3 
     4     5     6 
     7     8     9 

>>idx2 = randperm( numel(A) )

% randperm함수를 이용해서 A 행렬의 원소 개수에 맞춰 난수를 생성해봅시다. 이때 numel(A) 함수는 A의 전체 원소개수를 출력해줍니다. 

%즉, 여기서는 A행렬의 원소가 9개이니 numel(A)의 값은 9가 되겠죠? 

idx2 =

     5     1     8     2     9     7     3     4     6

>>A = A(idx2)

A = 

      5     1     6     4     9     3     7     2     8

% A(idx2) = A(5), A(1), A(8),... A(6) 을 의미하게 됩니다. 그러면 각각의 원소값을 확인해보면 A(5)=5, A(1)=1, A(8)=6,... 이 되니까 이 순서대로 재배치가 되겠죠?

% 하지만 우리가 원하는건 행벡터가 아닌 처음 3x3 행렬의 형태이니 다시 원래대로 돌려 놓습니다.

>>A = reshape(A,3,3)

A =
     5     4     7
     1     9     2
     6     3     8
% randperm 함수로 생성한 난수를 이용해 A 행렬의 원소를 랜덤하게 재배치 했습니다. 

예제 3)


%예제 1과 2에서 배운 내용을 한꺼번에 정리해서 아래와 같이 사용하시면 됩니다. 

A = reshape( A( randperm( numel(A) ) ), 3, 3);


이번 포스팅은 randperm 함수를 이용한 행렬 원소의 재배치에 대해서 알아보았습니다. 


 항상 느끼는 거지만 매트랩에는 정말 많은 함수들이 구현되어 있는 만큼 내가 모르는 함수도 많기 때문에 매트랩을 사용하시다가 막히시는 부분이 있으면 구글링을 먼저 해보시면 분명히 원하는 기능을 하는 함수나 혹은 기능 구현의 부분적인 함수를 찾으실 수 있습니다. 

+ Recent posts