오늘은 Scilab 에서 figure 창을 닫는 명령어에 대해 소개 하려 합니다.

 

MATLAB 에서는 간단하게 close 를 하면 현재 figure 창이 닫히고 close all 을 하면 현재 열려진 모든 figure 창이 닫힙니다.

 

하지만 Scilab 에서는 그렇지 않더군요. 어떻게 해야 MATLAB 의 close all 과 같은 기능을 할 수 있을 까 찾아보니~

 

아래 주소의 글이 있더군요.

 

http://help.scilab.org/docs/5.3.3/en_US/m2sci_close.html

 

scilab 에서 MATLAB 의 Close all 과 같은 기능은 xdel(winsid()) 라고 명령해야 합니다.

 

여기서 xdel 은 graphics window 를 닫는 함수이고~ winsid 함수는 graphics windows 의 리스트를 반환하는 함수라고 합니다.

 

그래서 xdel(winsid()) 의 뜻은 graphics windows 의 리스트를 반환하고~ 그 반환 값들을 다 닫으라는 뜻이 됩니다.


아래 포스팅에서 MATLAB 을 이용한 logscale 그래프 그리는 방법에 대해 설명 드렸습니다.

  

2013/01/29 - [programming language/MATLAB] - MATLAB 로그 스케일 그래프 그리기 semilogx(),semilogy(), loglog()

MATLAB 에서는 semilogx, semilogy, loglog 와 같은 함수를 사용하여 x, y 축에 대해 로그 스케일 그래프를 그리게 되는데요~

 

Scilab을 이용하여 2차원 평면에서 로그 스케일 그래프를 그릴때는 plot2d 함수를 사용합니다.

 

plot2d([logflag,][x,],y[,style[,strf[,leg[,rect[,nax]]]]])

 

위 plot2d 함수의 원형에서 logflagn 으로 설정하면 normal scale, l (소문자 L) 로 설정하면 log scale 입니다.

 

그래서 xy 축을 둘다 로그 스케일로 설정하고 싶다면 logflag 값을 ll 로 설정하고~

 

X 축은 log 스케일로 y 축은 normal scale 로 설정하고 싶다면 ln, x축은 normal scale, y 축은 log scale 로 설정하고 싶다면 nl 로 설정하면 됩니다.

 

그럼 간단하게 예제를 하나 그려 볼까요?

 

다음과 같은 데이터에 대해~

 

x= 0:0.1:10;

x_10=10.^x;

 

semilogx 예제는 다음과 같습니다.

 

figure()

subplot(211)

plot2d("nn",x_10, x)

xtitle("Normal scale", "x axis", "y axis");

 

subplot(212)

plot2d("ln",x_10, x)

xtitle("Semilogx", "x axis", "y axis");

 

 

semilogy 예제는 다음과 같습니다.

 

figure(1)

subplot(211)

plot2d("nn",x,x_10)

xtitle("Normal scale", "x axis", "y axis");

 

subplot(212)

plot2d("nl",x,x_10)

xtitle("Semilogy", "x axis", "y axis");

 

 

loglog예제는 다음과 같습니다.

 

figure()

subplot(211)

plot2d("nn",x_10, x_10)

xtitle("Normal scale", "x axis", "y axis");

 

subplot(212)

plot2d("ll",x_10, x_10)

xtitle("loglog", "x axis", "y axis");

 


MATLAB 에서와 마찬가지로 Scilab 에서도 cell 타입을 지원 합니다.

 

cell 타입은 특이하게도 모든 데이터 타입들을 다 저장 할 수 있는 데이터 타입입니다.

 

MATLAB 에서는 아래 포스팅에서 소개한 적이 있습니다.

 

Scilab 에서는 cell() 은 아래와 같이 m1,m2,….mn 의 다차원으로 정의 할 수 있습니다.


 

c = cell(m1, m2, ..., mn)

 

c = cell(3) 이라고 정의 하면 3 행 3열의 cell 을 정의합니다. 3 행 1열의 cell 을 정의하고 싶다면 c = cell(3,1) 이라고 정의 해야 합니다.

 

cell 의 차원을 알기 위해서는 아래와 같이 dims를 사용하거나 size() 함수를 사용하는 방법이 있습니다.

 

c.dims or size(c)

 

dims 로 차원을 확인해 보면 그 리턴 타입이 int32 입니다. 이런 경우 index 로는 사용 할 수 없다고 합니다.

 

