매트릭스(matrix, 행렬)
  같은 자료형의 여러개의 데이터를 2차원 구조로 저장한다.
  행: 가로줄, row
  열: 세로줄, column  

매트릭스 생성
  matrix(2차원 벡터)
  벡터를 기반으로 행렬을 생성한다.
  ex) 20칸 짜리 벡터를 4행5열의 매트릭스로 생성

  matrix 생성 함수(기능) 존재, arguments(인수) 정보
    (data) 값 전달
    (nrow) 행의개수
    (ncol) 열의개수
    (byrow) False(데이터를 채우는 방향, 기본 열방향), True(행방향)

 

###########################
# 매트릭스 생성
help(matrix)

matrix(data = 16)   # 데이터 1개
matrix(data = 1:16)
matrix(data = 1:16, nrow=4, ncol=4)  # 값이 채워지는 방향 세로
matrix(data = 1:16, nrow=4)
matrix(data = 1:16, ncol=8)
matrix(data = 1:16, ncol=7) # 부족한값은 재사용

# byrow=TRUE : 가로 방향 채우기
matrix(data = 1:16, nrow=4, byrow=TRUE)
# 가로 index, 세로 index가 존재
matrix(data = 1:16, nrow=2, byrow=TRUE)

 

 

매트릭스와  연산자


  매트릭스와 비교 연산자를 비교하면 결과가 논리벡터가 나온다
  *매트릭스와 연산자(비교, 산술 등)를 사용하면 element(요소)간 연산 수행

  m2 <- matrix(data=1:4, nrow=2)
  # 1 3
  # 2 4
  m2 > 2
  # F T
  # F T


매트릭스에서 요소 가져오기


  매트릭스명[행 인덱스 번호, 열 인덱스 번호]
  * 매트릭스의 요소는 행과 열 인덱스 번호 2개를 가지고 있다.

  1. 하나의 행 요소 가져오기
    매트릭스명[행 인덱스번호, ]
    * 생략된 인덱스 번호는 모든 것(열)을 의미
  2. 하나의 열 요소 가져오기
    매트릭스명[, 열 인덱스번호]
    * 생략된 인덱스 번호는 모든 것(행)을 의미
  3.하나의 요소 가져오기
    매트릭스명[행 인덱스번호, 열 인덱스번호]
  4.특정 행과 열을 제외한 데이터 가져오기
    매트릭스명[-제외할 행 인덱스번호, -제외할 열 인덱스번호]

 

###########
# 매트릭스에서 요소 가져오기
m1 <- matrix(data = 1:16, ncol=4)
m1
# 데이터 10의 요소 가져오기
m1[2,3]
# 데이터 15의 요소 가져오기
m1[3,4]

# 매트릭스에서 2행의 요소 가져오기
m1[2,] # 비어있으면 모든 요소
m1[,3]

# 부분 요소 가져오기
m1[1:2, ]k

# 매트릭스 구조로 가져오기, drop=F 속성 사용
m1[, 3, drop=F]

# 1행,3행의 2열,4열의 데이터 가져오기
m1[c(1,3), c(2,4)]

#음수 인덱스(제외하기)도 행과 열 모두 사용가능
m1[-1, -1]

# 쉼표 없이 인덱스 번호를 가져오면, 벡터의 인덱스가 됨
# 매트릭스를 벡터로 변환후 해당 인덱스를 가져옴
m1[1]
# 기본 열단위로 벡터를 풀어서 반환함
m1[3]

# 행단위 매트릭스의 벡터 변환후 값 확인하기
m2<-matrix(data=1:16, ncol=4, byrow=TRUE)
m2
m2[3]

# matrix를 vector로 명시적으로 변환하여 확인
m2_v = as.vector(m2)
m2_v
m2_v[3]

# maxtrix를 행단위로 벡터로 변환하는 방법
# T(Transpose): 전치행렬 만듦, 대각선 방향 치환
m2
t(m2)
m2_v_t = as.vector(t(m2))
m2_v_t
m2_v_t[3]

# m1에서 10보다 큰 요소 가져오기
m1>10
m1[m1>10]

# 1행에서 10보다 큰 요소 가져오기
m1[1, m1>10] # 에러
m1[1, m1[1,] >10] 
m1[1,] > 10

#문) 3열에서 10보다 큰 요소 가져오기
m1 <- matrix(data = 1:16, ncol=4)

#과제3.
#아래의 코드를 실행했을때 1 37 NA를 가져오게 됩니다.
#그이유는?
nums <- c(1, 3, NA, 10, 37)
nums[c(T,F,F,F,T,T)]

