KiCad를 맨 처음 실행시켜서 schematic을 열고 부품을 선택하려고 ([A]키를 눌러) 부품창을 열면 power 밖에 없어서 당황할 수 있다. 참고로 KiCad는 일반 부품과 전원 요소를 선택하는 창이 따로 분리되어 있다.


  • [A]키 : 일반 부품창 (전원 요소 포함)

  • [P]키 : 전원 요소 선택창


만약 부품창에 라이브러리가 텅 비어 있다면 그렇다면 부품 라이브러리를 추가해야 된다. 다음 그림과 같이 Preference>Component Libraries 를 선택한다.



여기서 [추가] 버튼을 누른다.



그러면 c:\Program Files\KiCad\share\kicad\library 폴더가 열리고 그 안의 .lib 파일들이 보이는데 이것을 모두 선택한 후 [열기] 버튼을 누른다.


그러면 위와 같이 부품 라이브러리들이 추가된다. 이제 [확인]버튼을 누르고 나간 다음 편집모든에서 [A]키를 눌러 부품창을 띄워보면 라이브러리들이 들어온 것을 확인할 수 있다.



'PCB설계' 카테고리의 다른 글

barebone arduino 예제  (0) 2018.04.10
layout 예제 01  (0) 2018.04.03
DipTrace Schematic 동영상 강의 1  (0) 2018.03.29
예제 #8, #9, #10  (0) 2018.03.20
무료 오픈소스 PCB 설계 프로그램의 종류  (1) 2015.06.19
Posted by 살레시오
,

 인벤터로 블럭을 다시 설계하였다. 이번에 홀을 모두 육각 모양으로 바꾸었다. (나머지는 동일함) 홀의 중심은 모두 10mm간격이고 너트의 변과 변의 폭은 6mm, 볼트홀은 3.5mm이다. 전체 사이즈는 60x100x4mm 이다.



다음 그림은 이것을 세 장 출력하여 볼트-너트롤 체결한 것이다.



이렇게 세 장을 붙여서 단위 블럭을 만든 다음 이것을 다시 여러 개 연결해 붙여서 기타 몸체를 구성할 계획이다. 여기에 부착되는 PCB나 장식 부품도 이 치수를 가지는 홀들을 내어서 체결하기 쉽게 만들면 될 것 같다. 일단 코드를 조합하는 터치 패드 부분부터 만들어야 한다.



Posted by 살레시오
,

 Scilab에서도 tuple을 사용하여 한 번에 여러 변수를 묶는 것이 가능하다. tuple 은 괄호 (...) 를 사용하는데 각각의 요소는 반드시 comma (,)로 구분해야 한다. 이 기능을 사용하면 변수들을 서로 swap하는 데도 간결하게 사용할 수 있다.


 아래에서 첫 번째 예가 변수 a와 b 를 동시에 생성하는 것이다. 좌변에는 행렬을 생성할 때 사용하는 대괄호 [ ... ] 를, 우변에서 tuple을 지정할 때는 ( ... ) 를 사용했음에 유의해야 한다, 두 번째 예는 이 두 변수의 값을 서로 맞바꾸는 것이다.


[그림 1] Scilab에서 tuple의 사용 예


 이 tuple 은 독립적인 자료구조가 아니므로 이것 자체를 변수에 저장한다든가 하는 것은 불가능하며 변수를 지정할 때에만 사용된다. 또한 tuple안의 요소 개수와 좌변의 [...] 안에 있는 변수의 개수는 반드시 같아야 한다.





Posted by 살레시오
,

구조체는 개별적인 데이터를 하나로 묶는 자료형이며 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 살레시오
,

 지금까지는 명령창에 명령어들을 직접 한두 개씩 입력해서 결과를 확인하는 식으로 사용하였는데 많은 경우에 명령어들을 묶어서 파일로 저장하여 한꺼번에 실행시키는 방법을 사용한다. 명령창에 명령을 직접 입력하면 Scilab 종료시 그것들이 사라지지만 파일에 저장하여 놓으면 이후에 언제라도 불러서 사용할 수 있다.

 이러한 명령어들의 집합(프로그램)을 편집하고 저장하는데 사용하는 도구가 SciNote 이다. 메뉴에서 Applications > SciNotes 항목을 실행시키면 SciNote가 실행된다. 이제 다음과 같이 간단한 프로그램을 작성한 후 적당한 폴더에 저장시키자. 필자는 test02.sce 라는 화일명으로 저장시켰다.(캡션바에 전체 경로가 표시된다.)

