矩阵乘法与行列式
使用 %*% 进行矩阵乘法,并使用 det() 计算行列式
矩阵乘法与行列式 是 CoddyKit 上的免费 R Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
在 R 中创建矩阵
矩阵是二维数组,默认按列填充。请使用 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 elsecrossprod() 与 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 单位矩阵。diag(v)(其中 v 是向量)创建一个对角线为 v 的对角矩阵。diag(A)(其中 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) 返回行列式——值为零表示矩阵是奇异的。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常见问题解答
「矩阵乘法与行列式」课时是免费的吗?
是的 — 「矩阵乘法与行列式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「矩阵乘法与行列式」这节课中我会学到什么?
使用 %*% 进行矩阵乘法,并使用 det() 计算行列式 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「矩阵乘法与行列式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。