실수형 데이터

기본적으로 Scilab에서 숫자는 배정도 (C 언어의 double형, 8바이트) 실수형이며 단정도 (C 언어의 float형) 실수는 사용되지 않는다. Scilab뿐만 아니라 다른 수치해석 프로그램에서도 계산 결과의 정밀도가 중요하기 때문에 보통 실수는 정확도가 가장 높은  배정도 실수형으로 다룬다. 따라서 다음과 같이 입력하면 변수 x에 저장되는 수는 보기에는 정수이지만 내부적으로는 double형 실수이며 8바이트가 할당된다.

>> x = 1

이러한 배정도 실수형의 유효 자리는 보통 16자리인데 실용적인 공학 문제를 다룰 때는 대부분의 경우 크게 문제가 되지 않는다. 또한 배정도 실수형으로 다룰 수 있는 정수의 범위는 ~ 이며 이 범위 안에서의 정수 연산은 항상 정확한 값을 가진다. 그러나 이 범위 밖의 정수 연산은 오차가 발생하게 된다.

 보통은 Scilab을 작성할 때는 주로 실수형 데이터를 사용하고 정수형은 사용 빈도가 실수형에 비해서 낮지만 정수형 데이터에 대해서도 설명하도록 하겠다.

정수형 데이터

 배정도 실수 외에 정수형으로 데이터를 변환할 수 있으며 정수형을 다시 double형으로 바꿀 수도 있는데 관련된 함수는 다음과 같다.


[표 1]  숫자형의 변환에 관련된 함수들

함수

기능

double(M)

정수형 행렬 M을 배정도 실수형으로 변환

int8(A)

행렬 A를 8비트 부호 있는 정수형으로 변환

int16(A)

행렬 A를 16비트 부호 있는 정수형으로 변환

int32(A)

행렬 A를 32비트 부호 있는 정수형으로 변환

uint8(A)

행렬 A를 8비트 부호 없는 정수형으로 변환

uint16(A)

행렬 A를 16비트 부호 없는 정수형으로 변환

uint32(A)

행렬 A를 32비트 부호 없는 정수형으로 변환

iconvert(M, itype)

행렬 M을 특정한 형식으로 변환한다.

itype = 0 : 배정도 실수형

itype = 1 : int8 형, itype = 11 : uint8 형

itype = 2 : int16 형, itype = 12 : uint16 형

itype = 4 : int32 형, itype = 14 : uint32 형

inttype(M)

행렬 M의 데이터형을 반환한다. 반환값은 다음과 같다.

0 : 배정도 실수형, 1 : int8 형, 11 : uint8 형, 2: int16 형, 12 : uint16 형, 4 : int32 형, 14 : uint32 형


각 정수형의 숫자 범위는 다음과 같다.

  • 부호가 있는 n비트 정수의 범위: ~

  • 부호가 없는 n비트 정수의 범위: 0 ~


따라서 만약 정수형을 사용한다면 이 범위를 고려해서 프로그래밍을 해야 한다. 연산 결과가 이 범위를 넘어갈 경우 의도하지 않은 결과가 발생함을 다음 예에서 보이고 있다.



 만약 두 정수를 더하는데 서로 자료형이 다르다면 그 결과값은 큰 쪽의 데이터형으로 맞춰진다. 즉, 8비트 정수형과 16비트 정수형을 더하면 그 결과는 16비트 정수형이 된다. 다음 예는 그 사실을 보여주고 있다. 하지만 정수형과 실수형을 연산하면 그 결과는 정수형이 되는 것에도 유의해야 한다.


 Scilab의 정수형은 순환값을 가진다.(circular integers) 이것은 정수가 상한을 넘게되면 하한값을 가지게 되고 반대로 하한값보다 더 작아지면 상한값을 가지게 된다는 의미이다. 예를 들어 int8 형의 상한값은 127이며 여기에 1을 더하면 128이 되지 못하고 하한인 -128값을 가지게 된다. 다른 예로 uint16 의 하한 값은 부호 없는 정수이므로 0인데 여기서 1을 빼게 되면 상한인 65535 가 된다는 것이다.



이에 반해서 Matlab이나 Octave에서의 정수형은 허용범위를 넘어서면 순환하는 것이 아니라 거기에서 멈춘 값을 가진다. 즉 int8(127)+1 은 상한인 127이 되며 uint16(0)-1은 0이 된다. 만약 Scilab 코드를 Matlab이나 Octave로 이식하는 경우 혹은 그 반대의 경우 유의해야 한다.



