0Pricing
R Academy · 강의

행렬 곱셈과 행렬식

행렬 곱셈에는 %*%를, 행렬식 계산에는 det()을 사용합니다.

행렬 곱셈과 행렬식은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

R에서 행렬 만들기

행렬은 기본적으로 열 단위로 채워지는 2차원 배열입니다. matrix(data, nrow, ncol)을 사용하세요. rownames()와 colnames()로 행과 열에 이름을 지정할 수 있습니다.

# Create a 3x3 matrix (filled column-wise)
A <- matrix(c(1, 2, 3,
              4, 5, 6,
              7, 8, 9), nrow = 3, ncol = 3, byrow = TRUE)
print(A)
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    4    5    6
# [3,]    7    8    9

dim(A)   # 3 3
nrow(A)  # 3
ncol(A)  # 3

행렬 곱셈: %*%

%*% 연산자는 실제 행렬 곱셈(행과 열의 내적)을 수행합니다. * 연산자는 요소별 곱셈을 수행하므로 흔히 하는 실수의 원인이 됩니다. 차원의 크기가 호환되어야 합니다: (m×n) %*% (n×p) = (m×p).

A <- matrix(c(1, 2, 3, 4), nrow = 2)
B <- matrix(c(5, 6, 7, 8), nrow = 2)

# Element-wise multiplication (NOT matrix mult)
A * B
#      [,1] [,2]
# [1,]    5   21
# [2,]   12   32

# True matrix multiplication
A %*% B
#      [,1] [,2]
# [1,]   19   43
# [2,]   22   50

# Verify: entry [1,1] = 1*5 + 2*6 = 17... wait:
# A[1,] = c(1,3), B[,1] = c(5,6): 1*5 + 3*6 = 23

%*% 결과 이해하기

행렬 곱셈을 직접 계산하여 확인해 보겠습니다. C = A %*% B의 (i,j) 항목은 A의 i번째 행과 B의 j번째 열의 내적입니다: sum(A[i,] * B[,j]).

A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, byrow = TRUE)
B <- matrix(c(7, 8, 9, 10, 11, 12), nrow = 3, byrow = TRUE)
# A is 2x3, B is 3x2 -> result is 2x2
C <- A %*% B
print(C)

# Verify entry C[1,1]:
# row 1 of A: c(1,2,3), col 1 of B: c(7,9,11)
manual_11 <- sum(A[1, ] * B[, 1])
manual_11  # 1*7 + 2*9 + 3*11 = 58
C[1, 1]   # should match

행렬식: det()

행렬식은 행렬의 스케일링 계수를 나타내는 스칼라 값입니다. det(A)로 계산합니다. det(A) == 0이면 행렬은 특이 행렬이며 역행렬이 존재하지 않습니다. 2×2 행렬의 경우 det = ad - bc입니다.

# 2x2 matrix: det = a*d - b*c
A <- matrix(c(3, 2, 1, 4), nrow = 2)
det(A)  # 3*4 - 2*1 = 10

# Singular matrix: det = 0
S <- matrix(c(1, 2, 2, 4), nrow = 2)
det(S)  # 0 -> not invertible

# Larger matrix
B <- matrix(c(2, -1, 0,
             -1,  2, -1,
              0, -1,  2), nrow = 3, byrow = TRUE)
det(B)  # 4

대각합: sum(diag())

행렬의 대각합은 대각선 요소의 합입니다. R에는 행렬용 내장 trace()가 없으므로(다른 함수입니다) sum(diag(A))을 사용하세요. 대각합은 고윳값의 합과 같습니다.

A <- matrix(c(4, 2, 1,
              3, 5, 0,
              2, 1, 6), nrow = 3, byrow = TRUE)
# Extract diagonal elements
diag(A)  # c(4, 5, 6)

# Trace = sum of diagonal
trace_A <- sum(diag(A))
trace_A  # 15

# Trace = sum of eigenvalues (verify)
eigs <- eigen(A)$values
sum(Re(eigs))  # should also be approximately 15

# trace() in base R is NOT the matrix trace:
# trace(A) # this does something else

crossprod()와 tcrossprod()

crossprod(A, B)는 t(A) %*% B를 효율적으로 계산하며, 이를 교차곱이라고 합니다. tcrossprod(A, B)는 A %*% t(B)를 계산합니다. 이 함수들은 전치 행렬을 별도로 만들 필요가 없으므로 명시적으로 전치하는 방식보다 빠릅니다.

A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3)
B <- matrix(c(7, 8, 9, 10, 11, 12), nrow = 3)

# t(A) %*% B  (the slow way)
result1 <- t(A) %*% B

# crossprod(A, B) = t(A) %*% B (faster)
result2 <- crossprod(A, B)
all.equal(result1, result2)  # TRUE

# crossprod(A) = t(A) %*% A
ATA <- crossprod(A)
print(ATA)

# tcrossprod(A, B) = A %*% t(B)
result3 <- tcrossprod(A, B)
all.equal(A %*% t(B), result3)  # TRUE

diag()로 단위 행렬 만들기

diag(n)은 n×n 단위 행렬을 만듭니다. 벡터 v에 대해 diag(v)를 사용하면 대각선에 v가 배치된 대각 행렬을 만듭니다. 행렬 A에 대해 diag(A)를 사용하면 대각선을 추출합니다.

# 3x3 identity matrix
I3 <- diag(3)
print(I3)
#      [,1] [,2] [,3]
# [1,]    1    0    0
# [2,]    0    1    0
# [3,]    0    0    1