[그림 1] SciNote


프로그램은 3x3 난수 행렬 두 개를 생성시킨 후 그 결과를 disp()함수로 화면에 표시하도록 하는 간단한 것이다. 첫 두 줄의 끝은 세미콜론(;)을 넣어놓았다.


 이제 이것을 실행시키기 위해서 Execute 메뉴를 보면 다음 그림과 같이 여러가지 옵션이 있다.


[그림 2] sce파일 실행 옵션

그 중  ..file with echo (ctrl-L) 을 선택하거나 단축키를 누르면 다음과 같이 명령창에 표시된다. 이것은 명령창에 한 줄씩 수동으로 입력하는 것과 완전히 동일하게 작동하며 각 프로그램의 줄이 화면에 표시된다. 또한 세미콜론(;)으로 끝나면 그 결과를 표시하지 않고 그렇지 않으면 표시한다.

[그림 3] [ctrl]+[L] 단축키로 스크립트 파일을 실행한 결과

이에 반해서 Save and execute (단축키 F5) 를 실행하면 먼저 저장하고 실행한다. 이것은 명령이 화면에 표시되지도 않으며 세미콜론(;)의 유무와 상관없이 그 결과도 화면에 표시되지 않는다. 다만 이 예제의 경우 disp()함수가 사용되었으므로 이 함수의 실행결과만이 화면에 표시된다.

[그림 4] [F5] 단축키로 실행한 결과


이때 사용되는 명령어가 exec()함수이다. 이 함수는 sce파일(그리고 나중에 나올 sci파일)을 실행시키는 기능을 수행하며 다양한 실행 옵션을 줄 수 있다. SciNote에서는 -1옵션이 지정되었음을 알 수 있다. 이것에 대해서는 다른 포스트에서 더 자세히 설명하도록하고 일단 여기에서는 SciNote에서 실행시키는데 [Ctrl]+[L] 단축키나 [F5] 단축키가 사용된다는 것을 알아두도록 하자.

특수한 기능들

 명령창과 SciNote가 분리되어 있다면 프로그램 작업 시에 몇 가지 번거로운 점들이 있다. 매번 창들 사이를 클릭해서 왔다 갔다 해야된다던가, 아니면 실행 결과나 프로그램이 다른 창에 가려서 보이지 않는다던가 하는 점들이다. 이러한 불편함을 해소하기 위해서 SciNote와 콘솔창을 하나로 결합할 수 있는 기능이 있다.

[그림 5] SciNote의 위치 조절

위 그림에 표시된 막대 부분을 마우스로 드래그 하여 콘솔창에 놓으면 해당 위치에 결합이 된다. 그래프 창도 마찬가지로 도킹시킬 수 있으며 반대로 SciNote 창에 콘솔창을 도킹시킬 수도 있으므로 자유롭게 작업 환경을 설정할 수 있다.



Posted by 살레시오
,

 전기/전자 계열의 공대생들(혹은 관련 전공의 공고생들)은 전자 회로를 설계한 후에 이것을 직접 기판으로 제작하여 납땜하고 그 동작을 실험해 보는 교육 과정이 있다. 모든 전자 제품 안에 들어가 있는 인쇄 회로 기판(printed circuit board,  줄여서 PCB) 은 그 위에 각종 전기·전자·반도체 소자나 IC를 납땜하여 원하는 동작을 수행하도록 한다.

[그림 1] PCB의 예

 이 PCB를 설계하는데에도 CAD프로그램이 사용되며 널리 사용되는 대표적인 상용 프로그램은 다음의 두 가지 정도이다.

  • OrCAD

  • PADs