###############################
# 매트릭스를 인덱스로 사용하기
m1
m_idx = matrix(data=c(1,1,2,2), nrow=2, byrow=T)
m_idx
m1[m_idx]

 

*만약에 인덱스 자리에 매트릭스를 사용한다면,
   1) 논리 매트릭스
     기준 매트릭스와 인덱스로 사용하는 매트릭스가
     둘다 벡터로 변환되어 벡터(논리벡터)로 사용된다
     -> 결과가 벡터로 나온다.
   2) 숫자 매트릭스
     인덱스로 사용하는 매트릭스의 각 행 요소를 
     기준 매트릭스 행과 열 인덱스 번호로 사용한다.

 

매트릭스의 정보


  1. str(): 매트릭스의 정보
  2. length(): 매트릭스의 전체 데이터의 개수
  3. dim(): 행과 열의 수, dimension(차원)
    * 직선: 1차원
      표:  2차원
      공간: 3차원
  4. nrow(): 매트릭스의 행의 개수
  5. ncol(): 매트릭스의 열의 개수
  6. dimnames(): 매트릭스의 행과 열의 이름
    * rownames(): 행이름
    * colnames(): 열이름
    -> 매트릭스도 벡터와 마찬가지로 이름을 붙이면
       인덱스번호 대신 이름을 사용할 수 있다.

#######################
# 매트릭스 정보 확인

# 매트릭스 정보확인: 자료형, 행번호/열번호, 총 데이터
str(m1)
# 매트릭스 데이터 개수
length(m1)

class(m1) # 자료구조의 자료형 
mode(m1)  # 데이터의 자료형
typeof(m1)# 데이터의 자료형(내부저장관점)

#벡터여부 확인
is.matrix(m1)
is.matrix(1:3)
      
#행/열의 개수
dim(m1)
#행/열의 이름
dimnames(m1)
colnames(m1)
rownames(m1)

#행/열에 이름 붙이기
rownames(m1) <- c("R1", "R2", "R3", "R4")
m1
colnames(m1) <- c("C1", "C2", "C3", "C4")
m1

colnames(m1)
rownames(m1)
dimnames(m1)

m1[1,]
m1["R1",]

#벡터의 데이터 추가
v1<-1:5
v2<-10:15
v1; v2
v3 <- c(v1, v2)
v3
v4 <- c(v3, 100)
v4

# 매트릭스의 추가(노트정리 후 추가 실습)
m3 <- c(m1, matrix(1:4, 2))
m3

 

매트릭스 사용


  1.추가
    행추가: rbind(기존 매트릭스, 추가할 행)
    열추가: cbind(기존 매트릭스, 추가할 열)
  2.수정
    매트릭스명[행 인덱스번호, 열 인덱스번호] <- 새로운 값
  3.삭제
    매트릭스명 <- 삭제할 요소를 제외하고 가져온 매트릭스

 

########
# 매트릭스 사용
# 매트릭스는 벡터와 다르게 길이를 넘은
# 인덱스를 사용하면 에러 발생
m1[5,]

#추가
# cbind:열추가
m1
cbind(m1, 1:4)

#추가할려는 벡터를 변수에 담으면
#행 또는 열의 이름을 벡터명으로 자동 사용
C5 <- 1:4
cbind(m1, C5)
R5 <- 10:13
rbind(m1, R5)

help(rbind)
# 행렬끼리 연결시, 행과, 열의 개수가 동일해야함
rbind(m1, matrix(20:35, 4))

# 수정
m1[1,1] <- 1000
m1

m1[2,] <- 99
m1

# 수정할려는 값의 길이와 행렬의 행,열의 길이가 일치해야함
m1[3,] <- 1:6
cat(length(1:6), length(m1[3,]))
m1

#삭제
m1[-2, ]
m1_d = m1[-2, ]
m1_d

# 매트릭스 연산
m2 <- matrix(1:6, nrow=2)
m2

# 10이 6개 들어가 있는 벡터 생성
m3 <- matrix(rep(10, 6), nrow=2)

m2 + m3
m2 * m3

# 매트릭스끼리는 서로 길이가 같아야 연산가능
m4 <- matrix(rep(10,4), nrow=2)
m2 + m4

m5 <- matrix(rep(10,6), ncol=2)
m5
m2

# 행렬의 내적
# 같은 위치 원소끼리 곱한 뒤 합산
m2 %*% m5

+ Recent posts