# A * I = A (identity property)
A <- matrix(c(2, 3, 4, 5), nrow = 2)
all.equal(A %*% diag(2), A)  # TRUE

# Create diagonal matrix from vector
D <- diag(c(2, 5, 10))
print(D)
det(D)  # Product of diagonal: 100

행렬의 거듭제곱과 반복 곱셈

R에는 내장 행렬 거듭제곱 연산자가 없지만, 반복문에서 %*%를 사용하여 직접 작성하거나 expm 패키지를 사용할 수 있습니다. 행렬의 제곱 A² = A %*% A는 자주 사용하는 연산입니다.

# Matrix square
A <- matrix(c(1, 1, 1, 0), nrow = 2)
A_sq <- A %*% A
print(A_sq)
# Fibonacci connection: A^n gives Fib numbers!

# Simple matrix power function
mat_pow <- function(M, n) {
  result <- diag(nrow(M))  # start with identity
  for (i in seq_len(n)) result <- result %*% M
  result
}

mat_pow(A, 5)  # A to the 5th power
# [1,]  8  5
# [2,]  5  3

외적과 %o%

외적 x %o% y는 (i,j)번째 원소가 x[i] * y[j]인 행렬을 만듭니다. outer(x, y)와 같습니다. 상호작용 행렬과 특정 수학적 구성을 만드는 데 유용합니다.

x <- c(1, 2, 3)
y <- c(10, 20)

# Outer product: 3x2 matrix
P <- x %o% y
print(P)
#      [,1] [,2]
# [1,]   10   20
# [2,]   20   40
# [3,]   30   60

# Same as outer(x, y)
identical(P, outer(x, y))  # TRUE

# Outer with custom function
outer(1:3, 1:3, FUN = '+')
#      [,1] [,2] [,3]
# [1,]    2    3    4
# [2,]    3    4    5
# [3,]    4    5    6

행렬식의 성질

주요 성질은 다음과 같습니다. det(A %*% B) = det(A) * det(B); det(t(A)) = det(A); n×n 행렬에서는 det(k*A) = k^n * det(A)입니다. 행 연산을 하면 행렬식은 예측 가능한 방식으로 변합니다.

A <- matrix(c(2, 1, 5, 3), nrow = 2)
B <- matrix(c(4, 2, 1, 6), nrow = 2)

# det(A %*% B) = det(A) * det(B)
det(A %*% B)
det(A) * det(B)

# det(t(A)) = det(A)
det(t(A)); det(A)

# det(2A) = 2^n * det(A) for n=2
det(2 * A); 2^2 * det(A)

# det of upper triangular = product of diagonal
U <- matrix(c(3, 0, 0, 4, 2, 0, 1, 5, 7), nrow = 3, byrow = TRUE)
det(U); prod(diag(U))  # both = 42

실습: 정규방정식

선형 회귀에서 OLS 추정량은 t(X) %*% X %*% beta = t(X) %*% y를 풉니다. 이는 행렬 곱셈을 사용하며, 유일한 해를 보장하기 위해 det(t(X)%*%X) != 0이라는 조건을 사용합니다.

# Generate simple regression data
set.seed(42)
n <- 20
x <- runif(n, 0, 10)
y <- 2 + 3 * x + rnorm(n)

# Design matrix with intercept column
X <- cbind(1, x)

# Check det of X'X (should be nonzero)
XtX <- crossprod(X)  # t(X) %*% X
det(XtX)  # large positive value

# Solve normal equations: beta = solve(X'X) %*% X'y
Xty <- crossprod(X, y)  # t(X) %*% y
beta <- solve(XtX) %*% Xty
beta  # Should be close to c(2, 3)

# Compare with lm()
coef(lm(y ~ x))  # same result

빠른 확인

R의 행렬 연산에 대한 이해도를 확인해 보세요.

복습: 행렬 연산

핵심 요점: 행렬 곱셈에는 %*%를 사용하고 *는 사용하지 마세요. det(A)는 행렬식을 반환하며, 0이면 특이 행렬입니다. sum(diag(A))은 대각합입니다. crossprod(A,B)는 t(A)%*%B를 효율적으로 계산합니다. diag(n)은 단위 행렬을 만들고, diag(v)는 대각 행렬을 만듭니다. 이러한 연산은 회귀, PCA 및 다양한 수치 방법의 기반이 됩니다.

A <- matrix(c(2, 1, 1, 3), nrow = 2)
B <- matrix(c(1, 0, 0, 1), nrow = 2)  # Identity

# Core matrix operations summary:
A %*% B             # matrix multiply -> A
det(A)              # 2*3 - 1*1 = 5
sum(diag(A))        # trace = 2+3 = 5
crossprod(A)        # t(A) %*% A
tcrossprod(A)       # A %*% t(A)
diag(3)             # 3x3 identity
diag(c(1,2,3))      # diagonal matrix
A %o% c(1, 2)       # outer product

자주 묻는 질문

“행렬 곱셈과 행렬식” 강의는 무료인가요?

네 — “행렬 곱셈과 행렬식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“행렬 곱셈과 행렬식”에서 뭘 배우나요?

행렬 곱셈에는 %*%를, 행렬식 계산에는 det()을 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“행렬 곱셈과 행렬식” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 행렬 곱셈과 행렬식
  2. solve()로 연립 선형 방정식 풀기
  3. 고유값과 고유벡터
  4. SVD, QR 및 촐레스키 분해
← R Academy(으)로 돌아가기