그런데 이들 프로그램의 문제는 역시 수백 만원 이상의 고가의 제품이라는 것이다. 이건 웬만한 대학교에서도 학과 단위로는 선뜻 구입하기가 어려운 가격대이다.


 이들 제품만한 성능을 갖추지는 않았지만 회로도를 작성하고 그것를 기반으로 PCB를 설계할 수 있는 프리웨어들이 몇가지 있기는 하다. 이들 중 잘 알려져 있는 것들을 나열하면 다음과 같다.


  • Eagle ( 상용이며 무료 버젼은 기능 제한이 있음 )

  • DipTrace ( 상용이며 무료 버젼은 기능 제한이 있음 )

  • Designspark PCB (무료, 기능 제한 없음)

  • KiCad (무료이며 오픈소스, 기능 제한 없음)

  • easyEDA (클라우드기반, 무료, 기능 제한 없음)


이것들 중 처음 두 개는 (Eagle, DipTracee) 상용 프로그램의 성능 제한판이 무료이고, 나머지 세 개는 모두 완전 무료인 프로그램들이다. 구글링을 해서 게시판의 글들을 쭉 보면 많은 사용자가 이것들 중 하나를 사용하고 있은 것을 알 수 있고 이 중에서 Eagle의 사용자가 가장 많은 것 같다. 아두이노 보드가 이 eagle을 사용해서 설계한 것으로 알려져 있다.

 

 이 중 Diptrace의 사용 편의성이 가장 좋으며 OrCad의 Layout만 예전에 잠깐 써 본 경험이 있었는데 이것과 비교하면 사용의 편의성면에서는 비교가 안되는 것 같다. 회로도를 작성하고 이를 기반으로 PCB를 설계하는 프로세스가 굉장히 간단하며 사용자 라이브러리를 작성하는 툴의 사용도 매우 직관적이다. 또한 가장 큰 장점인 무료버젼만 사용해도 300핀/2층 기판을 설계하는데 제한이 없다. 하지만 이것도 무료 버젼은 양면 PCB만 가능하다든지 핀 수에 제한이 있는 등 기능에 제약이 있다.

[그림 2] DipTrace 의 외형


 구글링을 해보면 Designspark PCB 가 가장 높은 점수를 받고 있는 것 같다. 그 이유는 다음과 같다.


  • 기능 제한이 없는 완전한 무료 프로그램.

  • 그러면서도 상용 제품 못지 않은 기능을 제공.

  • 대기업에 의해서 개발되므로 앞으로 지속적으로 유지, 업그레이드될 가능성이 크다.

         

좀 더 자세한 설명은 이 포스트에 소개되어 있다.


 개인적으로 Designspark PCB는 인터페이스가 별로 마음에 들지 않았다. 차라리 KiCad가 더 낫다는 생각이다.



'PCB설계' 카테고리의 다른 글

barebone arduino 예제  (0) 2018.04.10
layout 예제 01  (0) 2018.04.03
DipTrace Schematic 동영상 강의 1  (0) 2018.03.29
예제 #8, #9, #10  (0) 2018.03.20
KiCad에서 부품 라이브러리 추가하기  (0) 2015.06.19
Posted by 살레시오
,

 만약 x, y가 심볼로 등록이 되어 있다면 함수 y(x)의 x에 대한 미분은 sympy에서 다음과 같이 표현할 수 있다.


  • y(x) : 독립 변수 x에 대한 함수 y

  • y(x).diff() 혹은 y(x).diff(x,1) : 1차 미분

  • y(x).diff(x,2) : 2차 미분

  • y(x).diff(x,3) : 3차 미분


이것을 이용하면 상미분식을 표현할 수 있다. 예를 들면 다음과 같다.


[표 1] 미분식의 심파이 표현식 예

수식

심파이 표현식

y(x).diff() - cos(x)

y(x).diff(x,2) + 9*y(x) - exp(-2*x)

y(x).diff()-1-y(x)**2


함수를 표현할 때 y(x)와 같이 독립변수도 반드시 표기해야 함을 유의하자.


 dsolve()함수는 미분방정식을 풀어주는 sympy의 기본 함수이다. 첫 번째 인자로 미분식을, 두 번째 인자로 구할 함수를 적어주면 된다. 예를 들어서 다음과 같은 1차 상미방을 푼다고 가정하자.



이 미분방정식의 우변을 0으로 만들면 다음과 같다.



이제 dsolve 함수의 첫 번째 인자로 위 식의 좌변을 넣어주고 두 번째 인자로 y(x)를 인가하면 된다.



여기서 C1은 상수이다.  다른 미분 방정식을 풀어보자.



이 방정식도 우변을 먼저 0으로 만들어야 한다.