size() 함수로 차원을 알아보면 동일한 결과가 나오지만 그 type 을 확인해 보면 double 인 것을 확인 할 수 있습니다. (type 의 결과가 1 인 것은 double 을 의미 합니다.) 따라서 인덱스로 사용할 수 있겠죠.

 

다음으로 cell 의 각 element 에 접근 하기 위해서는 괄호() 를 사용하는데 그냥 () 만 사용해서 나온 결과는 cell 입니다.

 

따라서 각 index의 값에 접근 하고 싶을 때는 entries 라는 키워드를 사용해야 합니다.


 

괄호는 sub cell 에 접근 할 때 사용합니다. 위 그림은 X 라는 3행 2열 cell 의 모든 행 1열에 b 라는 셀을 넣는 예입니다.


텍스트 파일 등에 저장된 실험 데이터 등을 처리 할 때 MATLAB 에서는 load 라는 명령어를 통해 데이터를 읽어 들이곤 합니다.

 

abc.txt 라는 파일에 데이터가 저장되어 있을 때~~ 간단하게~~ load abc.txt 라고 MATLAB command window 에 타이핑하면 abc 라는 변수로 데이터가 로드 되는거죠~

 

Scilab 에서는 loadmatfile 라는 함수가 있습니다.

 

다음과 같이 abc.txt 파일에 숫자로 된 데이터가 저장되어 있을 때~

 

Scilab console 에 다음과 같이 타이핑하면 abc.txt 파일의 데이터를 로드 할 수 있습니다.

 

loadmatfile('abc.txt')

 


Scilab 을 사용하다 보면 변수의 size 가 커지는 경우에는 다음과 같은 메시지와 함께~ stacksize 관련 에러를 접하게 되는 경우가 많은데요~



!--error 17

stack size exceeded!

Use stacksize function to increase it. 




이런 경우에는 scialb console 에 아래 명령어를 통해 stacksize 를 최대로 설정해서 사용해야 합니다.

 

stacksize('max')

 

그런데 위 명령어를 Scilab 을 사용할 때마다 타이핑하는 건 굉장히 귀찮은 일이죠~

 

그래서 저는 MATLAB startup 파일 설정하듯이 Scilab 도 .scilab 또는 scilab.ini 라는 초기 설정 파일을 설정해서 사용합니다.

 

http://help.scilab.org/docs/5.3.3/en_US/startup.html


2013/09/30 - [programming language/MATLAB] - MATLAB 시작 폴더 변경 및 startup.m 파일 설정


 

초기 설정 파일의 위치는 Scilab console 아래 명령어를 타이핑 하여 확인 있습니다.

 

SCIHOME

 

아래 그림과 같이 소문자로 타이핑하면 에러가 납니다. 꼭!! 대문자로 하셔야 합니다.


 

SCIHOME 폴더를 확인 한 후에 저는 다음과 같이 scilab.ini 라는 파일을 하나 만들었습니다. .scilab 파일을 만들어도 상관 없습니다.


C:\Users\ADMINI~1\AppData\Roaming\Scilab\scilab-5.4.1\scilab.ini


 

다음으로~ scilab.ini 파일에 다음과 같이 타이핑했습니다.

 

stacksize('max'); // buffer maximum

cd D:\ ; // working directory to D:\

 

이제 Scilab 을 시작하면 자동으로 위 스크립트가 실행되게 됩니다.



MATLAB 을 비롯한 대부분의 프로그래밍 언어들은 함수를 만들어서 사용할 수 있는데요.

 

MATLAB 과 유사한 수치 분석 프로그램인 Scilab 역시도 함수를 만들어서 사용할 수 있습니다.

 

MATLAB 을 사용해 보셨던 분이라면 Scilab 에서 함수 만들기는 너무나 쉬운데요~

 

함수의 정의는 다음과 같습니다.

 

function [a, b] = funcTest(x)

a=length(x);

b=x.*2;

endfunction

 

함수의 시작에는 MATLAB 과 마찬가지로 function 이라는 키워드를 적어주고~ 함수의 끝에는 endfunction이라고 적어 줍니다.

 

a, b 가 출력이고~ x 가 입력 인자입니다. 인자 들은 쉼표(,) 로 구분해 줘야 합니다. 함수이름은 funcTest 이고 해당 함수를 funcTest.sci 라는 파일 이름으로 적어줬습니다.

 