Posted by 살레시오
,

기본 작업공간 (base workspace)

 먼저 workspace 의 개념부터 설명할 필요가 있다. Scilab을 사용하다보면 여러 객체(행렬, 문자열, 구조체, 함수, 등등)를 변수에 담아서 사용하게 되며 한 번 생성된 변수는 일부러 삭제하지 않는 한 언제든지 접근하여 값을 읽거나 변경할 수 있다. 이렇게 객체가 저장되는 메모리 공간을 작업공간(workspace)라고 칭하며 현재 작업공간 내의 변수들은 Variable brower 창에서 항상 확인할 수 있다.

[그림 1] variable browser 에 방금 생성한 변수 a와 B가 표시되어 있다.

특별히 Scilab을 처음 실행시킬 때 사용되는 작업 공간을 기본 작업 공간(base workspace)라고 칭하도록 하겠다.

 작업 공간과 관련된 명령어들을 다음 표에 정리하였다.

[표 1] workspace 와 관련된 명령어들

명령어

기능

who

모든 변수들의 리스트 출력

who_user

모든 사용자 변수들의 리스트 출력

whos

모든 변수들의 리스트와 특성(type, size) 출력

whereis(‘function_name’)

함수가 포함된 라이브러리명 출력

global a,b,c…

global(‘a’,’b’,’c’,...)

전역공간에 변수 a,b,c를 생성

(위와 상동)

isglobal(var)

변수 var 가 전역변수이면 %T 반환

clear

clear a, b, fA, fB, … 또는

clear(‘a’, ‘b’, ‘fA’, ‘fB’, …)

비보호된 모든 변수와 함수를 workspace에서 제거

지정된 (비보호된) 변수와 함수를 제거

(위와 상동)

clearglobal

clearglobal a,b,c…

clearglobal(‘a’, ‘b’, ‘c’, …)

전역공간의 모든 변수 삭제

전역공간의 변수 a,b,c,... 삭제

(위와 상동)

type(a)


typeof(a)


isdef(var, [, strLoc])


exists(str [, strLoc]))


기본 작업영역의 모든 변수/함수를 제거하려면 clear 명령을 내리면 되고 특정한 변수/함수만을 제거하려면 clear 뒤에 그 변수의 이름을 써 주면 된다.

전역 작업 공간 (global workspace)

 전 절의 명령어 표에 보면 global 이라는 명령어가 있는데 이것은 기본 작업 공간과는 별개의 전역 공간 (global workspace)에 변수를 생성하는 명령이다. 예를 들어서 다음과 같이 명령을 내리면

>> global ga ⏎

전역공간에 변수 ga가 생성되며 동시에 기본 작업공간에 이 전역 변수를 참조할 수 있는 참조가 생기게 된다. 기본 작업 공간에 생기는 변수 ga는 지역 변수가 아니라 전역 변수로의 참조라는 것을 이해하여야 한다.

[그림 2] 글로벌 변수 ga의 생성


따라서 다음과 같은 명령을 내리면


>> ga=%pi ⏎

기본 작업 공간의 참조 변수 ga를 통해서 전역 변수 ga를 %pi 로 초기화 시킬 수 있다.


 순서를 바꿔서 만약 이미 있는 지역 변수를 나중에 전역 변수로 선언해도 비슷한 일이 일어난다. 변수 값이 전역 작업공간으로 옮겨지며 기존의 지역 변수는 전역 변수로의 참조로 변환된다. 이 점을 이해하여야 한다.

[그림 3] 전역 변수로의 전환


전역 공간의 모든 변수/함수를 제거하려면 clearglobal 명령을 내리면 되고 특정한 변수/함수만을 제거하려면 clearglobal 뒤에 그 변수의 이름을 써 주면 된다.


 전역 공간은 기본 작업 공간과 함수 간 혹은 함수들 사이에 공통으로 사용되는 변수를 관리하는데 이용된다. 이것에 대해서는 함수를 설명하는 부분에서 더 자세히 언급하겠다.




Posted by 살레시오
,

 Scilab에서 작업 폴더와 관련된 기본적인 명령어들은 다음과 같다. (리눅스 쉘 명령어들과 유사하다.)

[표 1] 폴더와 관련되 Scilab 명령들

명령어

기능

ls (혹은 dir)

현재 폴더의 내용물을 표시

pwd

현재 폴더(경로)를 표시