이제 이 식의 좌변을 dsolve()함수의 첫 번째 인자로 넣어준다.



2차 미분방정식도 입력할 수 있다. 예를 들어



을 풀려면 다음과 같이 하면 된다.



만약 함수의 미분표현식을 매번 입력하기 번거롭다면 다음과 같이 새로 정의하여 사용하면 된다.



이렇게 정의해 놓으면 이후부터는 y(x).diff() 대신 dy를, y(x).diff(x,2) 와 같이 긴 표현식 대신 ddy를 사용하면된다.



여기서 C1과 C2는 상수이다. 이것이 dsolve()함수를 이용한 미분방정식을 푸는 가장 기본적인 방법이다.



Posted by 살레시오
,

 심파이에서 행렬객체에 수행할 수 있는 선형대수 관련 연산을 다음 표에 정리하엿다.


[표 1] 선형대수 연산

연산

기능

A.T

A.H

A.D

전치행렬(transposition)

복소전치행렬(hermite conjugation)

Dirac transposition

A.rank()

행렬의 랭크(rank)

A.det()

행렬식 (determinant)

A.inv()

역행렬 (inverse matrix)

A.LUsolve(b)

행렬방정식 Ax=b 를 푼다.

A.norm()

norm을 구한다.

A.eigenvals(**flags)

A.eigenvects(**flag)

행렬의 고유값을 구한다.

행렬의 고유값과 고유벡터를 구한다.

A.evalf()

행렬 각 요소의 실수 근사값을 구한다.

A.applyfunc(f)

행렬 각 요소에 함수 f를 적용한다.


숫자로만 이루어진 행렬뿐만 아니라 대수 기호가 포함된 행렬에 대한 연산도 수행 가능하다.


>>> x=symbols('x') # x 를 기호로 설정
>>> C=Matrix([[x,2],[1,x]])
>>> D=ones(2)*x

>>> C
[x  2]
[1  x]

>>> D
[x  x]
[x  x]

>>> C.det()
2    
x  - 2

>>> C*D
[  2             2   ]
[x  + 2*x  x  + 2*x  ]
[   2           2    ]
[ x  + x    x  + x   ]


만약 대수 기호 대신에 숫자를 입력하고 싶다면 subs() 메쏘드를 이용한다.


>>> C.subs(x,11)
[11  2 ]
[1   11]

>>> y=symbols('y')

>>> D.subs(x,y**2+1)
[ 2       2    ]
[y  + 1  y  + 1]
[ 2       2    ]
[y  + 1  y  + 1]

>>> D.subs(x,sqrt(y))
[  ___    ___     ]
[\/ y     \/ y    ]
[  ___    ___     ]
[\/ y     \/ y    ]




Posted by 살레시오
,

 행렬 간 산술 연산은 +, -, *, ** 연산자로 수행할 수 있다. *은 행렬 간 곱셈을, **은 거듭제곱을 수행한다.


[표 1] 행렬의 기본 연산

연산

기능

A+B, A-B

행렬간 덧셈, 뺄셈

A*B