Scilab 에서는 함수는 보통 sci 확장자로 만듭니다.  


2012/01/12 - [programming language/SCILAB] - SCILAB 간단 사용법


위 함수의 내용은 x 라는 입력에 대해 길이를 구해서 a 에 리턴하고~

 

X 에 2 배를 해서 b 에 출력하는 함수 입니다.




다음으로 위 함수를 이용하는 방법에 대해 설명 드립니다.

 

MATLAB 등에서는 MATLAB path 내에 함수만 있다면 그냥 바로 사용할 수 있는데 Scilab 은 그렇지 않습니다.

 

같은 디렉터리에 위 함수가 있어도 바로 사용할 수 없습니다.

 

바로 사용하려 하면 다음 그림과 같이 Undefined variable: funcTest 라는 에러를 볼 수 있는데~ funcTest () 함수는 말 그대로 정의 되지 않은 함수라는 겁니다.

 

Scilab 에서 함수는 항상 execution 을 해줘야 사용 할 수 있습니다.

 

아래 그림과 같이 세 개 중의 하나를 선택해서 실행 해주면 됩니다.

 

이제 방금 만들었던 funcTest () 라는 사용자 함수가 정상적으로 동작하는 것을 확인 할 수 있습니다.

 

다음으로 console 에서 실행 시키는 게 아닌 다른 실행 파일에서 함수를 사용할 때는 C/C++ 코드에서 include 하듯이 함수 사용 전에 execution 하는 문장을 하나 넣으면 됩니다. exec () 함수를 사용하고~ 다음과 같이 정의 합니다.   

exec(path [,mode])


위 정의에서 path 는 말 그대로 execution 하고자 하는 함수의 파일 path 이고 mode 는 실행 모드를 의미 합니다.

 

같은 폴더 내에 있을 때는 full path 를 적지 않고 아래 실행 예처럼 함수 이름만 적어줘도 무방 합니다.

 

mode 는 그 실행 방법에 따라 8 가지 정도의 옵션이 있더군요.

 

Console 에 그 내용을 표시 할지 말지 --> 로 표시되는 프롬프트를 표시 할지 말지 와 같은 것에 대한 내용인데~

 

저는 주로 옵션을 안 붙이거나 -1을 붙여서 console 창에 안 나오게 하는 편입니다.

 

아래 두 가지 예를 보면 default 옵션에서는 그 내용이 console 에 표시 되지만~ -1 옵션을 붙이면 내용은 표시되지 않는 것을 확인 할 수 있습니다.

 

 

Console 에 결과가 표시 되도록 하기 위해 Ctrl+L 을 눌러서 실행 시켜보면 다음과 같이 정상적으로 실행되는 것을 확인 할 수 있습니다.


아래 주소의 이전 포스팅에서도 소개한바 있지만 SCILAB 은 MATLAB 과 유사한 수치 시뮬레이션 툴입니다.

 

 

2012/08/20 - [유틸] - MATLAB 과 유사한 Open Source 프로그램 FreeMat



2011/03/11 - [MATLAB] - SCILAB



MATLAB 은 상용임에 반해 SCILAB 은 open source 라서 구매 비용이 필요가 없다는 게 굉장한 장점이죠.

 

Scilab 은 MATLAB 과 문법이 유사하긴 하지만 세세한 부분들은 많은 부분들이 다르더군요.

 

오늘은 MATLAB 의 hist() 함수와 유사한 histplot() 함수에 대해 설명 드리려 합니다.

 

MATLAB의 hist() 함수를 사용하면 histogram 을 그릴수도 있고, 출력 변수를 사용하면 그 값들을 변수에 저장 할 수도 있습니다.

 

Scilab 의 histplot() 함수는 출력 변수를 사용할 수는 없고 그냥 histogram 그래프만 그려줍니다.

 

하지만 기본적으로 normalization 적용하기 때문에 PDF(probability density function)을 그릴 때는 더 편리하기도 하더군요. PDF 또는 PMF 를 그리려면 면적이 1이 되도록 정규화를 하는 과정이 들어가야 하는데요~

 

아래 주소에서 MATLAB 을 사용하여 PDF 를 그려본 적이 있는데요~ 정규화 과정을 참조하시길 바랍니다.

 

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


