MS office 프로그램 중 엑셀은 굉장히 범용적으로 많이 사용되는 소프트웨어 입니다.

 

일단 본론에 들어가기 앞서 엑셀 공부하기 좋은 사이트부터 말씀 드리죠.

 

엑셀러 권현욱 님의 홈페이지인 http://www.iexceller.com/  인데요.

 

여기는 뭐 말이 필요 없는 사이트 입니다.

 

엑셀 및 VBA 관련 강좌가 굉장히 많이 그리고 잘~ 정리가 되 있습니다.

 

엑셀 공부하시는 분들은 굳이 책 사 볼 필요 없이 위 사이트만 맨날 들어가서 봐도 될 것 같습니다.

 

이제 오늘의 본론으로 들어가서 MATLAB 과 엑셀의 연동에 대해 말씀 드리겠습니다.

 



MATLAB 과 엑셀의 연동을 위해서는 일단 Spreadsheet Link EX 라는 툴박스가 필요 합니다.

 

위 툴박스가 설치되어 있다는 가정하에 설명 드리겠습니다.

 

  • 일단 같은 컴퓨터에 엑셀과 MATLAB 이 깔려 있는 상태에서 엑셀 프로그램을 실행 시킵니다.

 

  • 엑셀의 Office 단추를 클릭 한 후 그림과 같이 Excel 옵션을 클릭합니다.

 

 

  • 추가기능을 클릭한 후 이동을 클릭합니다.

 

 

  • 다음으로 나오는 창에서 찾아보기를 누릅니다.

 

  • MATLAB 이 깔려 있는 폴더에 가서 toolbox\exlink 폴더로 들어갑니다.

 

  • 여기서 자신의 엑셀이 2007 이상이면 excllink2007.xlam 파일을 선택
  • 2003 버전 이하 이면 excllink.xla 를 선택 합니다.

 

  • 이제 다 확인~ 확인~ 하면서 나오면 엑셀과 함께 MATLAB 창이 뜰 겁니다.

 

  • 그리고 엑셀에 아래 그림 처럼 MATLAB 이 표시가 됩니다.

 

 

이제 간단하게 엑셀 파일에서 그림 하나 그려 보죠.

 

  • 다음과 같은 데이터가 있을 때 데이터 전체를 선택합니다.

 

 

  • 그 담에 MATLAB 탭에서 send data to MATLAB 을 클릭하고 변수를 설정합니다.

 

 

  • 저는 그림처럼 a 라고 설정했습니다.

 

  • 그럼 MATLAB Workspace 에 a 라는 변수가 생기게 됩니다.

 

 

  • 이제 MATLAB command 창에서 다음 명령어로 그래프 하나 그려보죠.

 

plot(a(:,1), a(:,2))

 

 

  • 그래프가 떴으면 이제 엑셀의 MATLAB 탭에서 get MATLAB figure 를 클릭하면 아래 그림처럼 MATLAB 그래프가 엑셀로 옵니다.

 

  


  1. 용마담 2012.01.13 16:07

    좋은 정보 감사합니다^^ 오오!! 소리가 절로 나오네요

    • 남성 2012.01.13 16:50 신고

      도움이 되었다니 다행이네요~ 방문해 주셔서 감사합니다 ^^

  2. 찐아 2012.04.13 18:38

    본문에 나와있는 spreadsheet link ex 프로그램은 어떻게 구해야되나요? ㅠㅠ

    • 남성 2012.04.14 10:35 신고

      방문해 주셔서 감사합니다.

      Spreadsheet Link EX 는 외부 프로그램이 아니라 MATLAB 내부의 툴박스 입니다.

      일단 Spreadsheet Link EX 가 있는지 확인 하실때는 command 창에 ver 를 치면 깔려 있는 툴박스 들과 버전이 나오는데요 여기서 확인을 하시면 되고요. 따로 구하는 방법은 구매를 통한 방법과 어둠의 경로를 통한 방법이 있습니다.

    • 찐아 2012.04.15 00:09

      많은 도움이 되었네요 ㅎㅎ 감사합니다 ^^

  3. 박철규 2012.11.08 22:27

    Matlab에 그래프 수치를 excel로 옮기는 방법은 없을까요?

    • 남성 2012.11.09 12:55 신고

      위 포스팅 내용과 같이 Spreadsheet Link EX 를 사용하는 방법도 있구요.

      xlswrite() 함수를 사용하면 excel 파일로 저장 도 할 수 있습니다.

      xlswrite() 함수의 자세한 사용방법은 command 창에 doc xlswrite 라고 치면 볼 수 있습니다.

  4. 메트랩왕초보 2013.02.22 16:10

    메트랩과 엑셀을 연동하여 데이터를 엑셀에 입력해서 드래그해서 send data to Matlab 버튼을 클릭하니
    'ribPutMatrix' 매크로를 실행할 수 없습니다. 이 통합 문서에서 사용할 수 없는 매크로이거나 모든 매크로를 사용하지 못할 수 있습니다 라고 뜨네요 ㅜㅜ

    • 남성 2013.02.22 18:53 신고

      죄송하지만, 저는 한번도 경험 못한 에러라 정확한 이유를 모르겠네요. 위 포스팅을 하는 시점에 저는 엑셀은 2007 버전, MATLAB 은 2011 버전을 사용했던것 같은데, 버전 문제등은 아닌지요? 도움 못되서 죄송합니다.

    • 초보왕 2013.09.18 01:43

      엇 저두 같은 에러가 나오네요..ㅠㅠ 혹시 엑셀과 MATLAB 버전 어떻게 되세요? 저는 엑셀 2013, MATLAB 2009 에요. 에효...ㅜㅠ

    • 남성 2013.09.18 14:39 신고

      아 저는 엑셀 버전 2007 이었고 MATLAB 버전 2012a 였습니다.
      엑셀보다 MATLAB 을 최신 버전으로 맞춰서 사용해 보시는게 좋을것 같네요.

    • 초보왕 2013.09.24 14:50

      매트랩 최신버전이 없는데... 혹시 MS office 중 엑셀만을 다운그레이드시킬 수 있나요? 만약 그렇게되면 에러나는 게 고쳐질까요?

    • 남성 2013.09.25 06:54 신고

      엑셀을 다운그레이드 시킬 수 있는지는 잘 모르겠네요. 상위 버전의 MATLAB 을 구하기 힘들면 엑셀 2007 정도를 구해서 사용해 보시는게 좋을것 같네요.

  5. 2014.06.18 17:25

    비밀댓글입니다

 MATLAB math toolbox 를 이용한 미분은 diff() 함수를 통해 구할 수 있습니다.

 

다음 식에 대하여 diff() 함수를 이용하여 미분을 수행해 보죠.

 

 

 

syms x

 

f = x^4+3*x^2+x+2

 

f =

x^4 + 3*x^2 + x + 2

 

diff(f, x) % f 값을 x 대하여 미분

 

ans =

4*x^3 + 6*x + 1

 

diff(f, x, 2) % f 값을 x 대하여 2 미분

 

ans =

12*x^2 + 6

 

 

 

 

Symbolic 식에 대한 적분은 int() 함수를 통해 이루어 집니다.

 

정적분 뿐만이 아니라 부정 적분도 수행 합니다.

 

 

 

 

int(f,x) % 부정 적분

 

ans =

x^5/5 + x^3 + x^2/2 + 2*x

 

int(f, x, 1, 5) % 1~5 구간에 대한 적분

 

ans =

3844/5

 

 

 

 

 

임의의 구간에 대한 적분도 가능 합니다.

 

위 식을 구간 임의의 구간 a ~ b 에 대해 적분을 수행해 보죠

 

일단 a, b 값을 symbolic 변수로 설정 해 줍니다.

 

 

 

syms a b

 

int(f, x, a, b)

 

ans =

b*(b*(b*(b^2/5 + 1) + 1/2) + 2) - a*(a*(a*(a^2/5 + 1) + 1/2) + 2)

 

 

 

위 식과 같이 임의의 구간에 대해서도 적분가능 한 것을 확인 할 수 있습니다.


cumsum() 함수를 이용하면 vector 또는 matrix 에 대한 누적 합을 아주 쉽게 구할 수가 있다.

 

사용법은 다음과 같으며, 행 또는 열 별로 이전 값과 누적이 되는 것을 확인 할 수 있다.

 




 

cumprod() 함수는 누적 곱을 할 때 이용한다.

 

 

cumtrapz() 함수는 누적 사다리꼴 수치 적분을 할 때 이용한다.

 

 

위 결과에서 trapz() 함수를 이용한 것과 cumtrapz() 함수의 마지막 값이 같음을 알 수 있다.


MATLAB 은 기본적으로 수치 연산을 수행합니다. 즉 , 1+2=3 이런 식으로 말이죠.

 

하지만 MATLAB Symbolic math toolbox 를 이용하면 symbolic 변수들을 이용한 계산도 가능합니다.

 

symbolic math 란 c=a+b 형태로 문자를 이용한 수학 계산을 하는 것을 말합니다.

 

symbolic math 를 이용하기 위해서는 첫 번째로 변수를 symbolic 형태로 선언 해 줘야 합니다.

 

symbolic 선언은 sym() 함수를 이용합니다.

 

  • x=sym('x') 하면 x 를 complex symbolic 변수로 선언합니다. default 로 complex 타입으로 선언하는 거죠

 

  • x=sym('x','real') 하면 x 를 real 변수로 선언합니다.

 

  • x = sym('x', 'positive') 하면 x 를 양의 실수로 선언하고

 

  • x = sym('x', [3 2]) 하면 다음과 같이 x 를 3행 2열의 matrix 로 선언하게 됩니다.

    x =

    [ x1_1, x1_2]

    [ x2_1, x2_2]

    [ x3_1, x3_2]

 

  • x = sym('x', 'clear') 하면 전에 선언했던 x 라는 symbolic 변수를 지웁니다.

 

symbolic 변수 선언을 이런 식으로 하나 하나 해주는 것은 매우 불편합니다. 그래서 보통은 syms 라는 키워드를 이용합니다.

 

  • syms x y z 라고 선언을 하면 x , y , z 를 complex symbolic 변수로 선언하게 됩니다.

 

  • syms x y z real 하면 x , y , z 를 real symbolic 변수로 선언하게 됩니다.

 

  • syms x y z positive 하면 x , y , z 를 양의 실수로 선언하게 됩니다.

 

 

이제 선언하는 방법을 배웠으니, 간단하게 이용하는 방법에 대해 알아보죠.

 

이차 방정식의 해를 구해 보겠습니다. a, b, c, x 를 symbolic 변수로 선언해 준 후, f 라는 변수에 2차 방정식을 써 줬고, solve() 함수를 이용하여 2차 방정식의 해를 구했습니다.

 

 

S 값을 보면 우리가 학생 때 공부했던 근의 공식이 나와 있죠?

 

solve() 함수는 symbolic math toolbox 에 있는 함수로서 대수 방정식의 해를 구해 주는 함수 입니다.

 

위의 결과를 보면 식들이 다 한 줄로 나와서 잘 알아 보기 어렵습니다.

 

