생성된 행렬의 개별 요소를 접근하려면 행렬에 괄호 안에 행과 열의 번호를 콤마(,)로 구분하여 써주면 되는데 예를 들어 A행렬의 r행 c열 요소는 다음과 같이 접근한다.


 A(r, c)

 

여기서 r과 c를 인덱스(index)라고 한다. 사용 예를 들면 다음과 같다.

>> A = [ 1 2 3; 4 5 6]
>> b = A(1, 2) // 2가 변수 b에 저장된다.
>> A(2,3) = 3*%i // 2행 3열의 요소가 6에서 3i 로 변경된다.

만약  B가 벡터라면 다음과 같이 두 가지 방법으로 인덱싱을 할 수 있다.


>> B = [2 3 5 7 11 13 17 19]
>> c = B(1, 5)  // 1행 5열 요소이므로 11이 변수 c에 저장된다.
>> d = B(5) // 위와 같다.
>> E = (1:100)’
>> f = E(5,1) // 5행 1열의 요소이므로 5가 변수 f에 저장된다.
>> g = E(5) // 위와 같다.

 

이 예제와 같이 벡터의 인덱싱은 하나만 지정할 수 있다.


 사실 행렬은 내부적으로 1차원 배열로 관리되며 따라서 인덱스를 하나만 지정할 수는 있다. 예를 들어 다음과 같이 H행렬이 있다고 가정할 때


>> H = [ 10, 20, 30; -40, -50, -60,]

 

H(1)은 H(1,1)과 같이 10이고 H(2)는 H(2,1)의 요소인 -40이다. H(3)은 H(2,1)과 같다.

H(1) == H(1,1)

H(3) == H(1,2)

H(5) == H(1,3)

H(2) == H(2,1)

H(4) == H(2,2)

H(6) == H(2,3)

[ 그림 1] H행렬의 인덱싱

하지만 행렬의 경우 이런 방식으로 인덱싱하는 것을 추천하지 않으며 사용 빈도도 낮다.

 하나의 행 또는 하나의 열 전체를 선택하고자 할 때는 콜론(:)을 인덱스로 사용한다. 예를 들어서 H행렬의 1행 전체와 2열 전체를 선택해서 J1과 J2에 대입하고자 하면 다음과 같이 한다.


>> J1=H(1,:) // 1행, 전체 (즉 그냥 1행)
J1  =
    10.    20.    30.  
>> J2=H(:,2) // 전체. 2열 (즉 그냥 2열)
J2  =
    20.  
  - 50.  

이와 같이 콜론(:)이 인덱싱에서 단독으로 쓰이면 전체(all)의 의미를 갖는다. 혼동의 여지가 있는 것은 이전 포스트에서 설명한 콜론(:)연산자의 경우이다. 예를 들어서 2x100 행렬 K를 다음과 같이 생성했다고 가정해 보자.

>> K = [1:100; 100:-1:1]

이 행렬의 1열부터 10열까지 동시에 선택해서 변수 L에대입하려면 다음과 같이 하면 된다.


>> L = K(:, 1:10)

 

두 번째 열인덱스에 1:10 이라고 콜론 연산자를 사용했다. 따라서 이 명령은 다음과 완전히 동일하다.

>> L = K(:, [1 2 3 4 5 6 7 8 0 10])


이렇게 하는 것 보다는 전자가 훨씬 간단하므로 전자를 사용할 것이다. 하지만 콜론 연산자를 사용하는 것은 연속되거나 등간격의  행이나 열을 선택하는 경우에만 사용할 수 있다. 예를 들어서 2열, 4열, 6열… 20열을 동시에 취하려면 다음과 같이 하면 된다..

>> M = K(:, 2:2:20)


하지만 등간격이 아닌 경우에는 행벡터로 각각을 직접 지정해 주어야 한다. 예를 들어서 1열, 2열, 3열 5열 7열 11열 을 동시에 취하려면 다음과 같이 하면 된다.


>> M = K(:, [1 2 3 4 5 11])

등간격이 아니므로 이렇게 직접 지정해 주어야 한다.


 만약 어떤 행렬의 가장 마지막 행(또는 열)을 선택하고 싶다면 $지정자를 이용하면 된다.(MATLAB의 경우에는 end 지정자가 있다.) 예를 들어 K행렬의 가장 마지막 열을 N변수에 대입하고 싶다면다음과  같이 하면 된다.


>>N=K(:,$)
N  =
   100.  
   1.  

 

다른 예로 P라는 100x100는 행렬이 있다고 하고 이 행렬의 마지막 행의 1열부터 50열까지를 선택하고 싶다면

>> P($, 1:50)

라고 지정하면 된다. 마지막행 전체를 선택하려면 P($ , :)라고 하면 될 것이다.

 한 가지 특이한 점은 이 $ 지정자는 특정한 값을 가지지 않는데도 불구하고  마치 특수 상수처럼 사용된다는 점이다. 이 말은 이 지정자가 자유롭게 변수에 저장될 수 있다는 말이며 다음과 같은 명령이 가능하다.


>> x = $
>> y = [ 3 5 7 $]
>> z = 5:$
>> Q = P(:, z)

이 예의 마지막 명령은 P행렬의 5열부터 마지막 열까지를 취해서 Q변수에 대입하는 것이다.




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 살레시오
,