자바 프로젝트를 netbean 에서 윈도 실행 파일로 빌드하는 방법은 매우 간단한데 다음과 같이 프로젝트의 속성창에서 설정해주면 된다. (프로젝트명에서 오른 클릭을 하면 '속성'메뉴가 나온다.)

이 메뉴가 체크되었다면 프로젝트명에서 오른 클릭을 하면 'Pakage As..' 메뉴가 새로 생긴 것을 확인할 수 있을 것이다. 하위 메뉴의 'Image Only' 항을 선택하면 윈도우exe파일을 생성할 수 있다. 생성된 이미지는 프로젝트폴더/dist/bundle 폴더 안에 생성된다.


 만약 이것으로부터 msi 인스톨러를 생성하려면 Wix 와 같은 외부툴을 설치하여 사용해야 한다.


 그런데 javafx2 응용프로그램을 image build 를 해서 윈도우 exe 를 생성했을 경우 아이콘이 제대로 심어지지 않는다는 문제가 있다. (아직도 해결이 안 된 것 깉다.) 일단 프로그램 내부에서 사용되는 아이콘 이미지는 다음과 같이 설정해 주면 된다.

@Override

   public void start(Stage stage) throws Exception {

       primaryStage = stage;

       

       Parent root = FXMLLoader.load(getClass().getResource("FXMLDoc.fxml"));

       Scene scene = new Scene(root);

       stage.setScene(scene);

       stage.show();

       stage.getIcons().add(new Image("file:_resources\\icon_256.png"));

   }

하지만 deploy 된 실행 파일에는 아이콘이 제대로 표시되지 않으며 단축아이콘을 바탕화면으로 빼도 역시나 아이콘이 잘 못 표기된다. 여러가지 해결책이 검색되었지만 윈도7에서는 잘 해결되지 않았다.


 그 런데 'Bat to Exe Converter' 라는 프로그램을 이용하여 문제를 한 다리 건너서 해결하는 수가 있었다. 원래의 exe파일을 실행하는 배치파일을 다시 실행파일로 생성한 후 이것에 아이콘을 지정해 주면 문제가 해결되었다. 만약 원래의 실행파일이 ArudinoHarp.exe라고 한다면 다음과 같은 launcher.bat 화일을 생성한다.

    @echo off

    start ArduinoHarp.exe

이것을  'Bat to Exe Converter'  프로그램을 이용하여 아이콘을 지정해 준 후 실행파일로 바꾸는 것이다. 사용자는 이렇게 생성된 launcher.exe 파일을 실행시키거나 바탕화면에 단축아이콘을 지정해 줄 수 있다. 아이콘 이미지의 해상도는 64x64 이상이어야 제대로 표시된다.



Posted by 살레시오
,

 애드센스 수익금이 10달러가 처음 넘으면 등록된 주소를 인증해야 하는데 구글에서는 등록된 주소로 핀(PIN) 번호라는 것을 적은 엽서를 보내 사용자가 수령 후 그 번호를 애드센서에 입력하는 것으로 인증을 하게 된다. 그런데 애드센스를 가입할 때 주소에 아파트 동호수를 적지 않아서 주소를 다시 수정해야 했다. 애드센스 도움말에는 다음과 같이 나와있다.

그런데 아무리 여기 나온대로 톱니바퀴>설정>계정 정보 에 들어가도 ‘주소 수정’항목이 없어서 한참을 헤맸다. 좀 더 검색해 보니다음과 같은 절차를 따르면 된다.


 먼저 애드센스에 로그인한 후 ‘톱니바퀴>지급’ 항목으로 들어가야 한다.



위에서 보는 대로 ‘지급’ 항목으로 들어가는 것이 중요하다.


수취인 프로필로 들어가서 바로 있는 ‘수정’ 링크를 클릭한다.



여기서 주소를 수정한 후 ‘저장’ 버튼을 누른다. 이러면 된다.


 하지만 여기서 주소를 수정했다고 하더라도 이미 잘못된 주소로 발송된 핀번호 엽서는 어쩔수 없다. 3~4주 기다리면 다시 발송된다고 하니 기다리는 수 밖에 없다.



