구조체는 개별적인 데이터를 하나로 묶는 자료형이며 Scilab에서도 이것을 지원한다. 예를 들어서 어떤 사람의 이름, 나이, 시력을 각각 name, age, sight 라는 이름으로 저장하고 싶다면 다음과 같이 struct()함수를 사용한다.


[그림 1] 구조체의 생성


구조체의 각각의 데이터를 필드(field)라고 칭한다. 이 예에서 person1 구조체의 필드는 name, age, sight 이다. 함수 struct() 은 반드시 짝수 개(0도 가능함)의 입력 인수를 가져야 하고 홀수 번째의 인수는 구조체의 필드 이름으로서 반드시 문자열이어야 한다. 짝수 번째 입력 인수는 진전에 입력된 필드명을 가지는 값으로서 Scilab 객체(행렬, 문자열, 등등)가 온다.


 위와 같은 구조체를 정의하는데 있어서 또 다른 방법은 개별적인 요소를 하나하나 직접 생성/입력하는 방법이 있다. 두 가지 문법이 있는데 다음과 같다.


structName(‘fieldName’)
structName.fieldName

    

두 가지 방법에는 큰 차이점이 있다. 전자의 경우는 필드명에 임의의 문자열을 사용할 수 있으나 후자의 경우는 일반적인 식별자 규칙을 따라야 한다는 것이다.


[그림 2] 구조체의 생성 (다른 방법)


구조체의 필드를 접근한다던가 아니면 추가하는데 있어서도 위에서 설명한 바와 같이 두 가지 방법이 있다. 예를 들어서 age필드를 접근하려면


a = person1.age // 읽기
person1.age = 43 // 변경
a = person1(‘age’) // 읽기
person1(‘age’) = 43 // 변경


새로운 필드도 자유롭게 추가할 수 있다.


person1.height = 170  // height라는 새로운 필드 추가
person1(‘height’)=170 //위와 동일함


 만약 두 개 이상의 구조체가 서로 같은 필드 이름들을 가지고 있다면 이것들을 하나의 행렬로 묶을 수 도 있다.


[그림 3] 구조체를 요소로 가지는 행렬


이 예제에서 구조체 sA와 sB는 똑같은 필드명을 가지고 있으므로 하나의 행렬로 묶을 수 있다. 필드의 값은 데이터형이 서로 달라도 상관없으며 중요한 것은 필드명이다. 필드명이 다른 두 구조체를 하나의 행렬로 묶으려고 한다면 에러를 발생한다.


 한 가지 알아야 할 것은 한 구조체에서 다른 구조체로 대입을 할 때 Scilab에서는 구조체의 내용물이 복사되는 것이지 참조가 되는 것은 아니라는 것이다. 위의 예에서


sC = sA


라고 하면 sC 변수에는 sA의 모든 구조체 필드들이 “복사된” 새로운 구조체가 생성되는 것이다. 따라서 이후에


sA.c = [1 0]


이라고 sA에 새로운 필드를 추가한다고 해서 sC에 영향을 미치지는 않는다. 이것은 구조체를 함수에 넘길 때도 마찬가지로 적용되는데 함수 내부에서 넘겨받은 구조체를 변형시킨다고 해도 원래의 구조체와는 아무런 상관이 없다는 것을 알아두어야 한다.


 구조체와 관련된 함수들은 다음과 같다.


[표 1] 구조체와 관련된 함수들

함수명

기능

struct(...)

구조체 생성

isstruct(s)

s가 구조체인지 테스트

isfield(s,f)

f가 s의 필드인지 테스트

length(s)

사용자 필드 수 + 2

fieldnames(s)

getfield(n, s)

구조체 s의 필드명을 문자열 행렬로 반환

구조체 s의 n번째 필드값을 반환

setfield

(사용 빈도가 매우 낮을 것 같음)

s = null()

구조체 s 삭제


여기서 getfiled() 함수는 구조체의 필드명을 문자열벡터로 반환하는데 3번째 요소부터 사용자 필드라는 것에 유의해야 한다. 아래 예를 보자.


[그림 4] getfiled()함수의 반환 객체


이 예에서 getfield()함수의 첫 번째 인자는 s1의 자료형이 구조체임을  나타내는 문자열이고 (내부적으로 구조체는 mlist 임.) 두 번째 인자인 dim은 Scilab에서 자동으로 생성하는 필드이다. 따라서 사용자 필드는 세 번째부터 마지막까지이다. 사용자 필드명만 뽑아내려면 다음과 같이 하면 될 것이다.


>> fields = getfield(1, s1)
>> fields = fields(3:$)


또는 간단하게 fieldnames()함수를 사용하면 된다.


>> fields = fieldnames(s1)


만약 사용자의 첫 번째 필드인 s1.A 의 값을 읽어내려면 다음과 같이 하면된다.

    

[그림 5] getfield()함수