이럴 때는 pretty() 함수를 이용하면 다음과 같이 좀 더 보기 좋게~ 예쁘게~ 정리가 됩니다.

 

 


  1. 최곱니다. 2011.11.04 21:44

    최고

  2. 공대생 2017.11.12 11:16

    프리티함수라는게 있었군요!! 잘배워갑니다 ㅎㅎ 정리하기가힘들어서 애먹었는데

오늘의 포스팅에서는 MATLAB 을 이용하여 간단한 수치해석 기법인 bisection method(이분법) 에 대해 알아 보겠습니다.

 

bisection method 는 특정 구간의 중간 값의 부호 판단을 통해 수치적으로 해를 구하는 방식입니다.

 

 

에 대하여 상대오차 10-8 이하가 되도록 [-10, 10] 구간에서 해를 구해 보겠습니다.

 

 

 

command 창에서 결과를 확인하면 Bisection method 를 이용한 결과와 roots() 함수를 이용한 결과가 근사적으로 일치함을 확인 할 수 있습니다.

 

 

 

  


  1. 2018.04.01 00:27

    비밀댓글입니다

    • 남성 2018.04.01 05:12 신고

      아래 링크에서 Bisection method 횟수에 대한 계산 과정을 보시면 최소 횟수 계산 식을 확인 하실수 있습니다.

      https://x-engineer.org/undergraduate-engineering/advanced-mathematics/numerical-methods/the-bisection-method-for-root-finding/

MATLAB 의 rot90() 함수는 matrix 를 시계 반대방향으로 돌리는 기능을 하는 함수입니다.

 

x=magic(4)

x =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

 

위 x 에 대하여 다음과 같이 하면 시계 방대방향으로 90 도 돌리게 됩니다.

 

x1=rot90(x)

x1 =

13 8 12 1

3 10 6 15

2 11 7 14

16 5 9 4

 

위 x 에 90 도씩 3번 시계 방대방향으로 돌리고 싶다면 다음과 같이 하면 됩니다.

 

x2=rot90(x,3)

x2 =

4 9 5 16

14 7 11 2

15 6 10 3

1 12 8 13

 

 

다음으로 설명한 명령어는 triu(), tril() 함수 입니다.

 

triu() 함수는 upper triangular 부분을 구하는 함수이며 tril() 함수는 lower triangular 부분을 구하는 함수입니다.

 

triu() 함수를 실행하면 다음과 같이 됩니다. diagonal 을 포함하여 upper triangular 부분만 남아 있고 나머지는 다 0 이 되게 됩니다.

 

x_triu=triu(x)

x_triu =

16 2 3 13

0 11 10 8

0 0 6 12

0 0 0 1

 

 

triu() 함수에 diagonal 로 부터의 offset 을 줘서 다음과 같이 diagonal 부분을 제외하고 선택도 가능합니다.

 

x_triu2=triu(x,1)

x_triu2 =

0 2 3 13

0 0 10 8

0 0 0 12

0 0 0 0

 

triu() 함수에 – 의 옵셋을 주게 되면 diagonal 아래 방향으로 옵셋을 주게 됩니다.

 

x_triu3=triu(x,-1)

x_triu3 =

16 2 3 13

5 11 10 8

0 7 6 12

0 0 15 1

 

tril() 함수는 다음과 같이 사용합니다.

 

x_tril= tril(x)

x_tril =

16 0 0 0

5 11 0 0

9 7 6 0

4 14 15 1

 

triu() 함수와 사용방법은 비슷하지만 옵셋을 줄 때는 조심하셔야 합니다.

 

x_tril1= tril(x,1)

x_tril1 =

16 2 0 0

5 11 10 0

9 7 6 12

4 14 15 1

 

triu() 함수에서 + 옵셋을 줬을 때는 triangular 의 크기가 줄어들었는데 tril() 함수에서는 + 옵셋을 줬을 때 triangular 의 크기가 커지는 것을 알 수 있습니다.

 

tril(), triu() 함수의 옵셋은 무조건 diagonal 을 기준으로 + 면 위쪽으로 – 면 아래 쪽으로 triangle 의 크기가 변한다고 알고 계시면 됩니다.

 

tril() 함수에서 -1로 옵셋을 주니깐 삼각형이 줄어들게 됩니다.

 

x_tril2= tril(x,-1)

x_tril2 =

0 0 0 0

5 0 0 0

9 7 0 0

4 14 15 0

 

 

MATLAB 에서 '(쉼표) 는 hermitian transpose 를 의미 합니다.

 

hermitian transpose 란 complex conjugate transpose 를 하는 것입니다.

 

다음과 같은 matrix 에 대해 hermitian transpose 를 취해 보죠

 

x=magic(3)+i*magic(3)

x =

8.0000 + 8.0000i 1.0000 + 1.0000i 6.0000 + 6.0000i

3.0000 + 3.0000i 5.0000 + 5.0000i 7.0000 + 7.0000i

4.0000 + 4.0000i 9.0000 + 9.0000i 2.0000 + 2.0000i

 

위 결과를 보면 imaginary 의 부호가 바뀌었고 transpose 된 것을 확인 할 수 있습니다.

 

x'

ans =

8.0000 - 8.0000i 3.0000 - 3.0000i 4.0000 - 4.0000i

1.0000 - 1.0000i 5.0000 - 5.0000i 9.0000 - 9.0000i

6.0000 - 6.0000i 7.0000 - 7.0000i 2.0000 - 2.0000i

 

 

complex conjugate 는 안 하고 transpose 만 할 때는 .' (점 - 쉼표)를 이용해야 합니다.

 

x.'

ans =

8.0000 + 8.0000i 3.0000 + 3.0000i 4.0000 + 4.0000i

1.0000 + 1.0000i 5.0000 + 5.0000i 9.0000 + 9.0000i

6.0000 + 6.0000i 7.0000 + 7.0000i 2.0000 + 2.0000i

 

 

MATLAB 에서 대소문자 변환 관련한 함수로는 upper(), lower() 함수가 있습니다.

 

upper()함수는 대문자로 변환해 주며

 

X=upper('I am a man')

X =

I AM A MAN

 

lower() 함수는 소문자로 변환 해주는 함수 입니다.

 

lower(X)

ans =

i am a man

  


오늘의 포스팅에서는 MATLAB 기본 함수 몇 가지에 대해 설명해 보려 합니다.

 

  • diff(X, n) 함수는 인자간의 차이를 구하는 함수 입니다.

 

n 값은 차이를 구하는 횟수를 의미 합니다.

 

아래 예를 보면 쉽게 이해하실 겁니다.

 

 

diff(x, 2) 는 차이를 두 번 구하는 거죠. diff(x) 의 결과를 보면 [2 2 2 2] 니까 이 벡터에 대해 차이를 구하면 [0 0 0]이 나오게 되는 겁니다.

 

 

 

  • sortrows(X, n) 은 X matrix 를 n column index 기준으로 정렬하는 함수 입니다. default 는 오름차순입니다.

 

다음 예를 보죠. 1열을 기준으로 오름차순 정렬하는 예입니다.

 

 

2열을 기준으로 오름차순 정렬하는 예입니다.

 

 

다음 예는 1열을 기준으로 오름차순 정렬한 후에 1열에 같은 값이 있을 경우 3 열을 기준으로 오름차순 정렬을 합니다.

 

 

column index 앞에 – 를 붙여주면 내림차순 정렬을 하게 됩니다.

 

    


MATLAB 은 matrix 연산을 기본으로 한다.

 

즉 다음과 같이 A*B 의 경우 matrix 곱셈을 수행한다는 것이다.


 

 

그런데 저 곱하기에 아래와 같이 .(점)만 하나 더 찍어 주면 각 인자간의 곱이 된다.

 

 

이처럼 인자간의 연산을 할 때는 당연히 두 벡터 또는 매트릭스의 size 가 같아야 한다.

 

/, ^ 등의 연산자도 마찬가지다. ./, .^ 연산을 하게 되면 각 인자간의 연산을 수행하게 된다.

 

 


이번 포스팅에서는 MATLAB 인덱스에 대해 설명한다.

 

다음 matrix A 에 대한 각 인덱스의 접근 방법에 대해 알아보자.

 



 

: (콜론) 의 사용법에 대해 알아보자.

 

: 은 a:b 와 같은 형태로 쓰이면 a~ b 까지라는 뜻이다. 인덱스에 접근하는 용도로 : 을 쓸 때 a,b 값은 1보다 큰 양의 정수 여야 한다.

 

: 을 이용하여 A 의 3행 1열부터 4열 까지의 값을 B 라는변수에 입력해 보자.

 

 

행, 열을 구분하지 않고 다음과 같이 접근할 수도 있다.

 

 

 

MATLAB 은 기본적으로 행 벡터 즉 열을 기준으로 연산을 하는 특징이 있다.

 

A 의 5행 모든 열을 D 라는 변수에 입력해 보자.

 

 

 

콜론을 이용하여 인덱스에 접근을 할 때 콜론만 단독으로 쓰일때는 '모든 것' 을 의미 한다.

 

 

다음으로 인덱스 접근시의 end 의 용법에 대해 알아본다. end 는 말 그대로 마지막 인덱스를 나타낸다.

 

위에서 설명한 A 의 5행 모든 열은 다음과 같이 나타내도 된다.

 

 

A 의 값 중에서 20보다 큰 인자의 인덱스를 찾아 보자. 이런 경우 조건문과 find() 함수를 이용하여 인덱스를 찾곤 한다. find() 함수는 괄호 안의 조건이 참인 인덱스를 찾아주는 것이다.

 

 

 

위 결과는 A matrix 를 벡터로 나타냈을 때의 인덱스 값이다.

 

행과 열로 구분해서 나타내려면 다음과 같이 써주면 된다.

 

 

 

위 결과를 보면 r 에는 행 인덱스c 에는 열 인덱스가 들어감을 확인 할 수 있다.

 

위 결과를 보면 A>20 을 만족하는 부분이 5 군데 있음을 확인 할 수 있다.

 

A>20 을 만족 시키는 처음 2개의 인덱스만 찾고 싶을 때는 다음과 같이 한다.

 

 

다음과 같이 'first' 를 안 써줘도 동일한 결과를 얻을 수 있다.

 

 

 

즉 'first' 값이 default 라는 것을 알 수 있다.

 

 

그럼 마지막 2개 인덱스만 찾고 싶을때는? first 만 last 로 바꿔주면 된다.

 

 

 

다음으로 linear 인덱스subscripts 와의 변환에 대해 살펴 본다.

 

A matrix 는 5행 5열 matrix 이므로 다음과 같은 인덱스를 갖는다.

 

표 1, linear index

1

6

11

16

21

2

7

12

17

22

3

8

13

18

23

4

9

14

19

24

5

10

15

20

25

 

subscripts 로는 다음과 같다.

표 2, subscripts index

(1,1)

(1,2)

(1,3)

(1,4)

(1,5)

(2,1)

(2,2)

(2,3)

(2,4)

(2,5)

(3,1)

(3,2)

(3,3)

(3,4)

(3,5)

(4,1)

(4,2)

