본문 바로가기

[Study & Job]/[기타]

Matlab에 관한 고찰...

음...

학부때 전자과 친구들이 매트랩짤때 옆에서 보면서.. 오 쉬워보이는데 했는데..

막상 내가 대학원 수업을 들으면서 매트랩을 이용해서 암호화 프로그램들을 짜게 되는 날이 올줄이야..

뭐 언제나 그랫듯이 책도 없이 삽질하면서 배웠던게 좀 재미있었다..

하지만 여러 언어들을 이것저것 많이 익혀놨더니 막상 수업때 매트랩을 이용한 통계계산때

마구마구 헤깔렸다.. 그래서 포스팅 해둔다... 매트랩에 기본문법!!


변수들 삭제 및 저장
ex) save(변수명), clear, load(변수명)


인덱스만 뽑아내어 저장 및 계산
ex) ind = find(A == max(A)) -> A와 최대값을 찾아서 뽑아내라


이미지 입력 출력 함수
image = imread( 'test.png');     %영상 불러오기%
image = double(image);           %double로의 형변환%
figure, imshow(image);            %영상 출력%

사용자로부터 입력받기
rnd_num = input('랜덤숫자 갯수 : ');

기본적인 printf들
sprintf, fprintf있음

일단 각 요소들의 계산시 ". "을 붙여준다.

ex) a = [1 2 3 ; 4 5 6]
      b = [7 8 9 ; 11 12 13]
      c =  a.*b

그리고 배열 계산시 역행렬은 "'"을 붙여준다

ex) a = [1 2 3 ; 4 5 6]
     c = a'

그리고 행렬에 대한 쓸만한 함수들..
ex) zeros(2,4)->0으로 채워지는 행렬, ones(4, 2)->1로 채워진 행렬, eyes(3)->단위행렬
      reshape(A, 9, 1) -> 행렬을 바꿔준다.

행렬을 특정요소만 출력해주는것 그리고 기본적인 index 접근법
ex) a = [1 2 3 ; 4 5 6];
     a(1,2)
     a(1:2, 2:2)

배열의 기초
() => 접근
[] => 생성

행에 접근할때
ex) 1행에 접근시 -> a(1,:)

그리고 가장 기본적인거 뒤에 ";" 붙여주면 출력 안한다.

function 표현법
ex) function x = abc()
        - 함수 몸통 -
     end
그리고 중요한게 함수 생성시 .m파일의 이름과 함수명이 꼭 같아야함!!

comment 표현법
ex) a = 3; %변수선언
     %{
     }%

문자열관련 함수
숫자를 문자열로 바꿔주는 함수 -> num2str(10) -> 숫자를 문자로..
upper()-> 대문자로, lower() -> 소문자로

기본적인 난수 발생
a = floor(rand(1,2)*2) -> 버림
a = ceil(rand(1,2)*2) -> 올림
a = round(rand(1,2)*2) -> 반올림
a= randn(1,100) -> 좀더 분포를 표준분포에 가깝게 rand생성

분포도(histogram), plot  출력
plot(a) -> 그래프
hist(a, 50) -> 히스토그램 
축의 한계값, Grid line등을 설정한다
  MATLAB에서 축의 한계 값은 그래프에 그릴 데이터의 크기에 맞도록 자동으로 조정된다. 만약 자동으로 설정된 축의 한계값을 바꾸고 싶을때는 axis를 사용한다. 또한 그래픽 객체에 격자(grid)를 그리거나 지우고 싶으면 grid on/off를 사용한다.
    >>axis([1,5,-0.5,0])
    >>grid on

1.3.2.5 축의 한계값 및 축의 Tick Mark의 조정
  축의 최대·최소값은 기본적으로 데이터의 최대·최소값에 따른다. 이러한 축의 범위를 바꾸고 싶으면 axis를 사용하면 된다.
                       axis(v)
  v는 v=[x축의 최소값, x축의 최대값, y축의 최소값, y축의 최대값]의 행 벡터이다. 