Posted by 살레시오
,


 이전 포스트에서 MATLAB의 스크립트 파일(m파일)에 대해서 설명했는데 파일로 기록하여 수행하는 것의 장점은 다음과 같다.

       ① 동일한 작업을 손쉽게 반복하여 수행할 수 있다.

       ② 변수값 등을 변경하여 재수행하기 편하다.


스크립트 m파일을 수행할 때 명령창에서 ‘ex1'이라고 명령을 내렸었다. 즉 파일이름이 곧 명령어가 되는 것이다. 만약 현재 작업공간에 'ex1'이라는 변수가 존재한다면 명령창에는 이 변수값을 보여줄 것인가 혹은 ex1.m화일을 수행할 것인가 우선 순위의 문제가 생긴다. 명령창에 어떤 명령어가 입력되었을 경우 다음과 같은 순서에 따라 검색한다.

  1. 현재 작업공간에 그 변수가 존재 하는가 검색한다. 변수가 존재할 경우 변수값을 보여준다.

  2. 만약 변수가 존재하지 않을 경우 내부적으로 정의된 함수들(MATLAB의경우 C: \MATLAB50 \Toolbox \Internal 폴더에 존재하는 함수들)을 검색하여 동일한 함수가 있으면 그 함수를 수행한다.

  3. 현재 폴더 내의 m파일을 검색해서 동일한 이름을 갖는 m파일이 있을 경우 그것을 실행한다.

  4. 만약 현재 폴더에 그 이름을 갖는 m파일이 존재하지 않을 경우 path에 등록된 폴더들을 검색하여 그 안에 동일한 이름을 갖는 M파일이 있는지 검색하여 존재하면 그것을 실행한다.

  5. 위의 모든 경우에 해당하지 않으면 에러 메세지를 발생한다.

따라서 직접 작성하는 m파일을 저장할 때 내부함수 ( sin, cos, exp, log 등등)와 이름이 겹쳐지지 않도록 주의해야 하며 lookfor명령어(또는 help명령어)를 사용하여 지금 사용하려는 파일명이 내부함수에 있는지 확인하는 과정도 필요하다.


 스크립트 m파일을 작성할 때 유용한 입출력  명령어들을 소개하면 다음 표와 같다.


[표 1] MATLAB의 입출력 함수들

함수명

기능

sprintf()

C언어의 printf()함수와 동일한 기능을 가진 함수