(4,3)

(4,4)

(4,5)

(5,1)

(5,2)

(5,3)

(5,4)

(5,5)

 

 

linear index 와 subscripts 사이의 변환을 해주는 함수로 ind2sub(), sub2ind() 함수가 있다.

 

ind2sub() 함수는 index 를 subscripts 로 만들어 주는 함수이다.

 

ind2sub() 를 이용하여 linear index로 19 를 subscripts 로 나타내 보자.

 

 

위와 같이 4행 4열이 출력됨을 알 수 있다.

 

sub2ind() 함수는 subscripts 를 index 로 만들어주는 함수이다.

 

3행 5열이 linear index 로 몇 번째 인지를 알아 보자.

 

 

오늘은 MATLAB 에서의 index 에 대해 알아 봤다.

 

위에서 설명한 함수들이나 인덱스 접근 방식들은 2차원 매트릭스 뿐 만이 아니라 3차원이나 그 이상의 매트릭스에 대해서도 적용 가능하다.

 


오늘은 MATLAB 단축키 설정 방법에 대해 알아 본다.

 

MATLAB desktop 에서 File 메뉴 à 그 다음에 Preferences 메뉴에 들어간다.

 

그럼 다음과 같은 창이 뜬다.


 

 

 

  • 1번 부분을 선택하여 shortcut 설정 탭으로 들어간다.

 

  • 2 번 부분에 설정하고자 하는 주제를 입력한다. 위 예에서는 cell 에 대한 단축키를 설정하기 위해서 cell 을 썼다.

 

  • 3번 부분에 나온 단축키 설정 가능한 리스트들 중에서 설정 하고자 하는 동작을 선택한다.

 

  • 기존에 단축키가 있었다면 4 번 부분에서 원하는 단축키를 설정한다.

 

 

  • 기존에 단축키가 없는 동작에 대해 단축키를 설정하기 위해서는 5번 부분에 있는 + 를 누르고 4번 부분에서 단축키를 설정한다.

 

  • 마지막으로 다 설정을 했으면 Apply à OK 를 누른다.

  


오늘의 포스팅에서는 최대 공약수최소 공배수 관련 함수에 대해 살펴 본다.

 

MATLAB 내장 함수로 gcd() 함수는 최대 공약수를 계산해 주는 함수이다.

 

scalar 뿐만이 아니라 벡터에 대해서도 최대 공약수를 계산해 준다.

 

사용법은 다음 예와 같다.

 

 

다음으로 최소 공배수를 계산해주는 함수는 lcm() 이다.

 

lcm() 함수 역시 scalar 뿐만이 아니라 벡터에 대해서도 최소 공배수를 계산해 준다.

 


'programming language > MATLAB' 카테고리의 다른 글

MATLAB diff(), sortrows(),  (0) 2011.04.03
MATLAB .* ./ .^ 연산  (0) 2011.04.01
MATLAB index  (0) 2011.04.01
MATLAB shortcut, 단축키 설정  (0) 2011.04.01
MATLAB 최대공약수 gcd(), 최소공배수lcm()  (0) 2011.03.30
MATLAB 소수 관련 함수 primes(), isprime()  (0) 2011.03.30
MATLAB diag(), eye(), zeros(), ones()  (2) 2011.03.27
MATLAB persistent  (2) 2011.03.27
MATLAB contour 등고선 그리기  (0) 2011.03.27

이번 포스팅에서는 MATLAB 의 내장 함수 중 primes(), isprime()에 대해 알아보고, 소수인지 판별해주는 함수를 직접 작성해 보겠습니다.

 

  • 내장 함수 중 소수를 생성해주는 함수로는 primes(n) 라는 함수가 있습니다. 이 함수는 n 보다 작은 소수를 생성해 줍니다.

 


아래 예는 primes() 함수를 사용하여 30보다 작은 소수들을 생성한 것입니다.

 

 

  • 소수인지 판별하는 함수는 isprime(K) 라는 함수가 있습니다. 이 함수는 K 가 소수면 1 아니면 0을 반환하게 됩니다.

 

사용법은 다음과 같습니다.

 

 

  • 그럼 이제 소수인지 판별하는 함수를 직접 코딩 해 보죠. 함수 이름은 My_isprime() 이라 해 보죠.

 

제가 짠 함수는 아래와 같습니다.

 

일단 벡터나 매트릭스 입력에 대해서도 동작하게 하기 위해서 for ~ end 문이 두 개가 들어 갔고요.

 

 

다른 부분들은 주석을 보시면 쉽게 아실 수 있을 겁니다.

 

그런데 위 코드에서 주의 하실 점이 있습니다.

 

바로 빨간색 네모 부분인데요.

 

if 문의 조건이 벡터나 매트릭스 일 때는 모두가 참이어야 if 문 안의 코드가 실행 된다는 것을 염두에 두셔야 합니다.

 

아래 예 같은 경우에는 1 이 2보다 작으니깐 2보다 큰 수를 넣으라고 에러를 발생시키죠.

 

 

2 이상의 값을 넣으면 matrix 입력에 대해서도 정상적으로 동작하는 것을 확인 할 수 있습니다.

 

 

 


이번 글에서는 MATLAB 의 기본적인 몇몇 함수들에 대해 알아 보겠습니다.

 

  • diag() 함수를 이용하여 diagonal matrix 를 만들거나 matrix 의 diagonal 값을 얻을 수 있습니다.

 

 

  • eye() 함수를 이용하여 identity matrix 를 만들 수 있습니다.

 

 

  • zeros() 함수를 이용하여 zero matrix 를 만들 수 있습니다.

 

 

  • ones() 함수를 이용하여 1로 구성된 matrix 를 만들 수 있습니다.

 

 

  • blkdiag() 함수를 이용하여 diagonal 값이 matrix 로 구성된 matrix 를 만들 수 있습니다.

 

 


  1. 2016.09.26 15:31

    비밀댓글입니다

MATLAB 함수 내부의 변수는 함수 사용 후에는 메모리 상에서 지워지게 됩니다.

 

하지만 경우에 따라 함수 내부에서 변수가 계속 유지 되게 할 필요가 있는 경우가 있습니다. 이러한 경우에 persistent keyword 를 사용합니다.

 

다음 예를 통해 persistent 에 대해 알아보죠.

 

아래 그림의 y=persistent_func(a,b) 함수는 a, b 값 입력을 받아서 a+b+c 값을 출력하는 함수 입니다.

 

 

c 값에는 함수 내부에서 메모리상에 계속 남아 있도록 하기 위하여 persistent 로 설정했습니다.

 

그리고 초기값 설정을 위하여 isempty() 함수를 써서 c 값이 비어 있으면 초기값을 설정하도록 하였습니다.

 

위 함수에 대하여 다음과 같이 사용해 보도록 하겠습니다.

 

 

함수 내부에서 c 값이 계속 유지가 되는 것을 확인 할 수 있습니다.

 

 

연관 글: 2011/03/26 - [MATLAB] - MATLAB global keyword



  1. 박지연 2011.10.20 11:28

    매틀랩 공부하다가 우연찮게 이곳에 오게되었는데요 설명 너무잘해주셔서 감사해요
    c값 출력할때
    c:%d\n' 이건 어떤 표현인가요?
    답변 부탁드릴게용 ^^

    • 남성 2011.10.20 23:33 신고

      방문해 주셔서 감사합니다.

      c: 는 그대로 화면에 출력하는 부분이구요.

      %d 는 decimal 값 즉 10진수 정수로 표현하라는 거구

      \n 은 줄 바꿈 하라는 겁니다.

MATLAB contour() 함수를 이용하면 등고선 그래프를 매우 쉽게 그릴 수 있다.

 

다음과 수식에 따른 값에 대해 등고선을 그려 보자.

 

[X,Y] = meshgrid(-2:2); % X,Y 설정

Z = 10*(X/5 - X.^3 - Y.^5).*exp(-X.^2-Y.^2); % Z 계산

 

위 식에 대해 아래 명령으로 등고선을 간단하게 그릴 수 있다.

 

figure, contour(X,Y,Z), colorbar

 

 

등고선 사이의 표면에 색을 입히고 싶다면 contourf() 함수를 이용한다.

 

figure, contourf(X,Y,Z), colorbar

 

 

다음과 같은 등고선 그래프를 얻을 수 있다.

 

 

위 그래프를 보면 간격이 너무 넓어서 등고선이 너무 각진 형태로 나오는 것을 확인 할 수 있다.

 

이럴 때는 interp2() 함수를 이용하여 2차원 면에 대한 보간을 할 수가 있다.

 

interp2() 함수는 기본적으로 linear interpolation 을 수행하므로, 좀더 부드러운 곡선을 얻기 위하여 spline interpolatin 을 하면 다음과 같이 부드러운 형태로 된 등고선을 얻을 수 있다.

 

[XI,YI] = meshgrid(-2:0.1:2);

ZI=interp2(X,Y,Z, XI,YI,'spline');

figure, contourf(XI,YI,ZI), colorbar 

 


Newton method 는 미분 가능한 연속 함수 f(x) 대하여 다음과 같은 방식으로 f(x) =0 해를 구하는 방법이다.

 

 

 

식에 대하여 Newton method 이용하여 f(x) =0 되는 실수 x 구해 보자.

 

식에 대한 미분 결과는 다음과 같다. 

 

Newton method 의 최대 반복 횟수는 100 회로 하고 상대 오차는 10-9 으로 설정 한 후 이를 만족하는 해를 찾아 본다.

 

MATLAB code 는 다음과 같다. 

 

 