2011/03/26 - [MATLAB] - MATLAB Exponential random variable generation


2011/05/05 - [MATLAB] - MATLAB central limit theorem simulation


2011/03/23 - [MATLAB] - Rayleigh random variable 생성


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


 

Scilab 에서의 histplot () 함수 문법은 다음과 같습니다.

 

histplot(n, data, <opt_args>)

histplot(x, data, <opt_args>)

 

n 은 histogram 의 축의 개수를 설정할 때 사용하고 x 는 축을 벡터로 구분할 때 사용합니다.

 

그리고 opt_args 은 선 색이나 normalization 유무와 같은 옵션을 설정할 때 사용합니다.

 

간단하게 예를 들어보죠~

 

1,2,… 10 의 정수를 10칸에 걸쳐서 histogram 을 그리는 예제 입니다.

 

x=1:10

histplot(10,x)

 

 

그림을 보면 정규화를 했기 때문에 y 축의 최고값이 0.11 정도 된다는 것을 알 수 있습니다. 이는 1~10 을 n+1 개 칸 즉 11개 칸으로 축을 나눈 후 정규화를 해서 축 간 범위는 0.9 씩이 되고 y 축 값은 1/9 = 0.1111 이 되는 것 입니다.

 

다음으로 칸을 0.5:1:10.5 로 줘보죠.

 

figure

histplot(0.5:1:10.5,x)

 

 

간격을 1 씩 줬으므로 정규화 결과 y 축 값이 정확히 0.1이 됨을 확인 할 수 있습니다.

 

마지막으로 MATLAB 의 hist() 함수와 같이 정규화를 하지 않도록 해보죠. 아래 빨간색 친 부분과 같이 normalization 옵션을 %f (False) 로 주면~

 

figure

histplot(0.5:1:10.5,x, normalization=%f)

 

아래 그림처럼 정규화 하지 않은 histogram 이 구해집니다.


 


상용인 MATLAB 을 대체할 만한open source freeware 를 찾던 중 가장 맘에 드는 프로그램이 scilab 이라고 판단된다.

 

scilab 은 MATLAB 과 마찬가지로 매트릭스 연산을 기본으로 하며 문법도 굉장히 유사하다.

 

scilab 의 실행은 두 가지 방법으로 할 수 있다. (윈도우에서 실행 시)

 

  • WScilex.exe 를 통해 실행 할 경우에는 일반적인 graphics, interactive 콘솔이 열리게 된다. (아래 그림 참조)

 

 

  • Scilex.exe 를 통해 실행 시키면 non-graphics 콘솔을 통해 실행하게 되며 윈도우 터미널에서 바로 열리게 된다. (아래 그림 참조)

 

 

MATLAB 과 마찬가지로 배치파일을 통해 스크립트를 실행 할 수도 있으며 –f 옵션을 줘서 다음 그림 예처럼 실행 할 수 있다.

 

 

위 그림에서 실행 시킨 D:\test_file.sce 파일의 내용은 아래와 같이 간단하게 곱하기를 하는 스크립트이다.

 

 

위 스크립트 화면에서 볼 수 있는 바와 같이 파일의 마지막에는 scilab을 종료 할 수 있도록 quit() 명령을 써 주곤 한다.

 

윈도우 cmd 를 통해 실행되게 하기 위해서 Scilex.exe가 들어 있는 폴더를 환경변수의 path 에 추가한 후 이용하는 것이 좋을 것 같다.

 

 

스크립트 파일은 .sce.sci라는 확장자로 저장한다.

 

.sce 에는 실행 가능한 스크립트나 함수 등을 저장하고 함수만 따로 저장하거나 라이브러리를 만들 때는 .sci 로 저장 한다.

 

 

Consol 에서 editor 나 Command history 창 등을 docking 할 때는 editor 등의 파란색 표시 부분을 클릭 후 드래그 하여 SCILAB consol 프로그램 위에 놓으면 된다.

 

 

 

un-dock 을 할 때는 아래 그림의 화살표 친 부분을 클릭하면 된다.

 

 

 

MATLAB 을 사용할 줄 아는 사람이라면 SCILAB 은 금방 사용할 수 있을 것이라고 생각된다.

 

여기서는 MATLAB 과 다른 몇몇 키워드 및 특징에 대해 소개 한다.

 

내용

MATLAB

SCILAB

pi

pi

%pi

복소수i

i

%i

