R프로그래밍

[R프로그래밍] 행렬 구조 Ⅰ(matrix, 선형대수연산, 인덱싱, 필터링)

응호 2020. 4. 17. 14:30

데이터 구조(벡터, 행렬, 리스트, 데이터프레임) 특집 - 행렬 첫번째

 

 

 

< 행렬 >

행렬은 모든 원소가 같은 데이터 형태를 갖는 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]