[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)
- 대각성분 이외의 모든 성분이 모두
0
인n차 정방행렬
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