행렬간 곱셈 (A의 열 수와 B의 행 수가 같아야 한다.0

A**k

행렬 A의 k 거듭 제곱

v1.dot(v2)

벡터 v1과 v2의 내적(dot product)


덧셈과 곱셈은 두 행렬의 크기가 같아야 하고 행렬 간 곱셈은 차수 조건에 맞아야 한다. 즉, 첫 번째 행렬의 열 수와 두 번재 행렬의 행 수가 같아야 곱셈이 성립한다.


>>> A=randMatrix(3,4)
>>> B=randMatrix(4,2)

>>> A
[2   48  28  60]
[2   9   18  88]
[79  14  17  25]

>>> B
[10  49]
[47  95]
[18  67]
[60  59]

>>> A*B   
[6380  10074]
[6047  7351 ]
[3254  7815 ]

>>> B*A # 오류발생


 파이썬에서 **가 거듭제곱 연산자이므로 심파이에서도 행렬의 거듭제곱은 ** 연산자로 수행한다. 거듭제곱을 수행하려면 행렬이 정방행렬이어야 한다.


>>>  A=Matrix([[1,2],[2,3]])
⎡1  2⎤
⎣2  3⎦

>>> A**10
⎡514229  832040 ⎤
⎣832040  1346269⎦



Posted by 살레시오
,

  행렬 객체에 대해서 파이썬 인덱싱과 슬라이싱도 사용할 수 있다. 주의할 점은 수학의 행렬은 1행, 1열부터 시작하지만 Matrix객체는 인덱스가 0으로 부터 시작한다는 점이다. 따라서 첫 번째 행(열)의 인덱스는 0이고 두 번째 행(열)의 인덱스는 1이다.


>>> M = Matrix(2, 3, [1,2,3,4,5,6])
>>> M
[1 2 3]
[4 5 6]

>>> M[4] # 5
>>> M[1,2] # 6
>>> M[0,0] # 1
>>> M[1,1] # 5

>>> M[0:2, 0:2] # 2x2 부분 행렬
>>> M[1:2, 2]
>>> M[:,2] # 3열 전체


특정한 행이나 열을 뽑아내고 싶다면 row(n), col(n) 멤버 함수를 이용한다.


>>> M.row(0)
>>> M.col(2)
>>> M.row(-1) # 마지막 행을 뽑아낸다.


행렬 M의 복사본을 생성하고 싶다면 다음과 같이 하면 된다.


>>> M2 = M[:,:]
>>> M2[0,0]=100
>>> M


이와 같이 M2를 변경해도 M에는 영향을 미치지 않는다.


>>> M = Matrix(4,4,range(1,17))
⎡1   2   3   4 ⎤
⎢5   6   7   8 ⎥
⎢9   10  11  12⎥
⎣13  14  15  16⎦

>>> M[2,2] = M[0,3] = 0
>>> M
⎡1   2   3   0 ⎤
⎢5   6   7   8 ⎥
⎢9   10  0   12⎥
⎣13  14  15  16⎦

>>> M[2:, 2:] = zeros(2,2)
>>> M
⎡1   2   3  4⎤
⎢5   6   7  8⎥
⎢9   10  0  0⎥
⎣13  14  0  0⎦


행렬의 특정 행이나 열을 삭제하고 싶을 경우는 row_del(), col_del() 멤버함수를 이용하면 된다.


>>> M.row_del(0) # 첫 번째 행을 삭제한다.
>>> M.col_del(1) # 첫 번째 열을 삭제한다.


반대로 특정한 행이나 열을 끼워 넣고 싶다면 row_insert(n), col_insert(n) 을 이용한다. 이 경우 기존 행렬의 요소들을 밀어내고 그 위치에 입력한 행이나 열을 끼워 넣게 된다.


 그리고 A.row_join(B) 는 A행렬의 오른편에 B행렬을 병합시키고 A.col_join(B)는 A행렬의 하단에 B행렬을 병합시킨다.


>>> A=eye(3)
>>> A
⎡1  0  0⎤
⎢0  1  0⎥
⎣0  0  1⎦

>>> B=Matrix(3,2,range(11,17))
>>> B
⎡11  12⎤
⎢13  14⎥
⎣15  16⎦

>>> A.row_join(B)
⎡1  0  0  11  12⎤
⎢0  1  0  13  14⎥
⎣0  0  1  15  16⎦

>>> A.col_join(B.T)
⎡1   0   0 ⎤
⎢0   1   0 ⎥
⎢0   0   1 ⎥
⎢11  13  15⎥
⎣12  14  16⎦


또한 행렬객체의 메쏘드 중에 extract()라는 함수가 있다. 이것을 이용해서 원하는 부분을 뽑아낼 수 있다.


>>> A.extract(rowsList, colsList)


예를 들면 다음과 같다.


>>> M=Matrix(4,3,range(12))
>>> M
⎡0  1   2 ⎤
⎢3  4   5 ⎥
⎢6  7   8 ⎥
⎣9  10  11⎦

>>> M.extract([0,1,3],[0,1])
⎡0  1 ⎤
⎢3  4 ⎥
⎣9  10⎦


이 예를 보면 [0행, 1행, 3행] 과 [0열, 1열]이 겹치는 부부만 뽑아져 나온 것을 알 수 있다. 해당 행과 열에 선을 그어서 선이 겹치는 부분을 확인해 보면 쉽게 이해할 수 있을 것이다.



Posted by 살레시오
,