[R] 행렬(Matrix)

[R] 행렬(Matrix)

R에서 다룰 수 있는 연속성 자료형으로서 행렬 구조가 있습니다. 행렬은 백터에 의 수를 지정하여 나누어 표현한 형태 입니다.

#01. 행렬 생성하기

1) 행렬 만들기

  • 백터를 matrix()함수에 전달하여 행렬로 변환함.
  • 이 때 전달되는 두 번째 파라미터가 행의 수를 결정하며 열의 수는 자동으로 계산되어 지고 값은 왼쪽 열부터 차례대로 채워짐.
  • 만약 지정된 행의 수가 열을 나누기에 적합하지 않다면 에러가 발생함.

행,열 수 지정하기

  • ncol : 벡터의 원소를 지정된 칸 수만큼 나열하고 줄 바꿈함 (행 수는 자동 계산됨)
  • nrow : 벡터의 원소를 지정된 행 수 만큼 나열하고 다음 칸으로 넘어감 (열 수는 자동 계산됨)

2행 3열의 행렬 만들기 (ncol) 사용

v <- c(1, 2, 3, 4, 5, 6)
a <- matrix(v, ncol=3)
sprintf("행렬의 타입: %s", typeof(a))
print(a)

💻 출력결과

'행렬의 타입: double'
  [,1] [,2] [,3]
[1,]135
[2,]246

3행 2열의 행렬 만들기 (nrow) 사용

v <- c(1, 2, 3, 4, 5, 6)
a <- matrix(v, nrow=3)
sprintf("행렬의 타입: %s", typeof(a))
print(a)

💻 출력결과

'행렬의 타입: double'
        [,1] [,2]
[1,]       1    4
[2,]       2    5
[3,]       3    6

2) 생성된 행렬의 크기 확인하기

  • nrow()는 행렬의 행의 크기를 반환하고 ncol()함수는 열의 크기를 반환함.

행렬의 크기 확인

m <- matrix(c(1, 2, 3, 4, 5, 6), ncol=3)
rows <- nrow(m)
cols <- ncol(m)
sprintf("행렬의 크기 (%d x %d)", rows, cols)

💻 출력결과

'행렬의 크기 (2 x 3)'

3) 단일 원소에 접근하기

  • 행,열 순으로 인덱스 번호를 명시하여 접근.

2행 3열의 원소 접근

m <- matrix(c(1, 2, 3, 4, 5, 6), ncol=3)
print(m[2, 3])

💻 출력결과

6

4) 행렬의 값이 채워지는 방향 변경하기

  • byrow 파라미터를 TRUE로 설정하면 행렬을 생성하면서 값들을 행 우선()으로 채워넣는다.
  • 별도로 설정하지 않는 경우 기본값은 FALSE

열 우선 배치 행렬

v <- c(1, 2, 3, 4, 5, 6, 7, 8)
b <- matrix(v, ncol=4, byrow=FALSE)
print(b)

💻 출력결과

     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8

행 우선 배치 행렬

v <- c(1, 2, 3, 4, 5, 6, 7, 8)
b <- matrix(v, ncol=4, byrow=TRUE)
print(b)

💻 출력결과

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8

#02. 원소에 접근하는 다양한 방법

1) 특정 행의 모든 데이터 추출

2행의 모든 데이터 가져오기

v <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
mat <- matrix(v, ncol=3, byrow=TRUE)
print(mat)
print(mat[2, ])

💻 출력결과

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

[1]  4  5  6

2) 복수 행의 모든 데이터 추출

  • 시작값:끝값 형식으로 범위 지정 가능함.

샘플 행렬에서 2~3행의 모든 데이터 가져오기

v <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
mat <- matrix(v, ncol=3, byrow=TRUE)
print(mat)
print(mat[2:3, ])

💻 출력결과

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

     [,1] [,2] [,3]
[1,]    4    5    6
[2,]    7    8    9

3) 특정 행을 제외한 다른 행 데이터 추출

샘플 행렬에서 2행을 제외하는 모든 데이터 가져오기

v <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
mat <- matrix(v, ncol=3, byrow=TRUE)
print(mat)
print(mat[-2, ])

💻 출력결과

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    7    8    9

#03. 행렬에 이름 지정하기

1) 행과 열에 대한 이름 지정

dimnames 파라미터로 벡터를 원소로 갖는 리스트 객체를 할당하여 행,열에 대한 이름을 부여할 수 있음.