command 창에서 결과를 확인 하면 Newton method 를 이용한 결과roots() 함수를 이용한 결과가 근사적으로 일치 함을 확인 할 수 있다. 



  1. 이상훈 2012.10.02 12:08

    감사합니다 ㅎㅎ

  2. 2013.04.03 21:06

    비밀댓글입니다

    • 남성 2013.04.03 21:10 신고

      도움되셨다니 다행이네요~ 방문해 주셔서 감사합니다. ^^

  3. 민경원 2014.02.11 17:35

    fprintf 에서 에러가 나는데요?
    Error using fprintf
    Function is not defined for 'sym' inputs.

    Error in Untitled (line 23)
    fprintf('Estimated x : %10.7f \n', x)

    • 남성 2014.02.12 03:16 신고

      방문자 님이 작성하신 코드를 봐야 답변 드릴 수 있을것 같네요.

  4. LU 2015.09.26 16:01

    혹시 그래프 표현은 어떻게 하나요...

    • 남성 2015.09.26 18:03 신고

      수렴되는 모습에 대한 그래프 말씀하시는건가요? 수렴되는 모습이라면 일단 f(x) 에 대한 그래프를 하나 그려 놓은 다음에 while 문 내에서 x,f(x) 의 값을 그래프로 나타내면 되겠죠.

  5. 준트랩 2015.09.30 00:02

    %%수식 정의
    syms x
    f= x^3-x^2-x-1;
    diff_f=diff(f,x);
    N_steps= 0;
    x = 1.5;
    required_error= 1e-3;
    estimated_error= 1;
    N_iter= 100;

    while estimated_error > required_error && (N_steps < 30)
    xold = x;
    x = x - subs(f,x)/subs(diff_f, x);
    N_steps = N_steps + 1;
    disp( [x subs(f,x)] )
    estimated_error = abs((x-xold)/x);
    end

    fprintf('Estimated x: %10.7f \n', x)

    roots_result=roots([4 3 2 1])


    이렇게 적고 실행시키려는데

    다음 사용 중 오류가 발생함: fprintf
    'sym' 입력값에 대해 함수가 정의되지 않았습니다.

    이렇게 에러가 뜨네요 어떻게 수정해야할까요?

    • 남성 2015.09.30 01:08 신고

      예전 버전에서는 문제 없이 됐었는데 최신 버전에서는 syms 사용 중에 문제가 있군요. 정확히 왜 그런지는 모르겠지만 다음과 같이 변경해주니 정상적으로 동작은 되더군요.

      fprintf('Estimated x: %g \n', double(x))

      아마도 x 값이 rational 형태로 표현되면서 뭔가 에러가 있는것 같습니다. double 로 변환하니 정상적으로 동작합니다.

  6. 공도리 2015.09.30 18:45

    게시글 잘 보았습니다 ^^ 뉴턴랩슨법을 매틀랩으로 풀다가 방문하게 되었어요.
    혹시 f1=x1^2+x2^2-x1=0 f2=x1^2-x2^2-x2=0
    에서 초기치는 x1=0.7, x2=0.5로 주어져있는데
    위의 두 방정식을 뉴턴 랩슨법으로 풀기 위해서는 어떤 방식으로 위의 방법을 적용시켜야 할 지 여쭈어 보고 싶습니다..!
    변수가 두개에다가 연립방정식이다 보니 어떻게 적용해야 할지 감이 오지 않네요...
    답변 부탁드립니다!

    • 남성 2015.09.30 21:39 신고

      아래 주소에 포스팅 했습니다.

      http://iamaman.tistory.com/1659

    • 공도리 2015.10.01 12:45

      앗 감사합니다..! 잘 참고할게요

  7. 공대생 2016.03.14 23:25

    감사합니다 큰 도움 되었어요

    • 남성 2016.03.15 20:23 신고

      도움되었다니 다행이네요. 방문해 주셔서 감사합니다. ^^

  8. 기계 2017.05.24 09:11

    좋은글 잘보고 있습니다.
    한가지 궁금한게있는데, 매트랩 명령어 중에 몇번째줄로 돌아가라는 명령어가있을까요?

    예를 들어서 해를구해야되는데 수렴하지 않고 발산할때 일정 iter을 넘게되면 초기값을 다시 설정해주는프로그램을 짜려고하는데, 2번째줄에 초기치를 정해주는 명령어가있다면 그 줄로 돌아가라는..

    • 남성 2017.05.24 09:38 신고

      MATLAB 에 goto 같은 명령어는 없습니다. iteration 부분을 함수 등으로 작성해서 다시 시작하게 설정하는게 좋을듯 합니다.

  9. 헤헤 2017.06.01 10:20

    식을 똑같이 해서 2차식을 풀려고 하는데 function 기능을 써서
    임의의 값을 넣었을때 뉴턴법으로 푸는걸 만들려고 하는데
    3차식일때는 초기값이 바뀌어도 값은 근사하게 나왔는데
    2차식이 되면 초기값에 따라 근 값이 바뀌고. 근사하게도 안나와요
    어떻게 해야할까요?

    • 남성 2017.06.01 18:22 신고

      글쎄요... 질문만 봐서는 저도 이유를 잘 모르겠네요.

    • 헤헤 2017.06.08 21:26

      function y=asdd(a, b, c, x0)
      syms x
      y= a.*x.^2+b.*x+c;
      diff_y=diff(y,x);
      N_steps=0; %반복횟수
      x=x0; %x의 초기값
      last_error=0.000001; %이것보다 오차가 작아야한다.
      first_error=1; %처음 오차
      N_iter=100;

      while first_error > last_error && (N_steps<30);
      xold=x;
      x=x-subs(y,x)/subs(diff_y,x);
      N_steps=N_steps+1;
      disp([x subs(y,x)])
      estimated_error=abs((x-xold)/x);
      end
      fprintf('Estimated x, %10.7f\n',x)
      roots_y=roots([a b c])



      이렇게 했는데 root한 거랑 값이 좀 많이 달라서요.
      어떻게 해야할까요?

    • 남성 2017.06.09 02:08 신고

      일단 최대 반복 횟수를 한번 늘려 보세요.
      while 문에는 (N_steps<30) 에서 30 이란 숫자를 100 이나 안되면 그 이상으로 늘려보시는게 좋을 겁니다.

  10. 급ㅠ 2018.06.11 18:23

    1. matlab을 활용하여 2차시스템에서 상승시간(tr)과 zeta와의 관계를 찾는것

    2. matlab을 활용하여 1번에서 구한것을 이를 최소자승법으로 관계를 찾는것
    이것을해야하는데 도대체어떻게해야하는지..건드릴수가없네요...도와주실수잇을까요??

    • 남성 2018.06.11 18:33 신고

      아니요. 숙제는 도와 드리기 힘들 것 같습니다.

    • 급ㅠ 2018.06.11 18:57

      관리자의 승인을 기다리고 있는 댓글입니다

  11. 안녕하세요 2018.06.12 11:25

    관리자의 승인을 기다리고 있는 댓글입니다

  12. 성민 2018.06.12 15:31

    관리자의 승인을 기다리고 있는 댓글입니다

이번 포스팅에서는 AWGN (Additive white gaussian noise) 채널 환경에서의 QPSK Bits Error Rate(BER)에 성능 검증 simulation 에 대해 설명한다.

 

QPSK 및 잡음의 분산(σ2) 과 No(noise power spectral density) 의 관계에 대한 내용은 다음 포스팅을 참조 하기 바란다.




2011/03/19 - [MATLAB] - MATLAB BPSK BER simulation in AWGN channel


2011/03/08 - [통신] - [디지털 통신] BPSK, QPSK

 

QPSK 에서는 아래 식의 M =4 이다.

 

 

따라서 다음 식과 같이 정리 된다.

 

 

QPSK 시뮬레이션 시의 주의할 점신호의 파워를 1 로 정규화 해 줘야 하며 잡음 역시 real , imaginary 에 대해 각각 독립적이어야 한다.

 

이제 QPSK 시뮬레이션을 해 보자.

 

  

Command 창의 결과는 다음과 같다.

Eb/No= 0 BER: 0.078801

Eb/No= 2 BER: 0.0374294

Eb/No= 4 BER: 0.0124703

Eb/No= 6 BER: 0.00238721

Eb/No= 8 BER: 0.0001905

Eb/No= 10 BER: 3.07143e-006

 

 