자연수

exp(1)

%e

주석처리

%

// , 여러 줄 주석처리는 /* ~ */

벡터 또는 매트릭스의 마지막 인덱스

end

$

매트릭스 크기 변경 함수

reshape()

resize_matrix()

 

 

향후에 Simulink 와 비슷한 Xcos 에 대해서도 공부해 볼 필요가 있을 것 같다.


  1. 김진우 2012.04.27 17:09

    안녕하세요. Scilab에 많은 관심을 가지고 계셔서 반갑습니다. 혹 scilab에 관한 교육 및 보급확산에 관심 있으시면www.equalis.com을 방문하시어 scilab의 professional 한 제품 체험을 권합니다. 방문 후 관심을 저와 나누어 주시면 더욱 고맙겠습니다. 제 연락처는 jwkim302@gmail.com, 김진우(010-5125-3614) 이며, Equalis 한국 총판을 하고 있는 데 님 같은 고수분들 모시고 얘기듣고 싶습니다. 감사합니다.

오늘은 괜찮은 공학용 프로그램 하나 소개해 드리겠습니다.

 

바로 제목에 있는 SCILAB 이라는 프로그램인데요……


이 프로그램이 뭐냐 하면 MATLAB 하고 굉장히 유사한 공학용 프로그램 입니다.

 

MATLAB 은 뭐 툴 박스 하나만 해도 몇 백만원씩 하는 고가의 프로그램이라 학교나 회사 등에서 사주지 않는 이상은 개인들이 사기에는 부담스러운 프로그램입니다.

 

반면에 SCILAB은 완전 공짜의 프로그램 입니다. 공짜라고 해서 허접하거나 하지도 않군요.

 

익숙해 지기만 하면 MATLAB 대용으로도 써도 괜찮겠다는 생각이 듭니다.


프로그램은 http://www.scilab.org/ 에서 다운 받을 수 있습니다. 현재 5.3.1 버전까지 나와 있군요.

 

운영 체제는 Linux, Windows, MAC os X 지원하구. MATLAB 으로 작성된 M 파일을 SCILAB문법으로 변환해 주기도 합니다.

 

문법은 약간 써 본 결과 MATLAB 이랑 매우 흡사하다는 생각이 들었습니다. MATLAB 에 익숙한 사람들은 금방 익힐 수 있을 것 같네요.

 

우리나라에 그리 많은 사용자가 없어서 한글 책 등이 거의 없다는 게 약간 아쉽군요.

 

책을 찾아보니 Scilab 으로 하는


과학기술컴퓨팅 상세보기


이란 책이 한 권 나오네요.

 


목차를 보니 SCILAB 의 사용법에 대해 정리된 책 같네요. 나중에 서점에 들러서 한번 보고 살지 말지 결정 해야겠네요.

 

영어도 괜찮다면 SCILAB 홈페이지에 http://www.scilab.org/support/documentation/tutorials 튜토리얼도 있고,

 

http://www.scilab.org/support/documentation/manuals 에 매뉴얼도 있습니다.

 

필요하신 분들은 적극적으로 이용하는 것도 좋을 것 같습니다.

 

SCILAB 을 이용해서 간단하게 FFT 를 해 보면 ~

 

 

 

아!! 복소수를 나타내는 I 또는 j 는 MATLAB 과는 다르게 %i 로 표현 합니다.

 


  1. 은토 2012.04.21 17:29

    죄소합니다 한 가지 여쭈어 볼 게 있는데요 scilab에서 txt파일을 여는 게 가능한가요?
    혹시 함수는 어떻게 되는지.....찾아봐도 안나오네요ㅠㅠ 인턴십할때 MATLAB 쓰다가 끝나고 집에서 혼자 할려니까 scilab 추천받아서 다운받았는데.....

    • 남성 2012.04.21 18:13 신고

      SCILAB help 를 찾아보니깐 mgetstr() 이나 read() 같은 함수를 사용하시면 될것 같네요. 위 함수의 사용법에 대해서는 help 문을 참조 하시면 될 것 같습니다.

      그냥 숫자 형태의 매트릭스가 저장되어 있는 상태에서 읽어들일 거면 read() 함수를 사용하시는게 좋을것 같구요. 그냥 일반적인 텍스트를 읽어들이는거면 mgetstr() 를 쓰는게 좋을것 같네요.

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

+ Recent posts