MATLAB 을 사용하여 알고리즘을 개발하고 분석하면서 MATLAB 의 다양한 그래프 기능을 사용하실 것이라고 생각합니다. 10 년도 전에 MATLAB 을 학부 시절에 접하고, MATLAB 의 그래프 기능들이 정말 유용하다는 생각을 했던 기억이 있습니다.

오늘은 MATLAB 을 사용하여 그래프의 영역을 나타내는 방법에 대해서 조금 소개를 하려 합니다.

예를 들어 아래 두 그래프로 둘러싸인 영역을 표시하고 싶을 때 MATLAB으로 어떻게 표현해야 되는지에 대해서 소개를 하려 합니다.

y = x+3

y = 2*x-6

위 두개의 그래프로 둘러싸인 영역을 표시하는 간단한 코드는 아래와 같습니다. 아래 코드에서 설명할 부분은 x_, y_ 를 설정하는 부분과 fill() 이라는 함수에 대한 부분이 될 거 같은데~ fill 함수는 이름에서도 알 수 있듯이 다각형 내부의 색을 채워주는 함수입니다. fill 함수가 다각형의 좌표값을 필요로 하다 보니 x_, y_ 값을 아래와 같이 표현해서 닫힌 형태의 다각형으로 만들어 준 것이고 마지막 인자인 ‘r’ 은 red 즉 빨간색으로 표시하라는 뜻입니다.

x=linspace(-10,30,1001);

y1 = x+3;

y2 = 2*x-6;

x_=[x fliplr(x)];

y_= [y1 fliplr(y2)];

figure

fill(x_, y_, 'r')

grid on

그래프는 아래와 같이 표현됩니다.

fill 함수와 유사한 함수로 patch 함수가 있고~ patch 함수는 하나 이상의 채워진 다각형을 만들어 주는 함수입니다. 다각형 한개를 그릴때는 사실 동일하다고 볼 수도 있을 것 같네요. 위 코드에서 fill 을 patch 로 바꿔도 동일한 결과를 얻을 수 있습니다.

fill, patch 함수가 다각형 내부의 색을 채워주는 함수이다 보니 x_, y_ 와 같은 변수들을 만들어서 사용했는데~ 조금 더 쉽게 영역을 표시하는 함수로 area 함수를 사용할 수가 있습니다. 아래 메뉴얼에도 나와 있지만 2차원 그래프에서 그래프 선과 basevalue 로 둘러싸인 부분의 영역을 표시해주는 함수입니다. basevalue 의 디폴트 값은 0 입니다.

https://kr.mathworks.com/help/matlab/ref/area.html?searchHighlight=area&s_tid=doc_srchtitle

area 함수를 사용한 코드는 아래와 같습니다.

x=linspace(-10,30,1001);

y1 = x+3;

y2 = 2*x-6;

x=x(:);

y=[y1(:) y2(:)];

figure

h = area(x, y);

grid on

코드를 표현하는 것은 조금 더 쉬운 듯한데…. 그래프를 확인해 보면 의도와는 뭔가 조금 다른 것 같습니다. 즉 원하지 않는 파란색 영역도 나타낸 것을 확인할 수 있습니다.

파란색 영역을 없애기 위해서 조금 더 코드를 추가해야 될 것입니다. 파란색 영역을 투명하게 만들기 위해서 해당 부분의 색깔을 흰색으로 만들어 준 후에~ alpha 함수를 사용하여 투명도를 조절해 줬습니다~

h(2).FaceColor = [1 0 0];

h(1).FaceColor = [1 1 1];

alpha(h(1),0.1)

이렇게 해서 나타나는 그래프를 보면~ 아래와 같이 원하는 영역만 표시된 그래프를 얻을 수가 있습니다~



신호 처리에서 convolution은 필터링의 기본이 되는 만큼 매우 자주 사용하게 되는데요~

 

아래 글에서는 MATLAB conv() 함수를 사용하는 게 아닌 for 문을 사용해서 Convolution 을 수행하는 방법에 대해 소개한 적이 있고~

 

http://iamaman.tistory.com/317

 

아래 글에서는 FFT 를 활용하여 convolution 을 하는 방법에 대해 소개한 적이 있습니다.

 

http://iamaman.tistory.com/131

 

오늘은 convolution 수행 시 인덱스를 계산하는 방법에 대해 소개하려 합니다.

 

보통 conv() 함수는 convolution을 수행한 결과만 나오게 됩니다.

 

그런데 신호 및 시스템이나 DSP 등의 과목에서 convolution을 배울 때는 인덱스도 나오게 되죠~

 

다음과 같은 신호 x(n), h(n) 에 대해 convolution 을 수행해 보면~

 

x=ones(1,11);

nx = -5:5;

 

h=linspace(0,5,10);

nh = 0:9;

 

plot(nx,x,nh,h),grid on

legend('x','h','Location','northwest')