이 내용은 혼동하기 쉬운데 이렇게 이해하면 될 것 같다. getfield(n, s) 함수는 구조체 s의 내부적인 필드”값”를 반환하는데 내부적으로 s구조체의 첫 번째 필드는 모든 필드명의 문자열벡터, 두 번째 필드는 dims, 세 번째 필드부터가 사용자 필드이다. 따라서 해당되는 것을 반환하는 것이다. 만약 위에서 예를 든 s1의 경우에는 다음 표와 같이 내부적인 데이터를 가진다.


[표 2] getfiled() 함수 반환 객체의 내부 인덱스

내부 인덱스

필드명

필드값

(getfield 함수의 반환값)

1


[ ‘st’ , ‘dims’, ‘A’, ‘b’ ]

2

‘dims’

[1 1]

3

‘A’

[1 2; 3 4]

4

‘b’

[0 1]


따라서 getfield(3, s1) 이라고 하면 s1구조체의 3번째 필드의 필드값이 반환된다고 이해하면 된다.


 하지만 구조체의 필드를 접근하는 데에는 getfield()함수나 setfield()함수를 이용하는 것 보다는 dot(.) 연산자나 문자열키로 읽거나 쓰는 방식이 더 일반적이다.


Posted by 살레시오
,

  라즈베리파이(RPi)에서 수치 해석툴을 적용하려고 scilab 과 octave의 장점을 검색해 보았더니 둘 다 장점이 비슷한 것 같다. 어떤 논문에서는 octave를 최고로 언급하기도 한다.


"요약하면, Octave가 가장 지속 가능한 Matlab의 대안이라고 결론을 내렸다. 그 이유는 테스트 결과 (문법적인 측면에서) Matlab과 완전히 호환되며 성능 또한 상당히 좋기 때문이다"


"In summary, we conclude that Octave is the best viable alternative to Matlab because it was not only fully compatible (in terms of syntax) with Matlab in our tests, but it also performed very well."



 그런데 수치해석 툭들을 검색 하는 중에 의외의 대안이 눈에 띄었다. 바로


  • python + numpi / scipy + matplotlib


이다. 어떤 교수가 이렇게 언급해 놓았다.


Francesca Mazzia · Università degli Studi di Bari Aldo Moro


"내 수업(이탈리아 Bari 대학교)에서  Octave, Scilab, R 을 모두 사용해 보았다지만 지금은 파이썬의 넘파이(numpy)와 사이파이(scipy)를 사용한다. 과학 계산에서 pythonxy(윈도우)와 spyder(리눅스)는 훌륭한 통합개발환경이다. 나는 내 포트란 90 코드와의 인터페이스를 개바랬는데 Matlab보다 훨씬 더 쉬었다. 아직도 연구를 위해서 Matlab을 사용하기는 하지만 파이썬은 훌륭한 대안이다. 내 학생들도 좋아한다..." 2013년 1월 31일


"I used in my courses (University of Bari, Italy), Octave, Scilab and R, but now I'm using Python, with numpy and scipy. Pythonxy in Windows and spyder for Linux are good ide for scientific computing. I developed some Python interface for my FORTRAN 90 codes and was easier than in matlab. I still use Matlab for research, but I think Python is a good alternative, my students like it ...." Jan 31, 2013


  이후에 관심이 생겨서 더 조사해 보았는데 python이 과학계산 분야에서 의외로 광범위하게 사용되고 있음을 알게 되었다. Matlab은 앞으로는 어떻게 될 지 모르겠지만(뭐 윈도우도 무료가 되느니 마느니 하는 시대인데) 아직은 고가라 학부 수업에서 사용하기에는 부적합하다.


 개인적으로 scilab은 익히는데 상당히 시간이 많이 걸렸다. (한마디로 제대로 사용하려면 어렵다.) 하지만 python은 그 특유의 쉽고 간결한 문법과 많은 리소스들, 다양한 모듈들로 인해서 훨씬 익히기가 용이했다.


  단적인 예를 들어서 아두이노로 시리얼 통신을 하는 프로그램(모터의 지령지를 준다든가 센서값을 읽어들인다든가 하는 일들을 하기 위해서)을 작성하기 위해서는 시리얼통신을 수행하는 모듈이 있어야되는데 scilab은 마땅한게 없다. (matlab도 어렵기는 마찬가지임.) 하지만 파이썬은 잘 동작하는 모듈이 있어서 바로 사용하는데 아무런 문제가 없었다. 이 정도로 막강하다. 더군다나 numpy같은 수치해석 모듈과 scipy 같은 과학계산 모듈을 모두 무료로 아무 제한 없이 사용할 수 있으니 더 이상 큰 장점이 없다.


  만약 수치해석 툴이 필요하다면 파이썬을 공부해 볼 것을 강력히 추천한다.

[#00089]


Posted by 살레시오
,