disp('문자열‘)

문자열을 화면에 표시

y=input('문자열‘)

키보드로부터 입력받은 값을 y에 저장

pause

아무 키나 눌려질 때까지 대기


위의 표에서 소개한 함수중 sprintf()함수는 C언어의 printf()함수와 동일한 기능을 가진 함수이다. 이함수들을 사용하여 다음과 같은 예제를 만들어 보았다. 입력한 후 'ex2.m'화일명으로 저장하자.


n=input('Type one positive integer :');
np=prod(1:n);
disp(sprintf('%d! = %d. Press any key.', n ,np))
pause
disp('All done.')


이 예제는 입력받은 양의 정수의 팩토리얼(factorial)을 구하는 m파일이다. prod()함수는 입력벡터의 모든 요소들을 곱하여 그 값을 반환하는 함수이다. 이제 편집창에서 [f5]를 누르던가 아니면 다음과 같이 명령창에서 실행시켜 결과를 확인해 보자.


>>ex2


[그림 1] gnu octave에서 실행시킨 화면


이와 같이 input(), disp(), sprintf() 함수를 이용하면 사용자로부터 입력을 받고 화면에 결과값을 출력하는 프로그램을 작성할 수 있다.

Posted by 살레시오
,

 간단한 작업을 수행하고자 할 때에는 이전에 소개한 명령어들을 MATLAB의 명령창에서 명령을 직접 입력하여 그 결과를 확인할 수 있다. 하지만 명령어들의 수가 많아지는 경우 혹은 전에 내렸던 명령들 중에서 변수 한두 개의 값만 바꿔서 다시 수행할 필요가 있다던가 하는 경우에는 다시 일일이 명령창에서 명령들을 입력한다는 것은 매우 번거로울 것이다. 이러한 경우에는 이들 명령어들의 묶음을 파일로 저장한 후 이 파일에서 명령어들을 읽어서 그대로 수행하도록 하는 기능이 유용하다. MATLAB에서는 이러한 기능을 지원하며 이 경우 자체적으로 지원하는 텍스트 에디터 창을 이용한다. M화일이라는 것은 이렇게 작성된 파일의 확장자가 ".m"이기 때문에 붙여진 이름이다.

스크립트(script) M파일

 글로 읽는 것 보다 직접 수행하여 보면 무슨 말인지 쉽게 이해가 갈 것이다. MATLAB에서는 메뉴의 ‘파일-새 파일’을 누르거나, 툴바의 단추를 누르거나, 단축키 Ctrl+N을 누르면 명령어창 옆에 새 파일 편집창이 나타난다. 이 편집창에 다음과 같은 예제를 입력해 보라.


erasers=4;
pads=6;
tape=2;
items = erasers+pads+tape
cost = erasers*25 + pads*52 + tape*99
average_cost = cost/items


[그림 1] gnu octave 에서실행한 모습


그리고 적당한 폴더를 만든 후 이 파일명을 “ex1.m"으로 하여 저장한다. 그 후 이 파일을 실행하려면 다음과 같이 두 가지 방법이 있다.

① 편집창 메뉴에서 Debug>Run(단축키 [F5])을 선택하면 명령창에 현재 편집창에 있는 명령어들이 순차적으로 수행된다. (gnu octave에서도 동일한 방법으로 수행하 수 있다.)

② 명령창에서 파일을 저장한 폴더로 경로를 바꾼다음 (cd 명령어 이용) 명령줄에 다음과 같이 입력한다.


>>ex1


그러면 다음과 같은 결과를 보게 될 것이다.

[그림 2] gnu octave에서 예제를 실행한 모습


위의 세 줄은 명령의 끝에 세미콜론(;)이 있어서 실행 결과가 안 나타나는 것이고 뒤의 세 줄에는 세미콜론이 없으므로 그 실행결과가 명령창에 나타난 것이다. 따라서 세미콜론을 이용하여 중간 과정이나 중요치 않은 결과는 화면에 보여주니 않고 중요한 연산결과만을 화면에 나타나도록 할 수 있다. 작업공간에 여섯 개의 변수가 생성됨을 변수창에서 확인할 수도 있다. 위의 결과에서 알 수 있듯이 M파일에 기록된 명령어들이 ‘순차적으로’ 수행된다. 즉 명령창에서 다음과 같이 하나씩 명령을 내려주는 것과 완전히 동일한 작용을 한다.


>>erasers=4;
>>pads=6;
>>tape=2;
>>items = erasers+pads+tape
>>cost = erasers*25 + pads*52 + tape*99
>>average_cost = cost/items


따라서 이러한 M파일을 스크립트(script) M화일이라고 한다. 스크립트란 ‘대본’이라는 뜻이므로 배우가 대본에 쓰인 순서대로 대사를 읊어나가고 적힌 대로 연기를 하듯이 스크립트 M파일에 기록된 것을 MATLAB이 읽어서 순서대로 명령을 수행을 한다.



Posted by 살레시오
,

 자바(JAVA)는 컴퓨터 프로그래밍 언어 중의 하나로 썬마이크로시스템스(Sun Microsystems, 이하 썬) 라는 회사에서 개발하여 1996년 1월에 초기 버전이 발표된 객체 지향 (object-oriented) 언어이다. 썬의  제임스 고슬링, 아서 밴 호프와 같은 엔지니들이 처음 설계하였다고 알려져 있다.


    

[그림 1] 자바의 창시자인 제임스 고슬링과 마스코트(duke) 이미지


 원래는 썬의 엔지니어들에 의해서 가전 제품에 탑재될 소프트웨어를 만들려는 목표로 1990년에 개발이 시작되었다. 프로젝트의 초기에는 C++을 확장하여 사용하려 했지만 적합하지 않다고 판단하여 C++의 장점은 취하고 단점은 보안한 새로운 언어인 Oak 가 만들어졌다. 이후에 인터넷에 적합하도록 개발 방향이 바뀌면서 자바로 이름을 바꾸고 정식 버전을 1996년 1월에 발표하였다. 인터넷이 보급되면서 운영 체제와 상관 없이 어디에서든 실행할 수 있는 자바의 특성과 자바 애플릿(applet)의 인기에 힘입어 널리 사용되기 시작하였다.


 자바는 “Write once, run anywhere”라는 모토에 충실하여 한번 작성되어 컴파일된 실행 파일은 운영 체제와 상관없이 실행 가능하다. 이것이 가능한 이유는 자바 컴파일러는 소스 프로그램을 특정 기계어로 번역하지 않고 가상 언어로 번역한다. 그리고 그 가상 언어를 특정 기계어로 번역하여 실행하는 시스템을 자바 가상 머신(Java virtual machine, JVM)이라고 한다. (이름에 머신이라는 말이 붙어 있지만 이것도 프로그램이다.) 이 자바 가상 머신(Java Virtual Machine)은 여러 OS용으로 만들어져 있으므로 이것이 설치된 곳이라면 윈도PC, 맥, 리눅스, 서버 컴퓨터, 심지어 가전 제품 등 가리지 않고 어디에서든 자바 프로그램을 실행할 수 있다. 이러한 장점으로 인해서 자바는 다양한 기종의 컴퓨터와 운영 체제가 공존하는 인터넷 환경에 적합한 언어로서 인터넷의 발전과 함께 많은 사용자를 확보해 나갔다. 또한 기존의 C++언어의 장점은 채택하되 잘 사용하지 않는 부분은 배제하고 비교적 배우기 쉬운 간결한 문법도 사용자층을 넓히는데 한몫했다. 그리고 풍부한 클래스 라이브러리(Java API)가 공개되어 있기 때문에 프로그래머는 이것을 잘 활용하면 손쉽게 강력한 기능의 프로그램을 작성할 수 있다.


 자바를 처음 개발해서 보급했던 썬마이크로시스템스는 2010년에 데이터베이스로 유명한 오라클 (Oracle) 이라는 회사에 합병되었으며 따라서 현재 자바는 오라클사에 의해서 유지/배포되고 있다. 한 예로 구글의 안드로이드는 자바의 API를 이용하여 작성한 달빅(Dalvik)이라는 가상 머신 위에서 자바로 작성된 앱을 구동하며 자바 개발자들을 안드로이드로 끌어들여 큰 성공을 거두었다. 하지만 이로 인해서 오라클과 구글 간 자바  API의 사용료(저작권료)에 대한 소송이 진행되고 있기도 하다.


 자바 언어의 특징은 다음과 같이 요약할 수 있다.


  1. 운영체제에 독립적이다. 한번 만들어진 실행 파일은 자바 가상 머신이 설치된 곳이라면 어느 곳에서든지 바로 실행할 수 있다.

  2. 겍체 지향 언어이면서 배우기 쉽고 간결한 문법을 가지고 있다.

  3. 포인터(pointer)를 다룰 필요 없이 메모리 관리를 가상 머신이 자동으로 수행한다.

  4. 네트워크, 분산 처리, 멀티 쓰레딩을 지원한다.

  5. 최근에는 성능도 많이 개선되어 c/c++로 작성된 프로그램에 비해서도 그 실행 속도가 뒤지지 않는다.


 앞으로는 이러한 특징을 가지는 자바 언어의 기본적인 개발 방법에 대해서 알아보도록 하겠다.



Posted by 살레시오
,

 자바에는 기본형에 대응하는 wrapper 클래스가 있다. 예를 들면 int 는 Interger, double은 Double 이다. 제네릭 클래스에는 기본형을 사용할 수 없으므로 이 wrapper 클래스를 사용해야 한다.


 그런데 기본형과 wrapper클래스의 성능 차이가 궁금해서 다음과 같은 간단한 프로그래으로 시험해 보았다.


package wrappertest01;

public class WrapperTest01 {
   public static long iter = 1000000L;
   public static int id;
   public static double db, dSum;
   public static long le, ls;

   public static Double[] dArr;
   public static double[] darr;

   public static void main(String[] args) {
       dArr = new Double[100];
       for(int k=0;k<100;k++) dArr[k]=new Double(1.0);
       
       darr = new double[100];
       //for(int k=0;k<100;k++) dArr[k]=new Double(1.0);

       lst = new ArrayList<>();
       for(int k=0;k<100;k++) lst.add(new Double(1.0));

       doIt();
       doIt();
       doIt();
   }
   
   public static void doIt() {
       double dSum1 =0, dSum2=0;
       long id;
       for(int n=0;n<10;n++) {
           
           ls = System.nanoTime();
           for(int k=0;k<iter;k++)
               for(int x=0;x<100;x++) {
                   db=dArr[x];
                   dArr[x]=db;
               }
           le = System.nanoTime();
           dSum1 += (le-ls)/1e9;

           ls = System.nanoTime();
           for(int k=0;k<iter;k++)
               for(int x=0;x<100;x++) {
                   db=darr[x];
                   darr[x]=db;
               }
           le = System.nanoTime();
           dSum2 += (le-ls)/1e9;
        }
       System.out.println("Double Arr: "+dSum1/10+ "sec.");
       System.out.println("double arr: "+dSum2/10+ "sec.");
   }
}


단순히 배열을 만들어서 배열의 요소를 읽고 쓰는 동작만 1억x100 번을 10번 실행한 평균 시간을 구한 것이다. wrapper클래스가 오버헤드가 있으므로 당연히 다소 느릴거라는 예상 했다. 결과는 기본형의 배열이 훨씬 더 동작이 빠르다는 것이다.



수치상으로는 거의 40배 빠르다.  이 실험만으로 전반적인 성능 비교는 물론 안되겠지만 성능이 중요한 곳에서는 왠만하면 기본형을 사용해야하며  제네릭 클래스를 구현하는 경우와 같이 어쩔 수 없는 경우에만 wrapper 클래스를 사용해야 한다는 언급이 맞는 것 같다.




Posted by 살레시오
,

 자바에서는 일차원 배열뿐 아니라 이차원, 삼차원.. 등등의 다차원 배열도 사용할 수 있다. 삼차원 이상의 배열은 이차원 배열과 사용법이 동일하므로 여기서는 이차원 배열에 대해서만 설명하겠다.


 이차원 배열은 선언할 때 변수명 뒤에 대괄호 쌍 두 개가 온다. 예를 들면 다음과 같다.


int num[][];
double val[][];
char mch[][];


위의 선언문은 사용했다고 해서 바로 배열을 사용할 수는 없고 일차원 배열에서와 마찬가지로 실제 메모리를 할당받아야 하는데 new 연산자를 이용한다. new 키워드 다음에 자료형[차수][차수] 형태로 입력한다. 예를 들면 다음과 같다.


num = new int[3][4];
val = new double[2][3];
mch = new[100][1000];


메모리를 할당하면 배열의 요소는 자동으로 기본값(정수형, 실수형은 0)으로 채워진다. 위와 같이 선언과 메모리 할당을 분리해서 수행할 수도 있고 아니면 선언과 메모리 할당을 동시에 할 수도 있다.


int num[][] = new int[3][4];;
double val[][] = new double[2][3];
char mch[][] = new char[100][1000];


만약 선언과 동시에 배열을 특정한 값들로 초기화를 하는 경우라면 new 연산자를 사용할 필요 없이 다음과 같이 중괄호를 이용할 수 있다.


double val[][] = {
   {1.1, 2.2, 3.3},
   {4.4, 5.5, 6.6}
};


이 경우 주어진 초기값에 의해서 배열의 크기는 자동으로 정해지게 된다.

 배열의 요소를 참조하는 방법은 일차원 배열과 유사하게 변수명 뒤에 대괄호로 인덱스를 지정하는데 이 경우 대괄호쌍이 두 개가 온다.


val[0][0] = 10.1; // 요소값을 지정하는 경우
double da = val[1][2]; //요소값을 읽어내는 경우


이차원 배열의 경우 length 필드는 최상위 차원의 크기를 갖는다. 하위 차원의 크기를 구하고 싶다면 다음과 같이 하면 된다.


System.out.println( val.length ); // 2가 출력된다.
System.out.println( val[0].length ); // 3이 출력된다.
System.out.println( val[1].length ); // 3이 출력된다.


 자바에서 배열은 참조형(reference type)이라는 점도 숙지하고 있어야 한다. 따라서 다른 함수에서 배열을 그대로 받아서 조작하는 경우 원 배열도 영향을 받게 된다.



Posted by 살레시오
,

 자바 제네릭(generic) 프로그래밍에 대해서 실습하던 중에 제네닉 타입의 단순 배열을 생성하는데 미묘하게 안 되는게 있기도 해서 구글링을 해 보았더니 배열을 쓰지말고 웬만하면 List<>를 사용하는게 여러 모로 편하다고 하는 의견들이 많았다. 성능차도 별로 없다고 해서 직접 간단한 프로그램으로 실행 시간을 측정 해보기로 하였다..


 초기에 크기는 배열과 리스트 모두 정해졌다고 가정하고 단순 읽고 쓰는 속도만 비교하였다.


package listtestj01;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class ListTestj01 {
   public static    long iter = 1000000L;
   public static    int id;
   public static    double db, dSum;
   public static long le, ls;

   public static Double[] dArr;
   public static List<Double> lst;

   public static void main(String[] args) {
       dArr = new Double[100];
       for(int k=0;k<100;k++) dArr[k]=new Double(1.0);
       
       lst = new ArrayList<>();
       for(int k=0;k<100;k++) lst.add(new Double(1.0));

       doIt();
       doIt();
       doIt();
   }
   
   public static void doIt() {
       double dSum1 =0, dSum2=0;
       long id;
       for(int n=0;n<10;n++) {
           
           ls = System.nanoTime();
           for(int k=0;k<iter;k++)
               for(int x=0;x<100;x++) {
                   db=dArr[x];
                   dArr[x]=db;
               }
           le = System.nanoTime();
           dSum1 += (le-ls)/1e9;

           ls = System.nanoTime();
           for(int k=0;k<iter;k++)
               for(int x=0;x<100;x++) {
                   db = lst.get(x);
                   lst.set(x, db);
               }
           le = System.nanoTime();
           dSum2 += (le-ls)/1e9;
        }
       System.out.println("Double Arr: "+dSum1/10+ "sec.");
       System.out.println("List<Doub>: "+dSum2/10+ "sec.");
   }
}


이 예에서 붉은 색으로 마킹된 부분을 보면 단순히 배열 요소에서 하나를 읽고 다시 하나를 쓰고를 1억번 반복하고 이것을 다시 열 번 반복해서 평균시간을 구해서 비교하는 것이다. 내 노트북(윈764비트)에서 다음과 같은 결과를 얻었다.



세 번 반복해서 재 보아도 모두 단순 배열쪽이 두 배 이상 속도가 빨랐다. 리스트가 느리더라도 그 차이가 많이 안 나길 기대했는데 이것으로 적어도 대규모 연산이 있는 곳에서는 단순 배열이 속도 면에서 훨씬 더 낫다는 (당연한) 결과를 얻었다.




Posted by 살레시오
,

 MATLAB에서 여러 개의 그래프를 분할하여 하나의 그래프 창에서 모아 그리고자 하는 경우 subplot 명령을 이용한다. subplot 명령을 사용하면 그래프 창을 분할하여 다수의 그래프를 하나의 그래프 창에 도시할 수 있다. 이 명령어의 입력 인자는 그래프 창을 분할하는 행의 개수, 열의 개수 그리고 몇 번째 그래프인지를 지정하는 수의 세 개이다.


 예를 들어 subplot(2,2,3)한 후 plot(x,y)를 하면 하나의 그래프 창을 가로로 이분할, 세로로 이분할하여 3 번째의 위치에 x, y 벡터로 구성된 그래프를 도시한다는 명령이 된다. 그래프의 순서를 세는 것은 맨 첫 번째 행부터 가로로 세어 나가는 것을 원칙으로 한다.


>> x=linspace(0,2*pi,100);
>> subplot(2,2,3)
>> plot(x,sin(x))
>> subplot(2,2,2)
>> plot(x,cos(x))


[그림 1] 실행 결과 (gnu octave 실행 화면을 캡쳐한 것임)


우선 화면이 가로 세로 각 2 개씩 4 분할되는 것을 확인할 수 있으며 두 번째와 세 번째 위치에 그래프를 그리게 된다. 왼쪽 하단의 그래프가 먼저 그려지고 오른쪽 상단의 그래프가 나중에 그려지게 된다.


[그림 2] 2x2 로 분할한 경우 각 부분의 번호


각 분할 그래프의 선 모양, 색깔 바꾸기 등은 전에 설명한 바와 같이 그래프 정보 대화상자에서 할 수 있으며 명령어창에서도 가능하다. 명령어창에서 하려면 우선 subplot 함수를 이용하여 바꾸고자 하는 분할 그래프를 선택한 후 plot이나 title 등 원하는 함수를 이용하여 수정하고 나타낸다.


 다른 예를 들면 다음과 같다.


>> x=linspace(0,2*pi,100);
>> subplot(211), plot(x,sin(x))
>> subplot(212), plot(x,cos(x))


이 경우는 화면은 2분할하여 첫 번째 부분 화면에는 sin(x)를 그리는 것이고 두 번째 부분화면에는 cos(x)를 그리는 예제이다.

[그림 3] 실행 결과 (gnu octave 실행 화면을 캡쳐한 것임)


[그림 4] 2x1 로 분할하였을 경우의 그래프 번호


이 예에서와 같이 subplot()함수의 세 개의 인수는 각각 콤마(,) 로 구분하여 줄수도 있고 뿥여서 하나의 숫자로 넘겨줄 수 도 있다.



Posted by 살레시오
,

 이전 포스트들에서 설명한 plot(a,b) 명령어에서는 a벡터를 x축에, b벡터를 y축에 선형 스케일로 2차원 그래프를 그린다. 수학이나 공학에서는 넓은 영역의 값을 한 그래프에 나타내기 위해 때때로 로그 단위의 그래프를 그릴 필요가 있다. 특히 주파수를 기본 축으로 하는 함수에서는 그 값이 일반적으로 log 단위로 표시되는데 이때 사용되는 명령어로는 아래와 같이 semilogx(), semilogy(), loglog() 등이 있다. 그리고 극좌표 스케일의 그래프를 그릴 때는 polar() 함수를 사용한다.

[표 1] 로그 스케일 그래프를 생성하는 함수

loglog(a,b)

x축과 y축 모두 로그 스케일인 그래프 생성

semilogx(a,b)

x축만 로그 스케일인 그래프 생성

semilogy(a,b)

y축만 로그 스케일인 그래프 생성

polar(a,b)

극좌표 그래프를 그린다

 예를 들어 다음의 식을 고려해보자.

먼저 x축의 값인 주파수를 로그단위로 나타내 보자. 함수 logspace()를 사용하면 일정한 상용 로그값 차이를 갖는 벡터를 만들어 준다.


>> w = logspace(-1,2,100)
>> H = 1 ./(1+w.^2).^0.5
>> semilogx(w,H)
>> grid on


벡터 w에는 10-1(rad/sec)에서 102 (rad/sec)까지의 값을 100등분하여 로그값을 저장한다. 즉, logspace() 함수는 다음과 완전히 동일하다.


>> w = 10.^linspace(-1,2,100)


x축을 log 스케일로 그리는 그래프는 semilogx() 함수를 이용하면 된다.

[그림 1] 실행 결과 (gnu octave 실행 결과를 캡쳐)


 polar()함수는 극좌표계의 그래프를 그려준다. 입력 인수로 거리와 각도를 각각 받는다. 즉 polar(r, a) 에서 r은 거리의 벡터, a는 각도(단위는 라디안)의 벡터로 주어져야 한다.


>> polar(0:10, 0:10)


[그림 2] 실행 결과 (gnu octave 실행 결과를 캡쳐)


polar()함수가 그림을 그리는 원리는 plot()함수와 동일하다. (거리, 각도) 쌍의 점을 찍은 후 그것들을 선으로 이어주는 것이다. 선의 색/모양을 지정하는 방법은 polt()함수와 동일하다.


>> t=linspace(0,pi,100)
>> polar(sin(t), cos(t))


[그림 2] 실행 결과 (gnu octave 실행 결과를 캡쳐)


이렇게 MATLAB에서 로그스케일 그래프와 극좌표 그래프를 쉽게 생서할 수 있다.



Posted by 살레시오
,