axis([-10 10 0 10])

 

 

다음과 같이 인덱스를 포함한 convolution 수행 코드를 작성 할 수 있습니다.

 

function [y, ny] = conv_m(x,nx,h,nh) 

diff1 = (nx(2)-nx(1));

diff2 = (nh(2)-nh(1));


assert(abs(diff1 - diff2) <= eps,'Time difference is not equal!!')

   

ny= linspace((nh(1)+nx(1)),(nh(end)+nx(end)),length(x)+length(h)-1);


y = conv(x,h);

 

위 conv_m() 함수를 사용하여 위에서 소개한 x(n), h(n) 에 대한 convolution 을 수행하면

 

[y, ny] = conv_m(x,nx,h,nh);

plot(ny,y),grid on

legend('Convolution Result','Location','northwest')

 

인덱스가 -5~14까지 인 다음과 같은 결과나 나오는 것을 확인 할 수 있습니다.

 

인덱스를 포함한 Convolution~ 참 쉽죠~



오늘은 파이썬을 활용하여 각도를 clock 값으로 변환하는 예제에 대해 알아보려 합니다.

 

MATLAB Stateflow 에서 junction 을 연결 할 때 junction 의 연결 지점을 clock 값으로 설정 합니다.

 

이러한 경우 각도에 대한 clock 값을 알 필요가 있습니다.

 

아래는 각도를 clock 값으로 변환해 주는 코드입니다.

 

Anaconda 를 설치해서 사용 중이라 numpy 나 matplotlib 은 설치가 되어 있는 상태입니다.

 

import matplotlib.pyplot as plt

import numpy as np

 

def degreeToClock(degV):

    return str((-(degV / 360.0 * 12.0) + 3) % 12)

 

 

if __name__ == '__main__':

    x = np.linspace(-180, 180, 360)

    y = map(degreeToClock, x)

    line, = plt.plot(x, y, '--', linewidth=2)

      

    plt.grid(True)

    plt.xlabel('Degree')

    plt.ylabel('Clock')

    plt.title('Degree to Clock')

      

    plt.savefig('C:\Degree_to_Clock.png')

    plt.show()

 

다운로드 링크 : Gist


 

위 코드를 실행해 보면 -180~ 180 도 에 대해 아래 그래프와 같이 변환 됩니다.

 


윈도우에서 리눅스 명령 또는 툴들을 사용할 때 GOW 도 사용하지만


2012/11/11 - [유틸] - GNU On Windows 를 이용하여 Windows 에서 Linux 명령어 사용하기


많은 분들이 훨씬 더 많은 기능을 담고 있는 Cygwin 을 주로 사용하실 텐데요~


아래 주소의 Cygwin 홈페이지를 가보니 요즘은 64 비트 Cygwin 도 나왔더군요.

 

http://cygwin.com/install.html

 

32 비트를 설치하시려면~ setup-x86.exe 파일을,  64 비트를 설치하시려면~ setup-x86_64.exe 파일을 다운로드 받아서 설치하시면 됩니다.

 

 

저도 요즘은 64 비트 윈도우를 사용하다 보니 64 비트 Cygwin 을 낼름 깔아 봤습니다.

 

설치 방법은 밑에 글 참조 바랍니다. 

2012/10/07 - [유틸] - Cygwin에서 간단히 C 코딩해보기~

 

제 블로그에서는 MATLAB 을 주로 설명하지만 리눅스에서는 Octave 라는 MATLAB 과 굉장히 유사한 프로그램이 있습니다.

 

Cygwin 에서 Octave 를 설치하실 때, Octave 는 Math 카테고리에 있으니깐 Math 옆의 Default 라고 되어 있는 글을 클릭해서 Install 로 바꿔준 후에 설치하셔야 합니다.

 

 

기쁜 마음으로 ~ Cygwin64 Terminal 에서 다음과 같이 Octave를 실행했습니다.

 

뭐 당연히~ 잘~~ 실행 되더군요.

 

그래서 간단히 사용을 해 봤죠.

 

x=linspace(0, 2*pi,100);

y=sin(x);

plot(x,y)

 

간단하게~ sin() 그래프 그리는 건데…. 헉!! 아래와 같은 메시지가 나오면서 에러가 뜨더군요.

 

0 [main] octave-3.6.4 4852 child_info_fork::abort: ……………. 어쩌구 저쩌구… 블라 블라~


 

그래서 32 비트에서도 해보니 아래와 같이 잘 나오더군요.

 

64 비트에서는 안 되는게 이상해서 구글링을 해보니 아래 글의 중간 정도에 해결 방법이 있었습니다.

 

http://octave.1599824.n4.nabble.com/Octave-3-6-x-for-windows-td4649424.html

 

아래 첨부한 rebaseall_example.bat 파일을 C:\cygwin64 폴더에 다운로드 한 후에~ 아래 그림처럼 관리자 권한으로 실행해 줍니다.