처리 시간 잴때
tic->타임머 시작, toc->타임머 마감

- 제어문 관한 모든것 -

전장에서 Matlab을 어떻게 사용하는지 아주 기본적인 것에 대해서는 배웠다. Matlab은 사실 그렇게 배워야 되는 것이 많은 언어는 아니므로 몇가지만 더 해보기로 한다.

언어를 배우는데 있어서 기본적으로 필요한 것들은 데이터의 선언방법과 제어문 작성법, 서브루틴 작성법이다. 이 세가지 정도만 안다면 일단 시작을 할 수 있다. 바로 전 장에서 데이터의 선언은 기본적인 형태가 없고 그냥 선언에 따라 변한다고 했다. 그렇다면 이번에는 제어문 작성 방법에 대해 배워보자.

if, else, and elseif

if문은 가장 기본적인 제어문의 형태이다.
if logical_expression
   statements
end
여기서 logical_expression에서는 if문이 실행될 조건이 들어있다. 어떤 조건일때 밑에 있는 statements를 실행할지에 대해 조건을 줘야만 한다. 예제를 보자.
if a==3
   b=0.2;
end
위의 예제는 단순하게 a라는 변수의 값이 3이 되는 경우에 b라는 변수에 0.2라는 값을 대입을 하는 예제이다. 이 예제를 한줄에 쓸 수도 있는데
if a==3, b=0.2; end
comma(,) 기호나 ouput suppression(;) 기호를 사용하는 경우에는 한줄에 여러가지 명령어를 사용할 수 있다. else까지 포함하는 경우의 기본 형태는 다음과 같다.
if logical_expression
   statements 1
else
   statements 2
end
이 경우는 logical_expression에 맞는 경우에는 1번 문장이 수행되고 아닌 경우에는 2번 문장이 수행이 된다. 마지막으로 elseif를 사용하는 경우에 대해 설명하겠다. 이 경우는 나중에 나올 switch 문과 유사하다.
if logical_expression 1
   statements 1
elseif logical_expression 2
   statements 2
elseif logical_expression 3
   statements 3
end
좀전에 배운 else 경우에는 logical_expression이 들어가지 않았지만 elseif의 경우에는 여러개의 logical_expression이 들어갈 수 있다. 다음 예제를 보자
if n < 0
   disp('Negative');
elseif n == 0
   disp('Zero');
else
   disp('Positive');
end
이 예제에서 disp라는 명령어를 사용했는데 이 함수는 화면에 원하는 문장을 출력하는 함수이다. n이라는 변수의 값에 따라 음수인지 아니면 0이거나 양수인지를 화면에 뿌려주는 예제이다. 지금까지의 내용은 if문의 사용방법에 대해서 설명을 했다. 다음에는 switch문에 대해 설명을 해 보자.

switch

switch문은 여러개의 if-elseif를 사용하는 경우와 매우 비슷하다. 기본적인 형태는 다음과 같다.
switch expression
   case value1
      statements 1
   case value2
      statements 2
   .
   .
   .
   otherwise
      statements n
end
위의 기본 형태에서 expression의 값이 각각의 value와 일치하는 것에 따라 statement 를 실행을 한다. 그리고 기본적으로는 otherwise 다음의 명령어들을 실행하다. if-elseif를 사용하는 경우보다 깔끔하게 프로그램을 작성할 수 있다. 예제를 보자.
switch a
   case 1
      disp('a is 1');
   case -1
      disp('a is -1');
   case 0
      disp('a is 0');
   otherwise
      disp('something else !');
end
a의 값에 따라 다른 문장을 실행시켜준다.

while

while문은 좀 뒤에 설명이 될 for와 유사한 제어문이다. 조건에 맞을때까지 계속적으로 순차적으로 명령문들을 수행한다. 기본적인 형태를 한번 보자.
while expression
   statement