위 그래프를 보면 이론적인 결과와 근사적으로 일치 함을 확인 할 수 있다.


  1. 남성 2012.11.25 18:47 신고

    이렇게 바꿔보세요.

    Symbols=((bits_v(:,1)*(-2)+1) + i*(bits_v(:,2)*(-2)+1))./sqrt(2);

  2. 과객 2013.06.18 23:52

    BPSK QPSK 정말 감사하게 잘 실행되었습니다.
    다만 QPSK에서는 비트 2개를 하나는 리얼로 하나는 이미지로 생각해서 처리하셨는데 8PSK에서는 비트 3개라 어떻게 해야 할지 모르겠네요 8PSK에서는 어떻게 해야 할까요?

    • 남성 2013.06.19 06:45 신고

      8 psk 에서도 3 비트를 한 점의 symbol 로 mapping 하시면 됩니다.

      아래 주소의 그림처럼 말이죠.

      http://commons.wikimedia.org/wiki/File:8PSK_Gray_Coded.svg


      방문해 주셔서 감사합니다. ^^

    • 과객 2013.06.20 20:11

      감사합니다.

  3. 답변부탁드릴게요 2013.11.17 23:06

    도움 감사합니다 하지만 실행이 되지 않아서 질문드립니다
    답변해주시면 정말 감사하겠습니다.

    clc
    clear
    close all

    N_bits=70000000; %생성할 비트 수 / 2
    Eb_No_dB=0:2:10; %Eb_No dB scale
    BER_buffer=zeros(size(Eb_No_dB)); %BER 저장할 버퍼


    for n=1:length(Eb_No_dB)
    Eb_No_ral_scale=10^(Eb_No_dB(n)/10); %Eb/No real scale 값 반환
    sigma_v=sqrt(1./(4*Eb_No_ral_scale)); %잡음의 표준 편차 값 계산

    bits_v=randi([0 1],N_bits,2); %비트 생성

    Symbols=(bits_v(:,1)*(-2)+1 + i *(bits_v(:,2)*(-2)+1))./sqrt(2); %symbol mapping & normalizat

    noise_v=(randn(N_bits,1)*sigma_v)+ i * (randn(N_bits,1)*sigma_v); % complex AWGN 생성

    tx_signal = Symbols * noise_v; % 신호*잡음

    demapped_bits=[real(tx_signal) imag(tx_signal)] < 0; %수신단 demapping

    BER_buffer(n)=sum(bits_v(:) ~= demapped_bits(:)) ./ (N_bits*2); %BER calculation

    fprintf('Eb/No=%g BER: %g\n' ,Eb_No_dB(n) ,BER_buffer(n))
    end

    %%이론적인 QPSK BER 계산 Using communication toolbox

    Eb_No_theory = 0:0.05:10;
    Ber_value_theory = berawgn(Eb_No_theory,'psk',4,'nondiff');
    %% 그래프그리기

    figure(1),semilogy(Eb_No_dB,BER_buffer,'b+',Eb_No_theory,Ber_value_theory,'r--'),x;xlabel('Eb/No [dB]'),ylabel('BER')
    grid.axis([0 10 0.000001 1]), legend('Simulated result','Theoretical BPSK result')


    제시해주신 코드와 똑같이 작성하려고 노력하였습니다,
    하지만 아래와 같은 오류가 나와서 질문드립니다.

    ??? Error using ==> randn
    Out of memory. Type HELP MEMORY for your options.

    Error in ==> QPSK_BER at 18
    noise_v=(randn(N_bits,1)*sigma_v)+ i * (randn(N_bits,1)*sigma_v); % complex
    AWGN 생성

    어떤 문제인지 알려주시면 정말 감사하겠습니다!

    • 남성 2013.11.17 23:59 신고

      randn() 에서 메모리 에러 나는것은 N_bits 를 너무 크게 줘서 그렇습니다.

      아래 세 부분이 문제더군요.

      다음과 같이 바꾸세요.

      N_bits=7000000; %생성할 비트 수 / 2, 너무 크게 주면 컴퓨터뻗어요.

      tx_signal = Symbols + noise_v; % 신호 + 잡음, 곱하기가 아닙니다.


      % 아래 부분에서는 단순 오타가 좀 있더군요.
      figure(1),semilogy(Eb_No_dB,BER_buffer,'b+',Eb_No_theory,Ber_value_theory,'r--');xlabel('Eb/No [dB]'),ylabel('BER')
      grid on , axis([0 10 0.000001 1]), legend('Simulated result','Theoretical BPSK result')

    • 답변부탁드릴게요 2013.11.18 01:06

      감사합니다! 정상작동됩니다!

    • 남성 2013.11.18 01:39 신고

      네~ 열심히 공부하세욧 !! 방문해 주셔서 감사합니다. ^^

  4. 답변좀 부탁드려요 2013.11.20 17:06

    안녕하세요~ 과제 때문에 들렀다가 오류가 떠서 질문드립니다..ㅠ
    Eb_N0_theory=0:0.05:10 ; 이 부분에서요
    다음과 같은 오류가 뜹니다..
    The expression to the left of the equals sign is not a valid target for an assignment.
    Eb_N0 대신 혹시나 해서 Eb_No로 바꿔서 입력해보아도 같은 오류 메시지가 뜨는데 어떻게 해야 하나요?

    • 남성 2013.11.20 18:30 신고

      Eb_N0_theory=0:0.05:10 ; 부분에 코드상의 문제는 없습니다.
      다른 부분에 문제가 있는것 같은데요.

  5. 119 2014.04.01 17:59

    음.. ㅠㅠ 저기 tx_signal 차원이 [N_bits,1]맞죠?? symbol하구 noise 왜 더하는데 둘이 자꾸 차원이 안맞다구 나오는지 ㅠㅠ

  6. 119 2014.04.01 19:58

    저는 sigma(n)으로 고쳐서 곱해주니까다시됏어요.. 그리구 demappping이랑 BER계산 어떻게 하신건가요ㅠㅠ??

    • 남성 2014.04.01 21:23 신고

      demapping은 0 보다 작으면 1 그렇지 않으면 0 으로 demapping 한 거구요. 이론적 ber 게산은 berawgn 이라는 통신 툴박스의 함수를 사용했습니다. 위에 보시다 시피 코드는 저게 다에요.

  7. 2014.04.16 23:14

    비밀댓글입니다

    • 남성 2014.04.17 01:06 신고

      아래 포스팅에 답변 합니다.

      http://iamaman.tistory.com/1251

  8. 공돌공돌 2014.06.06 22:06

    clc
    clear all
    close all

    N_bits=7000000; %생성할 비트 수/2
    Eb_No_dB=0:2:10; %Eb/No dB scale
    BER_buffer=zeros(size(Eb_No_dB)); %BER 저장할 버퍼

    for n=1:length(Eb_No_dB)
    Eb_No_ral_scale=10^(Eb_No_dB(n)/10); %Eb/No real scale 값 변환
    sigma_v=sqrt(1./(4*Eb_No_ral_scale)); %잡음의 표준 편차 값 계산

    bits_v=randi([0 1],N_bits,2); %비트 생성

    Symbols=(bits_v(:,1)*(-2)+1 +i*(bits_v(:,2)*(-2)+1))./sqrt(2); %symbol mapping & normalization

    noise_v=(randn(N_bits,1)*sigma_v) +i*(randn(N_bits,1)*sigma_v); %complex AWGN 생성

    tx_signal=Symbols+noise_v; %신호 + 잡음

    demapped_bits=[real(tx_signal) imag(tx_signal)]<0; %수신단 demapping

    BER_buffer(n)=sum(bits_v(:)~=demapped_bits(:))./(N_bits*2); %BER calculation

    fprint('Eb/No=%g BER:%g\n',Eb_No-dB(n), BER_buffer(n))
    end

    % 이론적인 QPSK BER 계산
    Eb_No_theory=0:0.05:10;
    Ber_value_theory=berawgn(Eb_No_theory,'psk',4,'nondiff');

    % 그래프 그리기
    figure(1),semilogy(Eb_No_dB,BER_buffer,'b+',Eb_No_theory,Ber_value_theory,'r--');xlabel('Eb/No[dB]'), ylabel('BER')
    grid on, axis([0 10 0.000001 1]), legend('Simulated result','Theoritical QPSK result')

    이렇게 했는데 왜 BERTool에서 run 누르면 invalid simulation M-file or model 이라는 에러가 나오면서 그림이 안그려지죠? ㅜㅜ 제발 알려주세요 ㅜㅜㅜㅜ

  9. 남성 2014.06.07 06:07 신고

    위 코드에서는 25 번째 줄에 오타가 몇개 있더군요. 아래와 같이 하면 정상적으로 동작 합니다.

    fprintf('Eb/No=%g BER:%g\n',Eb_No_dB(n), BER_buffer(n))

    위 질문에서 bertool 이라고 얘기하시는데... 위 코드를 m 파일로 작성하시고 bertool 에서 monte carlo simulation 하셨다는 건가요?

    • 남성 2014.06.07 10:34 신고

      먼가 잘 못 이해하고 계신거 같은데... 위 코드는 그냥 m 파일로 돌리면 되는건데요? bertool 안 써도 되는겁니다.

    • 공돌공돌 2014.06.07 10:35

      25번째줄 말씀하신대로 수정하고 저장한 후에 bertool 켜서 monte carlo simulation 했는데 또 invalid simulation M-file or model 이라는 에러가 뜨네요 ㅜㅜ 대체 왜 이러는지 모르겠습니다 ㅜ 위에 님이 포스팅하신 것처럼 이론적인 QPSK 그래프와 코드 시뮬레이션 한 값과 비교하는 그래프를 봐야하는데 그게 안뜹니다 ㅜㅜ

    • 2014.06.07 10:38

      비밀댓글입니다

    • 남성 2014.06.07 11:51 신고

      bertool을 사용하신다면 변수명 등을 bertool 에 맞게 써 줘야 하는것 같더군요.

  10. 공돌이 2014.06.08 15:36

    안녕하세요 자료를 찾아보다가 오게 되어서 질문드립니다 ㅠ

    제가 지금 설계프로젝트를 하고 있는데요 32QAM을 써서 통신시스템 설계를 진행하고 있는데 awgn만 첨가했을 때

    bertool이랑은 전혀 다른 결과가 나와서 문의드립니다.

    들어가는 비트 Eb - 채널코딩 한 후 Ec - 변조 한 후 Es로 해서

    N0=10.^(EcN0dB(snrindex)/10);
    gain=sqrt(N0/2);
    noise=randn(200,1)*gain

    으로 했는데 bertool보다 훨씬 더 좋게 나오네요,,, 이러면 안되는데,,, awgn 채널을 잘못구성한건가요??

    • 남성 2014.06.08 17:08 신고

      채널 코딩도 들어갔으면 파워 계산 과정에서 채널 코드 레이트에 대한 수치가 반영 되어야 합니다. 채널 코딩시 encoder 의 입력 비트에 비해 출력비트가 더 많이 나오므로 출력의 각 비트당 파워는 줄어들게 되겠죠. 이를 정확히 반영하셔야 정확한 시뮬레이션이 될 겁니다. 이를 제대로 반영안했다면 이론 값보다 당연히 좋게 나오겠죠.

  11. 멍청이 2015.07.22 20:32

    질문이 있는데 qpsk 에서 위에 코드에서 Symbols=(bits_v(:,1)*(-2)+1 + i *(bits_v(:,2)*(-2)+1))./sqrt(2); 루트 2 이걸로 나눠주는데 이건 왜 나눠 주는거죠???

    • 남성 2015.07.23 04:18 신고

      위의 포스팅에서 적어 놨지만 신호의 파워, 여기서는 심볼의 파워를 1로 맞춰주는겁니다.
      Symbols = ±1/sqrt(2) ± j · 1/sqrt(2) 이므로 절대값이 1 이라는것을 확인 할 수 있습니다. 심볼 파워를 1로 정규화한 상태에서 잡음의 파워 즉 분산을 계산해서 넣어주는 겁니다.

이번 포스팅에서는 루프 문(for, while) 사용시의 제어를 위한 keyword 인 breakcontinue 에 대해 설명 드립니다.

 

보통 if 문 안에 써서 특정 조건 일 때 루프를 멈추게 하거나 또는 건너뛰게 할 때 이용합니다.

 

break 는 루프 문의 동작을 멈추는 기능을 합니다.

 

다음 코드를 실행해 보면

 

for k=1:5 

if k==3

break

end

fprintf('%d\n',k)

end

 

 

1, 2 만 출력이 되고 k = 3 일 때 break 명령에 의해 for 루프를 빠져 나오게 됩니다.

 

루프 문 안에 또 루프 문이 있는 nested 루프의 형태에서 break 를 이용할 경우에는 break 를 둘러 싸고 있는 루프문 하나만 빠져 나오게 됩니다.

 

continue 문은 특정 루프를 건너 뛰게 합니다.

  s

다음 코드를 실행하면

 

 

for k=1:5 

if k==3

continue

end

fprintf('%d\n',k)

end

 

1, 2, 4, 5 만 출력이 되고 3은 건너뛰게 됩니다.

 

continue 역시 nested 형태의 루프문에서 이용시 continue 를 둘러싸고 있는 루프문 하나만 빠져 나옵니다.


MATLAB 을 이용하여 그림과 같은 piecewise 식을 나타내 보자.


 

 

이러한 piecewise 식은 비교 연산자논리 연산자를 이용하면 매우 간단하게 표현이 가능하다.

 

위 그래프에 대한 식은 다음과 같다.

 

 

위 식을 y = my_piecewise(t) 라는 함수로 표현해 보자.

 

 

위 그림의 오른쪽의 빨간색 네모 칸 친 부분 처럼 각각의 조건을 비교 연산(<=, < )논리 연산(&)을 이용하여 간단하게 표현했다.

 

그리고 왼쪽에 있는 m 파일을 실해하면 다음과 같은 그래프를 확인 할 수 있다.

 

 


MATLAB 의 함수 내부의 변수 값들은 함수가 사용된 이후에는 자동으로 메모리 상에서 없어진다.

 

하지만 같은 변수를 다른 함수 또는 파일에서도 이용하려는 경우 함수 내부에서 변화된 값이 계속 남아 있게 해야 하는 경우가 있다.

 

이러한 경우 global keyword 를 이용한다.

 

global 은 하나의 변수를 여러 파일에서 이용하기 위해서 사용한다.

 

global keyword 의 이용 방법은 변수 사용 전에 선언을 해 주고 사용해야 한다.

 

다음과 같이 예를 들어 보자.

 

 

위 예에서 global_test.m 파일에서 변수 a 값을 my_func() 함수에서도 이용하고 함수 내부에서 a 값을 변경했다.

 

그리고 global_test.m 파일에서 my_func() 사용 전과 사용 후의 a 값이 다음과 같이 달라졌음을 확인 할 수 있다.

 

 

반면에 변수 b 값은 global 변수가 아니고 global_test.m 파일에서는 선언한 적이 없으므로 에러가 나는 것이다.

 


MATLAB 이용시 그래프 또는 command 창에 text 출력시 수학 기호등을 넣고 싶을 때가 있다.

 

다음 예는 sin 그래프를 그리고 x 축과 y 축에 θ 라는 특수 기호를 넣었다.

 

 

 