rebaseall_example.bat


 

 

rebaseall_example.bat 파일 내용 >

@echo off

 

cd bin

 

dash -l -i -c "echo ' !! Starting rebasing. Be patient !! \n' ; rebaseall "

 

echo .

echo !! No rebaseall errors ? Than done and fine, !!

echo !! otherwise you have others cygwin process running !!

echo .

 

pause

 

조금 기달렸다가~ 아래와 같은 화면이 나오면 해당 화면을 닫아 주시면 문제가 해결됩니다.

 

이제 Octave 를 다시 실행 시키고 그래프를 그려 볼까요?

 

이제 아래 그림처럼 촤라락~~ 하고 그래프가 나오는 것을 확인 할 수 있습니다.

 

물론 예쁜 그림은 아니지만~


MATLAB 에서 매트릭스의 인덱스에 대한 처리는 정말 기본 중에 기본이라 할 수 있다. 이번 포스팅에서는 매트릭스 인덱스 처리에 대해 설명한다.

 

1부터 10까지의 정수로 구성된 벡터 X를 발생시켜 보자.

 

  • 콜론 연산자 이용

X=1:10

X =

1 2 3 4 5 6 7 8 9 10

  • linspace() 함수 이용

X=linspace(1,10,10)

X =

1 2 3 4 5 6 7 8 9 10

 

  • 무식하게 다 써주기

X=[1 2 3 4 5 6 7 8 9 10]

X =

1 2 3 4 5 6 7 8 9 10

 

위 세가지 방법 모두 동일한 결과를 나타낸다. linspace(1, 10, 10) 함수의 첫 번째 1 은 시작 값 , 두 번째 10은 마지막값, 그리고 세번째 10 은 전체 개수를 의미 한다.

 

그럼 X 라는 벡터에서 인덱스를 이용하여 각 인자 또는 벡터를 만들어 보자. MATLAB 의 인덱스는 C/C++ 와는 다르게 1 부터 시작한다는데 주의 해야 한다.

 

인덱스 10 , 2 , 5 번째 값을 추려 보자 .

X([10 2 5])

ans =

10 2 5

 

위 코드와 같이 X라는 변수의 인덱스에 접근을 할 때는 괄호 ( ) 를 하고 그 안에 인덱스 값들을 써 주면 된다. 한 개의 인덱스에 접근 하는 경우에는 X(5) 이런 식으로 한 값만 써주면 되지만 여러 인덱스에 접근하는 경우에는 [ ] 을 써서 벡터 또는 매트릭스의 형태로 써 줘야 한다.

 

다음으로 X 의 값 중에 5 보다 큰 값들만 뽑아 보자.

 

  • logical index 를 이용하는 방법

logical_index=X>5

logical_index =

0 0 0 0 0 1 1 1 1 1

 

class(logical_index)

ans =

logical

 

X(logical_index)

ans =

6 7 8 9 10

 

  • index 를 이용하는 방법

index=find(X>5)

index =

6 7 8 9 10

 

X(index)

ans =

6 7 8 9 10

 

MATLAB에서는 위와 같이 두 가지 방식으로 인덱스에 접근 할 수 있다. 1 부분과 같이 logical 값을 이용하는 방법도 있다는 것을 알아두기 바란다. logical index 를 이용할 때는 코드가 더 간단해 지며, 보통은 아래와 같이 쓰는 게 일반 적이다.

X(X>5)

 

ans =

6 7 8 9 10

 

이제 매트릭스의 인덱스에 대해 살펴 보자.

 

X=magic(3)

 

X =

8 1 6

3 5 7

4 9 2

 

위 X 의 3, 2 , 5 번째 값들을 추려 보자.

 

X([3 2 5])

 

ans =

4 3 5

 

매트릭스는 항상 열을 기준으로 인덱싱을 한다는 것을 알아야 한다.

 

따라서 X 의 3, 2, 5 번째 값을 인데싱 할 때는 매트릭스 X 를 다음과 같이 열을 기준으로 나열해 보면 인덱스를 정확히 알 수 있을 것이다.

 

X(:)

 

ans =

8

3

4

1

5

9

6

7

2

 

위 결과를 보면 첫 번째 열 다음에 두 번째 열, 세 번째 열 이렇게 나열하는 것을 확인 할 수 있다.

 

그리고 위 결과에서 3번째 2번째 5번째 값을 뽑으면 4, 3, 5 라는 값이 출력된다.

 

 

이제 행 과 열에 따른 인덱싱을 알아 보자.

 

위의 X 매트릭스에 대하여 [1,3] 행 2 열 의 값들을 추려 보자.

 

X([1 3], 2)

 

ans =

1

9

 

위와 같이 매트릭스의 행과 열 인덱스를 통해 간단하게 인자 값들에 접근 할 수 있다.


+ Recent posts