[R프로그래밍] 행렬 구조 Ⅰ(matrix, 선형대수연산, 인덱싱, 필터링)
데이터 구조(벡터, 행렬, 리스트, 데이터프레임) 특집 - 행렬 첫번째
< 행렬 >
행렬은 모든 원소가 같은 데이터 형태를 갖는 2차원 데이터 구조이다. 즉 벡터(Vector)의 2차원 형태이다.
행렬은 행(row)과 열(column)이 존재하며, 열의 개수나 행의 개수를 지정하지 않으면 열을 우선으로 할당하도록 설정되어있다.
※ 행렬과 배열의 관계 1. 배열? 일정한 규칙에 따라 몇몇 요소가 나열되어 있는 데이터 집합이다. 배열은 차원을 가진다. 2. 행렬과 배열의 관계 ① 행렬은 행의 개수와 열의 개수라는 두 가지 속성을 추가로 갖는 벡터이다. ② 행렬은 '배열'의 한 종류이며, 배열의 특수한 형태라고 볼 수 있다. 정확히 말해 2차원 배열을 행렬이라고 한다. 배열은 2차원 이상의 속성을 가질 수 있고, 또 행렬은 벡터이므로 모든 원소가 같은 데이터를 갖는다. |
< 행렬의 생성 >
행렬은 matrix( ) 라는 명령어를 통해 생성한다.
# 행렬의 생성
m <- matrix(c(1:4), nrow=2, ncol=2)
m
- R에서 행렬의 내부 저장 공간은 '열 우선 배열(Column-major order)' 방식을 사용한다.
- ncol, nrow는 열과 행의 수를 지정하는 인수이다. 굳이 두 가지 옵션을 모두 지정할 필요는 없다.
열 우선 배열을 행 우선 배열(Row-major order)로 바꾸고 싶을 때는 byrow=T 옵션을 사용하면 된다.
# row-major order
m <- matrix(c(1:6), nrow=2, byrow=T)
m
< 행렬의 선형대수 연산 >
선형대수는 '벡터 공간, 벡터, 선형 변환, 행렬, 연립 선형 방정식 등을 연구하는 대수학의 한 분야'이다.
행렬의 사칙연산 중에서도 행렬의 곱셈은 앞 Matrix의 열과 뒤 Matrix의 행의 개수가 맞아야 계산이 가능하다.
이를 행렬의 내적이라고 하고 이렇듯 행렬의 사칙연산은 일반적이지 않기 때문에 이를 선형대수라고 한다.
행렬의 선형대수 연산자는 다음과 같다.
연산자 | 의미 | |
1 | %*% | 행렬-행렬 곱셈 |
2 | * | 행렬-상수 곱셈 |
3 | %/% | 행렬-행렬 나눗셈 |
4 | / | 행렬-상수 나눗셈 |
5 | + | 행렬-행렬 덧셈, 행렬-상수 덧셈 |
6 | - | 행렬-행렬 뺄셈, 행렬-상수 뺄셈 |
# 행렬 선형대수 연산
m <- matrix(c(1:4), nrow=2)
n <- matrix(c(5,10,15,20), nrow=2)
m %*% n # 행렬-행렬 곱셈
m *3 # 행렬-상수 곱셈
m %/% n # 행렬-행렬 나눗셈
m / 5 # 행렬-상수 나눗셈
m + n
m + 3
< 행렬 인덱싱 >
행렬은 벡터이므로 벡터와 같은 상식은 [ ] 기호를 사용하면 인덱싱 할 수 있다.
다만 행렬은 2차원 구조이므로 구조에 맞추어 [행, 열] 형태로 인덱싱 하기만 하면 된다.
# 행렬 인덱싱
m <- matrix(c(1:12), ncol=4)
m
m[2,3] # 2행 3열 인덱싱
m[, 2:3] # 모든 행과 2~3열 인덱싱
인덱싱을 이용해 부분행렬에 값을 새로할당하는 것도 가능하다.
m <- matrix(c(1:12), ncol=4)
m[c(1,3), 2:3] # 1,3행과 2~3열
# 1,3행과 2~3열에 44, 45, 46, 47 할당
m[c(1,3), 2:3] <- matrix(c(44:47), nrow=2)
m
< 행렬 필터링 >
인덱싱 방식에 조건식을 넣으면 필터링도 가능하다.
# 행렬 필터링
m <- matrix(c(1:12), ncol=4)
m[c(1,3), 2:3] <- matrix(c(44:47), nrow=2)
m
# m행렬에서 3행의 값이 5보다 크거나 같은지?
m[3, ] >= 5
# 3행의 값이 5보다 크거나 같은 열을 추출
m[, m[3,]>=5]