chdir full_path

chd  ‘full_path’

작업 폴더를 full_path 로 변경

(위와 상동)

mkdir

폴더를 생성

폴더와 관련된 변수들은 다음 표에 정리하였다.

[표 2] 폴더와 관련된 변수들

변수명

내용

HOME

사용자 홈 디렉토리(환경변수)

home

사용자 홈 디렉토리(전역변수)

OS

운영체제(환경변수)

PWD

작업 디렉토리(전역변수)

SCI

Scilab이 설치된  디렉토리(환경/전역변수)

SCIHOME

환경설정을 담은 디렉토리(환경/전역변수)

TMPDIR

임시 디렉토리 (전역변수)

 

여기서 전역변수는 일반적인 변수처럼 접근할 수 있으나 환경변수는 getenv() 와 setenv()함수를 이용해서 접근한다. 예를 들어서

>> getenv(‘HOME’)
ans =
       C:\Users\jhp

이 함수의 입력 인수는 문자열이며 Scilab에서는 폴더를 구별할 때 역슬래시(\)가 아니라 리눅스에서처럼 그냥 슬래시’/’ 문자를 사용한다는 것에 유의해야 한다.

 SCIHOME 환경 변수에는 과거 명령어들(history)등을 저장하는 파일들이 있는 폴더명을 나타낸다. 이 폴더에 scilab.ini 라는 스크립트 화일을 만들면 Scilab이 실행될 때마다 자동으로 읽어 들이는 시작 파일이 된다. 따라서 이 파일에 사용자가 자신만의 전역변수라든지 작업폴더 혹은 커스텀 라이브러리를 읽어들이는 명령어들을 기록해 두면 편리하게 사용할 수 있다. 예를 들어 작업 폴더를 Scilab이 시작할 때 자동으로 d:/scilab_files 라는 폴더로 변경하고 싶을 때는 scilab.ini 파일을 SCIHOME 폴더에 생성한 후 다음과 같이 작성하면 된다.

chd d:/scilab_files

그러면 다음에 Scilab을 시작할 때는 자동으로 이 명령이 실행되어 작업 폴더가 변경된다.



Posted by 살레시오
,

기본적인 연산자

 다음 표에 기본적인 Scilab연산자를 정리하였다. Scilab의 기본 객체는 ‘행렬’이므로 피연산자도 일반적으로 ‘행렬’이다.


[표 1] 기본 연산자

연산자

기능

+

덧셈(이항연산자), +부호(단항연산자)

-

뺄셈(이항연산자), -부호(단항연산자)

*

곱셈

.*

요소간 곱셈

.*.

Kronercker 곱셈. kron(A,B)와 동일

/

나눗셈

\

역나눗셈 (즉 a\b 는 b를 a로 나눈다)

./

요소간 나눗셈

.\

요소간 역나눗셈

./.

Kronecker 나눗셈

.\.

Kronecker 역나눗셈

^ 또는 **

거듭 제곱

.^

요소간 거듭 제곱

‘(작은따옴표)

복소 전치 행렬

.’(점작은따옴표)

단순 전치 행렬


이 표에서 보면 요소간 연산자가 있는데 이것은 행렬 간 연산에서 같은 요소끼리의 연산을 수행한다. 예를 들어서 두 행렬 A, B에 대해서 A*B는 보통의 행렬곱으로 A의 열수와 B의 행수가 같아야 성랍하지만 A.*B 는 같은 위치의 요소끼리 곱셈을 수행하므로 A와 B의 크기가 같아서 수행된다. 예제는 행렬에 대해서 알아볼 때 들겠다.


 대입문을 작성할 때 tuple을 사용하여 한 번에 여러 변수를 지정하는 것이 가능하다. tuple 은 괄호 ( ) 를 사용하는데 각각의 요소는 반드시 comma (,)로 구분해야 한다. 이 기능을 사용하면 변수들을 서로 swap하는 데도 간결하게 사용할 수 있다.(이 기능은 python과 흡사하다.)


 아래에서 첫 번째 예가 변수 u, v 그리고 w 를 동시에 생성하는 것이다. 좌변에는 [ ... ] 를 우변에서 tuple을 지정할 때는 ( ... ) 를 사용했음에 유의해야 한다, 두 번째 예는 u와 v의 값을 서로 맞바꾸는 것이다.