end
위에서 조건은 expression에 넣고 수행되어야할 문장은 statement에 넣어서 사용한다. 예를 들어 1부터 100 까지의 합을 계산하는 경우를 해 보자.
n=0;
sum=0;
while n < 100
   n=n+1;
   sum=sum+n;
end 
disp([n sum]);
위의 예제는 처음에 n과 sum 변수를 각각 0으로 하고 while 제어문에 의해 n을 증가시켜가면서 sum이라는 변수에 값을 더해간다. 이러한 반복적인 제어문을 사용할때는 조건을 잘 살펴봐야한다. 잘못하는 경우에는 원하는 결과를 얻을 수 없는 경우가 있다. 예를 들어 n=1이라고 하는 경우를 생각해보자.
n=1;
sum=0;
while n < 100
   n=n+1;
   sum=sum+n;
end 
disp([n sum]);
위의 예제는 좀전에 얘기한 예제와 아주 유사해 보인다. 그렇지만 결과값은 틀리게 나온다. 하나씩 분석을 해보자. n=1이라고 했기때문에 while문에 들어오면 n은 처음에 2라는 값을 가지게 된다. 그러면 sum에 더해지는 값은 n이 1인 값이 더해지는 것이 아니라 2는 값부터 더해지게 된다. 그렇다면 원하는 결과를 얻을 수 없을 것이다. 그러면 다시 한번 n=0이라고 하고 while문에서 순서가 바뀌는 경우를 보자
n=0;
sum=0;
while n < 100
   sum=sum+n;
   n=n+1;
end 
disp([n sum]);
이 경우는 sum에 처음 더해지는 값이 0이 더해지고 그 다음 값이 진행되므로 결과는 비슷하게 나올꺼라 예상이 된다. 그렇지만 좀더 생각을 해보면 n이 99인 값을 가지고 while이 진행이 되는 경우 100보다는 작기 때문에 while문은 참이 되서 진행이 된다. 그러면 sum에 99를 더하고 n이 하나 더 진행이 되므로 100인 값을 가지고 while문의 조건을 비교한다. 그런경우 100보다 작지 않기 때문에 while문을 더이상 진행하지 않고 나온다. 즉, n이 100인 경우의 값을 더하지 않게 된다. 결과는 1부터 99까지의 값을 더한 결과가 얻어진다. 그러므로 while문이나 for문을 사용하는 경우에는 조건에 대해 잘 생각을 해 봐야된다.

for

사실 위에서 얘기한 while문 보다는 for문을 더 많이 사용하는거 같다. 그 이유는 for문이 좀더 직관적으로 반복제어를 할 수 있기때문이다. 기본적인 형태는 다음과 같다.
for index=start:increment:end
   statements
end
for문이 실행되기 위해서는 실행되는 횟수에 대한 index를 만들어주는데 간격에 대한 정보를 넣어줘야된다. 이 부분은 이미 배열 부분에서 설명을 했다. 어떤 변수를 배열로서 사용하기 위해서는 var_name=start:increment:end 형식으로 만들어야 된다. for문에서도 동일하게 인덱스를 만들어 사용하면 된다. 이제 예를 들어보자. 1부터 10까지의 숫자들에 각각의 자승을 구하는 프로그램을 구성해 보자.
for i=1:10
   j=i^2;
   disp([i j]);
end
위의 프로그램을 실행하면
>>sample
     1     1

     2     4

     3     9
....
위와 같은 결과를 얻을 것이다. 보다시피 while문 보다 좀더 직관적인 표현으로 반복 실행문을 얻을 수 있다.

break

수행중인 제어문을 빠져나기기 위해서는 break를 사용한다. 예를 들어 1부터 10까지의 숫자에 대한 각각의 자승을 계산하다가 만약 7이라는 값이 나오는 경우 반복 실행문을 빠져나가는 예를 만들어 보자.
for i=1:10
   j=i^2;
   if(i==7), break, end