MATLAB 에서 이런 특수 기호를 넣기 위해서는 위 코드에서 보는 것처럼 \character 형태로 입력해 줘야 한다.

 

아래 표를 참조하면 원하는 기호를 넣을 수 있을 것이다.

 


 

Reference : MATLAB HELP


'programming language > MATLAB' 카테고리의 다른 글

MATLAB QPSK BER simulation in AWGN channel  (26) 2011.03.27
MATLAB break, continue  (0) 2011.03.26
MATLAB piecewise 수식 표현  (0) 2011.03.26
MATLAB global keyword  (0) 2011.03.26
MATLAB Tex character 수학 기호 넣기  (0) 2011.03.25
MATLAB Rayleigh random variable 생성  (2) 2011.03.23
MATLAB FAST convolution using FFT  (0) 2011.03.23
MATLAB random number 생성  (24) 2011.03.23
MATLAB PDF, CDF, CCDF  (6) 2011.03.23

Gaussian r.v.(random variable)을 이용하여 rayleigh r.v. 을 생성하고 그 PDFCDF 를 구해 보자.

 

rayleigh random variable 에 대해서는 다음 포스팅을 참조

 
2009/12/26 - [수학] - Rayleigh PDF

 

PDF 및 CDF 를 구하는 법에 대해서는 다음 포스팅을 참조 하시길



2011/03/23 - [MATLAB] - MATLAB PDF, CDF, CCDF 
 

서로 독립인 평균이 0 이고 분산(σ2)이 1인 Gaussian r.v. X, Y 를 생성해 보자.

 

 

rayleigh r.v. Z 는 다음과 같이 발생 시킬 수 있다.

 

이제 이전 포스팅<2011/03/23 - [MATLAB] - MATLAB PDF, CDF, CCDF> 에서 설명한 대로 다음과 같이 PDF 를 구해 보자.

 

 

 

CDF 는 다음과 같다.

 

 

 

분산이 σ2 인 가우시안 r.v. 에 의해 발생된 rayleigh r.v. 의 이론적인 평균은 다음과 같다.

 

σ2 = 1 인 경우 = 1.2533141373155

 

분산이 σ2 인 가우시안 r.v. 에 의해 발생된 rayleigh r.v. 의 이론적인 분산은 다음과 같다.

 

σ2 = 1 인 경우 = 0.429203673205103

 

실험에 의해 생성된 rayleigh r.v. 의 평균분산 값은 다음과 같으며 위 이론값과 근사적으로 일치함을 확인 할 수 있다.

 

 



'programming language > MATLAB' 카테고리의 다른 글

MATLAB break, continue  (0) 2011.03.26
MATLAB piecewise 수식 표현  (0) 2011.03.26
MATLAB global keyword  (0) 2011.03.26
MATLAB Tex character 수학 기호 넣기  (0) 2011.03.25
MATLAB Rayleigh random variable 생성  (2) 2011.03.23
MATLAB FAST convolution using FFT  (0) 2011.03.23
MATLAB random number 생성  (24) 2011.03.23
MATLAB PDF, CDF, CCDF  (6) 2011.03.23
MATLAB 함수 만들기, inline, function handle  (0) 2011.03.21
  1. 2012.11.12 04:06

    비밀댓글입니다

    • 남성 2012.11.12 11:35 신고

      (:) 하면 매트릭스를 벡터화 하는겁니다.

      A 라는 매트릭스가 3 × 3 매트릭스 일때

      A(:) 하게 되면 9행의 매트릭스가 됩니다.

이번 포스팅에서는 FFT 를 이용한 고속 convolution 에 대해 알아본다.

 

일반적으로 conv(x, y) 은 filter() 함수로 구현되는 선형 convolution 이다.

 

선형 convolution 은 x 또는 y 의 길이가 증가할수록 그 복잡도는 급격히 증가하는 특징이 있다.

 

이러한 선형 convolution 은 순환(Circular) convolution 을 이용하여 구현이 가능하며, 순환 convolution 은 FFT(Fast Fourier Transform) 와 IFFT(Inverse Fast Fourier Transform)를 이용하여 구현이 가능하다.

 

일단 선형 convolution 을 순환 convolution 으로 변환하는 과정에 대해 살펴 보자.

 

x=[1 2 3 4]

 

y=[1 4 5]

 

위 신호를 이용하여 다음과 같이 convolution 을 하면

 

Z=conv(x,y)

Z =

1 6 16 26 31 20

 

Z는 6 개의 인자를 갖는 수가 나온다. 이는 x 의 길이가 4 이고 y 의 길이가 3 이므로 length(x) + length(y) – 1 = 4+3-1 = 6 에 따른 결과 이다.

 

위에서 실행한 conv() 을 순환 convolution 함수 cconv() 을 이용하여 구성해 보자. 참조 : cconv() 함수는 signal Processing Toolbox 에 포함되어 있다.

 

  • x 값을 6 개의 인자를 갖도록 뒤 부분에 0 을 2개 채워준다.

 

x1=[1 2 3 4 0 0]

 

  • y 값도 6 개의 인자를 갖도록 뒤 부분에 0 을 3개 채워준다.

 

y1=[1 4 5 0 0 0]

 

  • 위 두 벡터를 순환 convlution 한다.

 

Z_cconv=cconv(x1,y1, 6)

Z_cconv =

1.0000 6.0000 16.0000 26.0000 31.0000 20.0000

 

 

위 결과를 보면 선형 convolution 과 순환 convolution 의 결과가 동일함을 확인 할 수 있다.

 

이제 순환 convolution 과 FFT 사이의 관계를 알아보자.

 

(x 와 y 의 circular convolution) = IFFT(FFT(x)FFT(y)) 의 관계가 있다.

 

위에서 실행했던 순환 convolution 을 FFT, IFFT 를 이용하여 처리해 보자.

 

Z_fast=ifft(fft(x,6).*fft(y,6)) 을 실행하면 다음과 같은 결과가 나오며 이는 처음 실행했던 선형 convolution 의 결과와 동일한 것을 확인 할 수 있다.

Z_fast=

1.0000 6.0000 16.0000 26.0000 31.0000 20.0000



이번 포스팅에서는 MATLAB 에서 기본으로 제공하는 각종 random number 의 생성 방법에 대해 알아본다.

 

MATLAB 에서도 rand() 함수는 uniform random number 를 발생 시킨다.

 

rand() 함수는 0에서 1 사이 값을 발생 시킨다. 이를 이용하여 다양한 범위의 uniform random number 를 발생 시킬 수 있다.

 

a ~ b 사이의 n행 k열 uniform random number 를 발생시키는 방법은 다음과 같다.

 

Uniform_rand = a + (b-a).*rand(n, k);

 

예를 들어 -10 ~ 5 사이의 4행 5 열 의 uniform random number 를 발생 시키려면 다음과 같이 하면 된다.

 

 

다음으로 정규 분포라 불리는 Gaussian random number 에 대해 알아보자.

 

Gaussian random number 를 발생시키는 함수는 randn() 이다.

 

randn() 함수는 평균이 0 이고 분산이 1 인 Gaussian random number 를 발생 시킨다.

 

평균이 a 이고 분산이 b 인 n행 k 열의 Gaussian random number 를 발생시키는 방법은 다음과 같다.

 

Gaussian_randn=randn(n, k)*sqrt(b)+a;

 

예를 들어 평균이 3 이고 분산이 9인 3행 4열 Gaussian random number 를 발생시켜 보면 다음과 같다.

 

 

다음으로 정수 random number 를 발생시켜주는 randi() 함수에 대해 알아보자.

 

randi(imax, n, m) 이라 정의 하게 되면 1,2,3,…imax 까지의 정수 중 uniform 하게 n 행 m 열 만큼 발생시켜 준다.

 

또는 randi([imin, imax], n, m) 이라 정의 하면 imin, imin+1, imin+2, … imax까지의 정수 중 uniform 하게 n 행 m 열 만큼 발생시켜 준다.

 

예를 들어 randi([-10, 2], 5, 4) 라고 정의 하면 -10,9,8… 2 까지의 정수를 5행 4열로 발생시켜 준다.

 

 

마지막으로 randperm() 함수에 대해 알아보자. randperm(k) 라 하게 되면 1:k 까지의 값들을 random 하게 나열 한다.

 

예를 들어 randperm(5) 하면 다음 그림과 같이 1,2,3,4,5 값을 random 하게 나열하는 식이다.

 

 

randperm(45) 의 값의 임의의 부분 6개를 취하면 간단하게 random한 로또 번호 생성기를 만들 수 있다.

 

 


  1. 글쎄인삼 2013.03.19 23:14

    트럼프카드 셔플 프로그램 짜는 거 때문에 고생하고 있었는데 덕분에 쉽게 해결되었습니다. 감사합니다.

    • 남성 2013.03.20 09:34 신고

      도움되었다니 다행이네여~ 방문해 주셔서 감사합니다. ^^

  2. 민트맛카카오 2016.03.19 21:42

    정수 1~52까지 5x4 random 행렬 만드는 법 있나요?

    • 남성 2016.03.19 21:46 신고

      randi(52,5,4) 라고 하면 됩니다.

    • 2016.03.19 22:05

      비밀댓글입니다

    • 남성 2016.03.19 22:07 신고

      중복없이 하시려면 아래와 같이 하면 됩니다.

      a = randperm(52); b= reshape(a(1:20),5,4)

    • 민트맛카카오 2016.03.19 22:11

      너무 감사합니다. 좋은 주말되세요~

  3. 2016.03.20 23:44

    비밀댓글입니다

    • 남성 2016.03.20 23:47 신고

      위에 질문 하신 분이랑 같이 숙제 하시나 봐요 다음과 같이 하시면 됩니다

      a = randperm(52); b= reshape(a(1:20),5,4)

    • 2016.03.20 23:53

      비밀댓글입니다

    • 남성 2016.03.20 23:58 신고

      키와 값의 형태로 표현하고 싶으면 아래 주소의 글들을 참조하여
      map 형태로 나타내도 될것 같고,

      http://iamaman.tistory.com/749
      http://iamaman.tistory.com/529

      그냥 간단하게 아래와 같이 배열로 나타내도 될것 같네요.

      a=['다이아에이', '스페이드']

      위와 같이 하면 a[1] 은 다이아에이 겠죠.

    • 매트랩초보 2016.03.21 00:05

      늦은 시간에 계속 질문해서 정말 죄송합니다
      a=['다이아에이','스페이드']에서 스페이드는 왜 쓰신거에요??

    • 남성 2016.03.21 00:08 신고

      1~52개 카드를 배열에 넣으려는 의도 아닌가요?

    • 매트랩초보 2016.03.21 00:09

      네 맞아요 아 그럼 그 스페이드는 52를 의미하기위해 넣으신건가요???

    • 남성 2016.03.21 00:11 신고

      그냥 예를 든건데.... ㅎㅎ 아래와 같이 저장해서 52개를 저장하면 된다는거죠.
      a=['다이아에이','다이아2', '다이아3', .... ]

    • 매트랩초보 2016.03.21 00:14

      아 이제야 이해가 갔어요 정말 감사합니다 ㅠㅜㅠㅜㅠㅜ
      진짜 늦은시각에 불쑥질문에 명쾌한 답변 큰 도움이 됐습니다.
      다시한번 정말 감사합니다.

    • 남성 2016.03.21 00:17 신고

      도움 되셨다니 다행이네요 자주 방문해 주세요.

    • 매트랩초보 2016.03.21 00:19

      넵 알겠습니다!!!

  4. 잘봤습니다 2016.04.03 19:36

    글 잘봤습니다. 제가 처음 보는 내용도 있네요.
    질문 하나만 하고싶습니다...
    혹시 randi로 randperm같이 중복안되게 랜덤함수 생성하는 방법이 있나요?

    • 남성 2016.04.04 00:06 신고

      randperm 이 결국에는 카드 섞는거랑 비슷하니까

      randperm 이 있는데 굳이 이렇게 어렵게 할 필요는 없을것 같은데... 다음과 같이 해도 될 것 같긴 하네요.

      a = 1:52;
      b= randi(52,100,2);

      for n=1:100
      if b(n,1) ~= b(n,2)
      temp = a(b(n,1));
      a(b(n,1)) = a(b(n,2));
      a(b(n,2)) = temp;
      end
      end

    • 잘봤습니다 2016.04.04 23:21

      번거롭게해서 죄송하고 감사합니다. 자주들릴게용

    • 남성 2016.04.05 00:12 신고

      네~ 자주 방문해주세요

  5. 2016.04.11 22:44

    혹시 제가 직접 작성한 pdf 함수로 random number를 발생시키려면 어떻게 해야할까요???

    • 남성 2016.04.12 08:55 신고

      위에서 한것과 마찮가지로 CDF 를 구한후에 역함수를 취하고 0~1 사이의 random number 를 생성한후에 역함수에 집어 넣으면 되겠죠.