행렬에 학생 이름과 과목이름 부여하기

v <- c(98, 82, 74, 87, 98, 72)

# 행렬의 행과 열에 이름 지정하기
e <- matrix(v, nrow=2, dimnames=list(c("철수", "민철"),
 c("국어", "영어", "수학")))
print(e)

💻 출력결과

     국어  영어  수학
철수   98   74   98
민철   82   87   72

2) 행,열에 이름을 갖는 행렬의 데이터에 접근하기

철수의 영어 점수 가져오기

v <- c(98, 82, 74, 87, 98, 72)

# 행렬의 행과 열에 이름 지정하기
e <- matrix(v, nrow=2, dimnames=list(c("철수", "민철"),
 c("국어", "영어", "수학")))
print(e["철수","영어"])

💻 출력결과

[1] 74

#04. 같은 크기를 갖는 행렬끼리의 연산

1) 행렬과 스칼라 값의 연산

  • 모든 원소에 같은 연산이 적용됨.
  • 모든 연산자가 가능
  • 사칙연산(+, -, *, ``, ^, /, %/%, %%),
  • 비교연산(==, , >, <, , ),
  • 논리연산(and, or)

모든 원소에 10씩 더하기

v <- c(1, 2, 3, 4)
x <- matrix(v, nrow=2, byrow=TRUE)
print(x)

y <- x + 10
print(y)

💻 출력결과

     [,1] [,2]
[1,]    1    2
[2,]    3    4

     [,1] [,2]
[1,]   11   12
[2,]   13   14

2) 행렬끼리의 연산

  • 두 행렬에서 같은 위치의 원소끼리 연산 (사칙,비교,논리 연산 가능)
  • 크기가 같은 행렬끼리만 가능하다.

크기가 같은 행렬끼리 연산하기

x <- matrix(c(1, 2, 3, 4), nrow=2, byrow=TRUE)
y <- matrix(c(5, 6, 7, 8), nrow=2, byrow=TRUE)
z <- x * y
print(z)

💻 출력결과

     [,1] [,2]
[1,]    5   12
[2,]   21   32

#04. 특수한 형태의 행렬

1) 대각행렬 (diagonal matrix)

  • 대각성분 이외의 모든 성분이 모두 0n차 정방행렬
  • diag(성분값...) 함수를 사용하여 만든다.

대각행렬 만들기

d1 <- diag(c(1, 2, 3))
print(d1)

d2 <- diag(c(10, 20, 30, 40))
print(d2)

💻 출력결과

     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    2    0
[3,]    0    0    3

    [,1] [,2] [,3] [,4]
[1,]  10    0    0    0
[2,]   0   20    0    0
[3,]   0    0   30    0
[4,]   0    0    0   40

2) 단위행렬(E), Unit Matrix

  • 주대각선의 원소가 모두 1이며 나머지 원소는 모두 0인 정사각 행렬
  • 항등행렬(identity matrix)이라고도 함.

단위행렬 만들기

e1 <- diag(c(1, 1, 1))
print(e1)

e2 <- diag(c(1, 1, 1, 1))
print(e2)

💻 출력결과

      [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

      [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    1    0    0
[3,]    0    0    1    0
[4,]    0    0    0    1

3) 역행렬

  • 어떤 행렬 A와 곱했을 때 곱셈에 대한 항등원인 단위행렬 E가 나오게 하는 행렬

역행렬 만들기

x <- matrix(c(1, 2, 3, 4), nrow=2, byrow=TRUE)
r <- solve(x)
print(r)

💻 출력결과

     [,1] [,2]
[1,] -2.0  1.0
[2,]  1.5 -0.5

4) 전치행렬

  • 행과 열을 교환하여 얻는 행렬

전치행렬 구하기

x <- matrix(c(1, 2, 3, 4, 5, 6), nrow=2, byrow=TRUE)
r <- t(x)
print(r)

💻 출력결과

     [,1] [,2]
[1,] -2.0  1.0
[2,]  1.5 -0.5
호쌤(이광호)'s Picture

About 호쌤(이광호)

메가스터디IT아카데미에서 Java, Spring, Python, Frontend 등을 강의하는 IT 전문 강사이자 프리렌서 개발자 입니다.
https://www.youtube.com/@hossam-codingclub

Seoul, Korea http://www.hossam.kr