end
지금까지 배운것을 바탕으로 보면 위의 프로그램은 정확히 i 값이 7이 되었을때 반복 실행을 중단하고 빠져나간다. 위와 같이 반복 실행문을 빠져나갈 필요가 있는 경우에는 break 명령을 사용한다. 


행렬에 관한 모든것

2. 배열의 생성

() => 접근
[] => 생성
 

A=[1 2 3 4 5 6] //행벡터
A=[1; 2; 3; 4;] //열벡터  ;대신 엔터키

A=[1:2:13] // 첫번째 원소 1 간격2 마지막 원소
A=[1:2]    // 생략되면 디폴터 1

A=linspace(0,8,6) //첫번재 0 마지막 8 원소개수 6 간격자동

A=[1 2 3; 4 5 6] //행렬  (; = \n)
A=[1:2:11 ; linspace(10,60,6) ]

A=zeros(3,4) //영행렬
A=ones(4,3)  // 1로 
A=eye(5) // 단위행렬

B=A' //전치행렬


행렬명=A
A(3,4) // 값 호출
A(1:4) //1~4 호출

A(n,:) // n번째 행에 있는 모둔 열의 원소 호출
A(: m:n) m~n 열의 모든 행의 원소 호출
A(m:n, :) m~n 행의 모든 열의 원소 호출
A(m:n, p:q)

V=4:3:34  원소가 11개인 벡터 생성
u=

추가기능

DF=1:4
DF(5:10)=10:5:35
DF(100)=6 //중간에는 0으로
미생성(5) // 생성과 초기화
미생성(5,6) // 생성과 초기화 (5,6 행렬)

SUM=[A B] // 행이 같은 벡터끼리 더할수있다
SUM=[A'; B'] //열이 같은 벡터끼리 더할수있다.

 

 

제거
A(6)=[]  //삭제  원소수 끌어당겨지며 행수가 적어짐
A(3:6)=[] //3~6 삭제
A(:, 2:4)=[] // 행 삭제   (특정원소만 삭제 불가능)

내장함수
length(A)  // 원소 개수 돌려준다
size(A) // 2 3 식으로 몇X몇인지 알려준다
reshape(A, m, n) //(원수 개수가 같을때) M곱하기n으로 재정렬

문자열

B='asdf'  //문자열 배열로 생성  B(2) -> s
B=('asdfasdf', 'asdf','asdf') //문자열 행렬 생성

 

배열(벡터) 내장함수

A <-벡터

maen(A) =원소들의 평균값
max(A) = 최대값 반환
min(A) = 최소값 반환
sum(A) = 합
sort(A) = 오름차순정리
median(A) = 원소들의 중앙값 반환
std(A) = 표준편차 반환 
dat(A) = 행렬식 반환 
dot(a,b) = 두벡터 a와 b의 스칼라 곱을 계산
cross(a,b) = 두벡터의 외적
inv(A) = 정방행렬의 역행렬 반환

rand = 0~1 사이 난수값 반환
rand(1,n) = 0~1 사이 n의 난수로 구성된 행벡터 생성
rand(n) = 0과 1사이의 난수로 구성된 nXn 행렬 생성
rand(m,n) = 0과 1사이 난수들로이루어진 mXn행렬생성
randperm(n) = 1~n 까지 정수의 무작위 순열로 구성된 행백터 생성

 -기본적인 수학함수-
    abs(x)     x의 절대값을 계산한다.
    sqrt(x)     x의 근호값을 계산한다.
    round(x)  x를 가까운 정수로 반올림하여 반환한다.
    fix(x)       x를 0쪽으로 가까운 정수로 반올림하여 반환한다.
    floor(x)    x를 -∞쪽으로 가까운 정수로 반올림하여 반환한다.
    ceil(x)     x를 ∞쪽으로 가까운 정수로 반올림하여 반환한다.
    sign(x)    x가 0보다 적으면 -1, 0과 같으면 0, 
    rem(x,y)   x/y의 나머지를 계산한다.
    exp(x)     exponential(x)를 계산한다  

반응형