내부 상수들

 다음 표에 미리 정의되어 사용되는 내부 상수들을 정리하였다. 이 변수들은 모두 %로 시작하며 사용자가 덮어 쓸 수 없다.(즉, 재정의될 수 없다.)


[표 2] Scilab의 기정의된 내부 상수들

변수명

의미

%i

허수 ()

%e

자연상수 (2.718281…)

%pi

원주율 (3.142592…)

%eps

표현가능한 가장 작은 수(약 2.2e-16)

%inf

무한대

%nan

not a number

%t or %T

(논리적) 참

%f or %F

(논리적) 거짓

%s

다항식 s=poly(0,’s’)

%z

다항식 s=poly(0,’z’)

%io

표준 I/O

Scilab의 식별자에서 ‘%’를 사용할 수 있는데 맨 첫자로만 사용가능하다. 따라서 위의 상수들은 모두 특정 값이 저장되어 있고 변경할 수 없는 변수와 같이 취급된다.



Posted by 살레시오
,

대입문

 Scilab의 문법은 Matlab과 많이 유사하므로 MATLAB에 익숙하다면 기본적인 문법을 그대로 사용할 수 있다. 대입문은 = 연산자를 사용한다.


>> var_name = statement

 

좌변이 변수명이고 우변은 변수에 저장할 값이다. 한 줄에 여러 대입문을 사용할 경우에는  각각의 명령문을 콤마(,)나 세미콜론(;)으로 구분할 수 있다. 명령문 뒤에 세미콜론(;)을 붙이면 명령 수행 결과가 표시되지 않고 세미콜론이 없다면 결과가 화면에 표시된다. (matlab과 동일함)

위 그림에서 두 번째 명령은 세미콜론(;) 으로 끝났으므로 콘솔창에 결과가 표시되지 않으며 세 번째 명령줄의 d=4; 도 마찬가지로 표시되지 않는다.

 Scilab에서 한 줄 주석은 C언어와 마찬가지로 // 을 사용하며  // 뒤에 오는 것들은 모두 무시된다. 여러 줄 주석을 처리하는 기호는 없다. 단 Scinote의 Format > Comment selection 메뉴(단축키는 ctrl-D)를 이용하면 여러 줄 주석 처리를 편하게 할 수 있다.

 여러 줄에 걸쳐서 연속적인 명령을 입력하고 싶다면 줄 끝에 점을 두 개 (..) 이상 입력하고 엔터키를 입력하면 다음 줄에 계속 명령을 입력할 수 있다. 이 경우 다음 명령을 위한 프롬프트가 바로 다음 줄에 표시된다. 이와 대조적으로 실행이 필요한 완전한 문장(statement)이 입력되었다면 실행 후 한 줄 건너 뛰고 프롬프트가 나타나게 된다는 것을 눈으로 확인할 수 있다.


위에서 a=10; 이라는 명령은 실행이 필요한 완전한 문장이므로 실행 후 (*)와 같이 한 줄의 공백이 출력된다. 그러나 b=20, c=30, .. 은 연속된 명령이므로 줄 사이에 공백이 없다.

식별자

  식별자(identifier)는 변수명이나 함수명으로 사용되는 이름이다. 다른 프로그래밍 언어와 마찬가지로 숫자, 알파벳 대소문자와 밑줄 (_)을 조합해서 만들되 숫자로 시작하면 안된다는 것은 동일하다. 그런데 특이하게 Scilab에서는 식별자에 특수기호 %, #, !, $, ? 를 추가로 사용할 수 있으며 %는 사용될 경우 반드시 변수의 첫 문자여야만 된다. 보통 %로 시작하는 변수/함수는 내부적으로 기정의된 특수 상수/함수인 경우가 많다. 식별자는 24자까지만 사용된다. 아래 그림에서와 같이 식별자가 24자가 넘으면 경고가 발생되고 24자까지로 잘려진다. (아래에서 변수의 첫 글자는 숫자 1이 아니라 소문자 L 이다.)

식별자를 요약하면 다음과 같다.

❶ 숫자(0, 1, … 9), 알파벳 대소문자(a...z A...Z), 특수문자(_, %, #,$,!,?)를 조합한다.

❷ 숫자로 시작하면 안된다.

❸ %는 첫 문자로만 사용될 수 있으며 주로 내부 변수/함수명에 사용된다.

❹ 첫 24자까지만 사용된다.

❺ 대소문자를 구별한다.


객체의 이름을 지을 때 이러한 사항들을 고려해야 한다.



Posted by 살레시오
,