이번 포스팅에서는 각종 랜덤 값들을 이용한 PDF(Probability Density Function), CDF(Cumulative Distribution Function), CCDF(Complementary Cumulative Distribution Function) 를 그리는 방법에 대해 살펴 보려 합니다.

 

PDF 를 나타내는 방법에 대해 모르시는 분들은 다음 포스팅을 참조하시길 ~

 

2010/01/03 - [programming language/MATLAB] - MATLAB PDF (Probability Density Function)

 

평균이 2 이고 분산이 10 인 가우시안 잡음을 생성해 보겠습니다. 평균이 2 이므로 +2 를 하고 분산 값이 10 이므로 sqrt(10) 을 곱해 주게 됩니다.

 

 

이제 PDF 를 계산하게 됩니다.

 

PDF 를 나타낼 때 주의 하실 점은 꼭 정규화를 해서 PDF 내부의 면적이 1이 되야 한다는 겁니다.

 

코드는 다음과 같고 ~

 

 

이렇게 종 모양으로 나오고 종 모양의 가장 위 부분이 가로축의 2 에 위치하게 됩니다.

 

 

이제 PDF 값들이 준비가 됐으니 CDF 그리는 건 너무나 쉽죠.

 

PDF 를 구간 별로 적분 한 게 CDF 니까요. 적분 할 때는 다음 코드와 같이 resol 값을 곱해 줘야겠죠~ 그 다음에 누적해 주면 끝입니다.

 

 

PDF 의 전 구간에 대한 적분 값은 1 이니까 CDF 는 다음과 같이 끝에 가면 1 이 되게 되죠~

 

 

다음으로 CCDF 는 더 쉽습니다.

 

CCDF = 1 – CDF 입니다.

 

 

그래프는 당연히 CDF 를 위 아래로 뒤집은 모양이 될 것입니다.

 

 

이상으로 오늘의 포스팅을 마칩니다. PDF 를 계산할 때, 그 면적이 1 이라는 거 굉장히 중요한 겁니다. 많이 틀리는 부분이기도 하구요.

 

이 부분만 주의 하시면 쉽게 PDF 를 표현 하실 수 있습니다.

  

  1. 2011.11.18 14:18

    비밀댓글입니다

    • 남성 2011.11.18 15:11 신고

      resol = X(2)-X(1); 은 pdf 의 x 축의 간격을 구하는 겁니다.

      PDF_gaussian = pdf./(1000.^2.*resol); 부분은 pdf 면적이 1 이 되도록 정규화를 해주는 과정이구요


      위 식에서 1000^2 을 한 이유는 처음에 샘플을 randn(1000)해서 1000 x 1000 매트릭스로 만들었기 때문에 전체 샘플 수는 1000^2 개가 되기 때문입니다.

      1000.^2.*resol 을 한 것은 pdf 의 면적을 구한 겁니다. hist() 함수의 결과로 나온 pdf 라는 변수는 다 합치면 1000^2 이 되죠. 따라서 1000^2 으로 나눠주는 것이고 이렇게 됬을때는 pdf 의 면적은 resol 값이 되겠죠. 따라서 resol 값으로 또 나눠줘야 결국에 pdf 의 면적이 1 이 되는 겁니다.

      적분의 원리에 대해 생각해 보시면 저 코드에 대해 이해 하실수 있을것 같네요. 적분이라는게 결국에는 작은 사각형 또는 사다리꼴 등으로 잘게 나눈다음에 그 사각형 또는 사다리꼴의 면적을 다 더하는 거라는걸 생각해 보셨으면 합니다.

  2. 2012.10.23 21:59

    비밀댓글입니다

    • 남성 2012.10.23 22:23 신고

      이미지에 대한 histogram 도 마찮가지일것이라고 생각합니다.

      위 포스팅의 코드를 보시면 아시겠지만 A 라는 변수가 매트릭스 입니다.

      똑같이 처리하면 될 겁니다.

  3. 2016.05.15 18:56

    비밀댓글입니다

    • 남성 2016.05.16 01:54 신고

      hist3 같은 함수를 사용하면 될 것으로 생각되네요.

어느 컴퓨터 언어나 반복되는 부분은 함수화 하기 마련 입니다. MATLAB 도 예외는 아니죠.

 

이번 포스팅에서는 MATLAB 에서 함수 작성 방법에 대해 알아보도록 하겠습니다.

 

MATLAB 에서는 함수를 만들 수 있는 방법이 3 가지 정도 됩니다.

 

첫 번째로는 함수 파일을 만드는 방법이고, 두 번째로는 inline() 객체를 이용하여 함수화 하는 방법, 세 번째로는 function handle 을 이용하는 방법 입니다.

 

함수 파일을 만드는 방법부터 설명 드리도록 하겠습니다. 예를 들어 설명해 보죠.

 

a, b 라는 두 값을 입력 받아서 그 합과 차를 출력하는 함수를 만들어 보도록 하죠. 함수는 function 이라는 키워드를 먼저 써줘야 합니다.

 

그리고 다음 그림과 같이 구성을 합니다. 함수 이름은 func_add_minus 로 했고 괄호 안의 a, b 가 입력 입니다. 그리고 y, z 가 출력이죠.

 

 

이렇게 써주고 마지막으로 <파일이름과 똑 같은 파일명>.m 으로 저장을 해 줍니다. 파일명에는 특수 기호 등은 들어갈 수 없고 한글도 안됩니다.

 

위 함수의 사용 방법은 다음과 같습니다.

 

 

첫 번째 실행을 보시면 결과가 하나만 나오죠. 그리고 두 번째처럼 출력 값으로 x 만 지정을 하니깐 합만 나오고, 세 번째 실행처럼 출력을 두 개 설정해 주면 정상적으로 합과 차가 나오게 됩니다.

 

다음으로는 inline() 이라는 객체를 이용해 보겠습니다.

 

inline('식', '변수1', '변수2', ….) 의 형태로 표현됩니다. 이렇게 쓰니깐 잘 모르겠죠~

 

예를 들어 설명 해보죠.

 

 

위 수식과 같은 입력이 x, y 인 2차 함수를 inline()으로 표현하면 다음 그림과 같이 됩니다. f(2,3) 을 넣으니깐 20 이 나오고 x=[1 2 3], y=[3 4 5] 를 넣었더니 [8 22 44] 가 나오는 군요.

 

 

마지막으로 function handle 을 이용해 보겠습니다. 원래 function handle 이란 어떤 함수를 간접적인 방법으로 접근하는 건데, 임의의 함수를 정의 할 수도 있는 굉장히 편리한 방법 입니다.

 

위에서 썼던 수식을 다시 한번 이용해 보도록 하죠. 다음 그림을 보시면 이해가 쉬울 겁니다.

 

 

@(x, y) 에서 x, y 가 변수를 정의 하는 부분입니다. 그리고 뒤에 사용하고자 하는 식{3.*x.^2 + y .* x +2} 을 써주면 되는 거구요.

 

사용법은 inline() 객체로 정의했던 것과 동일 합니다. 너무 쉽죠? ^^;

 

MATLAB 의 cross product함수로 cross() 라는 함수를 제공합니다. 본 함수는 cross(A,B) 형태로 이용을 하며 A,B 는 인자가 3개 여야 합니다. 그렇지 않으면 에러가 납니다.

 

보통 cross product(외적) 는 x 기호로 나타내고 dot product (내적) 은 점(∙) 기호로 나타냅니다.

 

일단 그 수학적인 정의에 대해 살펴 보겠습니다. 벡터 A= 이고 벡터 B = 인 경우 cross product 는 A x B 로 표현이 되고 dot product 는 A ∙ B 로 표현이 되며 그 결과는 다음과 같습니다.

A x B= =

A ∙ B=

 

cross product 는 몇 가지 특징이 있습니다. A x B 는 A, B 에 직교 합니다.

 

즉 A,B 에 의해 이루어 지는 면적에 직교 한다는 뜻입니다. 마찮가지로 B x A 역시 A, B 에 직교 합니다.

 

하지만 AxB ≠ BxA 입니다. AxB 와 BxA 은 크기는 같고 방향은 반대인 벡터가 되게 됩니다.

 

이제 다음과 같은 평행 사변형에서 어떻게 적용이 되는지 살펴 보겠습니다.

위 평행 사변형의 면적은 가 됩니다. 위 식에서 절대값 기호( | | ) 는 벡터의 크기를 의미하는 것입니다.

 

두 벡터 A,B 가 이루는 삼각형의 넓이는 당연히 평행 사변형의 1/2 이 되게 되겠죠.

 

이제 몇 가지 예를 들어보죠~ 공간상의 점 A=(2, 3, 4), B=(4, 5, 6) 에 대해 위 공식을 이용하여 A, B 로 구성되는 평행 사변형의 면적과 삼각형의 면적을 구해 보겠습니다.

 

A=[2 3 4]

A =

2 3 4

 

B=[4 5 6]

B =

4 5 6

 

Cross_P= cross(A,B)

Cross_P =

-2 4 -2

 

Cross_P2= cross(B,A)

Cross_P2 =

2 -4 2

 

norm(cross(Cross_P, Cross_P2))

ans =

0

위 결과에서 두 값의 cross product 의 norm 값이 0 이므로 두 벡터는 평행 하다.

 

dot(Cross_P, A)

ans =

0

위 결과에서 두 벡터의 dot product 가 0 이므로 두 벡터는 수직이다.

 

trapz_area=norm(Cross_P) % 평행 사변형의 면적

trapz_area =

4.8990

 

Triangular_area=norm(Cross_P)/2 % 삼각형의 면적

Triangular_area =

2.4495

 

다음으로 다음과 같은 평행 육면체에 대해 살펴 보겠습니다.

 

위 그림과 같은 평행 육면체의 부피는 벡터 A, B 가 이루는 면적 *(곱하기) 평행 육면체 높이 가 됩니다.

 

위에서 설명 드린 데로 A, B 가 이루는 면적은 이고 평행 육면체의 높이는 가 되게 됩니다.

 

스칼라 삼중곱의 형태로 표현이 되며 결과적으로 다음과 같이 표현됩니다.

 

 

결과적으로 벡터 A, B, C 로 구성되는 평행 육면체의 부피는 다음과 같은 식이 성립하게 되겠죠

 

=====

 

그럼 이제 A=[0 1 3], B=[4 5 6], C=[5 9 17] 로 구성된 평행 육면체의 부피에 대해 알아보죠

 

A=[0 1 3]

A =

0 1 3

 

B=[4 5 6]

B =

4 5 6

 

C=[5 9 17]

C =

5 9 17

 

norm(dot(C,cross(A,B)))

ans =

5

 

norm(dot(C,cross(B,A)))

ans =

5

 

norm(dot(A,cross(B,C)))

ans =

5

 

norm(dot(A,cross(C,B)))

ans =

5

 

norm(dot(B,cross(A,C)))

ans =

5

 

norm(dot(B,cross(C,A)))

ans =

5



이번 포스팅에서는 input() 함수에 대해 설명해 보겠습니다. input() 함수는 말 그대로 사용자로부터 입력을 받는 함수 입니다. 사용 방법은 매우 간단합니다.

 

 

>> A=input('입력해 주세요: ') ;

입력해 주세요: 12

>> A

A =

12

 

 

 

다음과 같이 벡터도 입력 가능 합니다.

 

 

>> A=input('입력해 주세요: ') ;

입력해 주세요: [1 2 3]

>> A

A =

1 2 3

 

 

 

그럼 다음과 같이 좀 엄한 값을 한번 넣어 보죠.

 

>> A=input('입력해 주세요: ') ;

입력해 주세요: T

??? Error using ==> input

Undefined function or variable 'T'.

 

입력해 주세요:

 

 

 

그럼 위 결과처럼 <입력해 주세요: > 라는 부분이 다시 나오게 됩니다. 여기서 T 라는 값은 workspace 에 존재 하지 않기 때문입니다.

 

문자를 입력 할 때는 다음과 같이 끝에 's' 를 추가해 주면 됩니다. 여기서 s 는 string 의 약자 입니다.

 

>> A=input('문자를 입력해 주세요: ', 's') ;

문자를 입력해 주세요: g

>> A

A =

g

 

그럼 이제 문자 열도 입력을 받아 보죠.

 

>> A=input('문자를 입력해 주세요: ', 's') ;

문자를 입력해 주세요: abcd

>> A

A =

abcd

 

>> A(1)

ans =

a

>> A(2)

ans =

b

>> A(3)

ans =

c

>> A(4)

ans =

d

 

위와 같이 문자열을 입력했을 때 각 값들은 A 의 인자로 접근이 가능 함을 알 수 있습니다.

MATLAB 은 공학적으로 굉장히 편리 한 툴입니다. 하지만 편리함 속에는 단점도 있는 게 사실 입니다. 쉽다고 함부로 쓰다가는 정말 예상치 못한 결과에 당황하는 경우가 있곤 합니다. 따라서 MATLAB 함수 등을 쓰실 때는 help 문 이나 예제 등을 통해 정확히 알고 난 이후에 이용하는 것이 좋습니다.

 

이번 포스팅에서는 그럼 기본 함수 몇 가지를 비롯한 몇몇 주의 할 점 들에 대해 설명 드리겠습니다.

 

첫 번째로 소개해 드릴 함 수는 sort() 함수 입니다. 함수 이름만 봐도 이게 정렬을 해주는 함수구나 하는 건 아실 겁니다.

예를 통해 설명해 보도록 하죠~

 

A=magic(3)

A =

8 1 6

3 5 7

4 9 2

 

A 에 대해 sort() 함수를 적용해 보면 다음과 같습니다.

 

A1=sort(A)

A1 =

3 1 2

4 5 6

8 9 7

 

각 열에 대해 오름차순으로 정렬이 되는 것을 보실 수 있습니다.

 

각 행 마다 정렬을 하기 위해서는 아래와 같이 dimension 값을 2로 설정 해 주면 됩니다.

 

A2=sort(A,2)

A2 =

1 6 8

3 5 7

2 4 9

 

 

그럼 내림차순으로 정렬을 한번 해 보죠. 내림차순을 하려면 'descend' 라는 인자를 하나 추가해 주면 됩니다. 다음과 같이 처리 해 보죠 각 열 별로 내림차순으로 정렬되는 것을 알 수 있습니다. 오름차순이 default 값 이지만 'ascend' 를 써 주기도 합니다.

 

A3=sort(A,'descend')

A3 =

8 9 7

4 5 6

3 1 2

 

다음으로 max() 함수에 대해 설명 드리겠습니다. max() 함수는 큰 값을 찾아 주는 함수 입니다.

 

max_A=max(A)

max_A =

8 9 7

 

두 매트릭스의 각 인자 중 큰 값을 찾아 낼 수도 있습니다. 다음과 같이 매트릭스 B 를 만들어 보죠

 

B=ones(3)*5

B =

5 5 5

5 5 5

5 5 5

 

다음 결과에서는 matrix A, B 의 각 인자에 대해 비교를 해서 큰 값을 뽑아 낸 것을 알 수가 있습니다. 이렇게 이용할 때는 당연히 A, B 의 크기가 같아야 합니다.

 

max_AB=max(A,B)

max_AB =

8 5 6

5 5 7

5 9 5

 

 

그럼 각 행 별로 가장 큰 값을 찾을 때는 다음 코드와 같이 중간에 [] 를 써주고 세 번째 인자에 dimension을 써줘야 합니다. 이 부분이 max() 함수를 사용하면서 많이 실수 하는 부분입니다.

 

max_A_r=max(A,[],2)

max_A_r =

8

7

9

 

max() 함수는 최대 값과 그 인덱스도 알려 줍니다. 다음과 같이 써주면 됩니다.

 

[max_A, max_I] = max(A)

max_A =

8 9 7

max_I =

1 3 2

 

위 결과를 보면 첫 번째 열에서는 8 이 가장 크고 1 열에서의 인덱스는 1 이라는 것을 알 수 있습니다. 두 번째 열에서는 9 가 가장 크고 2열에서의 인덱스는 3, 세 번째 열에서는 7이 가장 크고 3열에서의 인덱스는 2 라는걸 알 수가 있죠.

 

이상으로 max() 함수의 설명을 마치겠습니다. min() 함수는 최소값을 구하는 함수이며 그 사용법은 max() 함수와 완전 동일 합니다.

 

다음으로 if ~ end 사용시의 주의 사항에 대해 말씀 드리겠습니다. if 문은 다음과 같이 조건이 만족하면 그 안의 내용을 실행하게 됩니다. m 파일 작성시 기본적으로 ;(세미콜론)을 붙여 주곤 하지만 <if 조건 > 라인의 뒤에는 세미콜론을 안 붙여도 됩니다. 간혹 다 붙이시는 분들이 있어서 말씀 드리는 겁니다.

 

if 조건

statement ;

end

 

이때 조건에 대한 판단이 굉장히 중요 합니다. if 문은 조건이 벡터 인 경우 그 결과가 다 참이어야만 if 안의 내용을 실행 합니다.

 

다음과 같은 예를 보죠

 

A=0

if [1 1 1]

A=100;

end

 

A =

100

 

위 예에서는 [1 1 1] 이므로 모두 참 입니다. 따라서 A=100 이 실행이 됩니다.

 

하지만 아래 코드에서는 0 이 거짓이므로 A=200 이 실행이 안 되는 거죠. 이 부분을 간과하고 코딩 시에는 정말 이해 못할 결과들이 많이 나오니 주의 하시길 바랍니다.

 

A=0

if [0 1 1]

A=200;

end

A =

0

 

 

마지막으로 for ~ end 문에 대해 설명 드리겠습니다. 기본적으로는 다음과 같이 씁니다. <for n=1:5 > 뒤에는 세미콜론을 안 붙여도 됩니다.

 

for n=1:5

disp(n)

end

 

1

2

3

4

5

 

 

이렇게 쓸 수도 있습니다.

 

n=1:5

n =

1 2 3 4 5

 

 

for k=n

disp(k)

end

 

1

2

3

4

5

 

for 문에서 등호의 오른쪽이 벡터일 경우에는 루프 마다 그 값들을 차례로 k 라는 변수에 넣고 실행이 되게 됩니다.

 


  1. 이진성 2014.03.28 18:38

    잘 봤습니다~! 특히 if [1 1 1]이 새롭군요~! 혹시 하나만 참이어도 실행되는 함수는 없죠?

    • 남성 2014.03.28 23:49 신고

      방문해 주셔서 감사합니다. ^^ 하나만 참이어도 실행되게 하고 싶다면 any() 함수를 사용하시면 됩니다 if any([0 1 1]) 과 같이 말이죠~

  2. 김지수 2016.05.15 11:50

    안녕하세요! 많은 도움을 받고갑니다. 질문하나 해도 될까요? 1x16 행렬에서 map = [0 1 3 2 6 7 5 4 12 13 15 14 10 11 9 8] 이런 값이 있는데 [x y] = sort(map)을 실행하게 되면
    x 값은 오름차순의 값으로 가는걸 이해 했으나 y값은 [1 2 4 3 8 7 5 6 16 15 13 14 9 10 12 11]로 나오는데 이해가 되지않습니다. 왜그런건가요??

통신에 대해 공부하다 보면 erfc(x) 함수나 Q(x), erf(x) 함수에 대한 내용들이 많이 나온다. 각 식들은 다음과 같다.

 
 



 



 



 

위 함수들은 각각 MATLAB 에서 erf(), erfc(), qfunc() 라는 명령어로 제공한다. erf(), erfc() 함수는 MATLAB 에서 기본적으로 제공하는 함수들이며 qfunc() 은 communication toolbox 에서 제공해주는 함수이다.

 

추가적으로 위 함수들과 관련하여 erfcinv() 라는 erfc 의 inverse 를 구해주는 함수qfuncinv 라는 qfunc() 의 inverse 를 제공해주는 함수도 있다.


  1. 저기요 2011.11.03 19:22

    위에 증명도 해주실수 있나요??

    • 남성 2011.11.04 01:46 신고

      erfc(x) 함수와 Q(x) 사이의 관계에 대한 증명을 말씀하시는건가요? 그거라면 t/sqrt(2) 부분만 간단히 치환적분 하면 될 듯 한데요.

+ Recent posts