矩阵算术与运算
执行逐元素运算和矩阵乘法、加法与减法
矩阵算术与运算 是 CoddyKit 上的免费 R Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
逐元素运算与矩阵运算
R 区分逐元素运算(使用 +、-、*、/)和真正的矩阵运算(使用 %*%)。理解这一差异对于正确进行线性代数运算至关重要。
A <- matrix(c(1,2,3,4), nrow = 2)
B <- matrix(c(5,6,7,8), nrow = 2)
cat('A:
'); print(A)
cat('B:
'); print(B)
# Element-wise multiply
cat('A * B (element-wise):
'); print(A * B)
# Matrix multiply
cat('A %*% B (matrix mult):
'); print(A %*% B)逐元素加法与减法
对具有相同维度的两个矩阵使用 + 和 -,会对对应元素进行加法或减法。这些都是纯粹的逐元素运算。
# Monthly revenue vs target (in thousands)
revenue <- matrix(c(120,135,110,98, 145,160,132,115),
nrow = 2, byrow = TRUE)
target <- matrix(c(130,130,130,130, 150,150,150,150),
nrow = 2, byrow = TRUE)
deviation <- revenue - target
cat('Revenue vs Target deviation:
')
print(deviation)
cat('Above target?:
')
print(revenue >= target)逐元素除法与乘法
同样地,对大小相同的矩阵使用 * 和 /,会逐个元素进行运算。这适用于逐元素缩放、归一化或组合矩阵。
# Scale a matrix by another (element-wise)
prices <- matrix(c(10, 20, 15, 25), nrow = 2)
quantities <- matrix(c(5, 3, 8, 2), nrow = 2)
total_cost <- prices * quantities
cat('Total cost per item:
')
print(total_cost)
# Normalise to row maximum
max_prices <- matrix(rep(apply(prices, 1, max), 2), nrow = 2)
norm_prices <- prices / max_prices
cat('Normalised prices:
')
print(norm_prices)对矩阵进行标量运算
您可以使用标准算术运算符,将标量(单个数字)运算应用于矩阵的每个元素。标量会被循环使用,以匹配矩阵的维度。
m <- matrix(c(10, 20, 30, 40, 50, 60), nrow = 2, ncol = 3)
cat('Original:
'); print(m)
cat('m + 5:
'); print(m + 5)
cat('m * 2:
'); print(m * 2)
cat('m / 10:
'); print(m / 10)
cat('m ^ 2:
'); print(m ^ 2)真正的矩阵乘法 %*%
A %*% B 执行线性代数中的矩阵乘法。要使其正常工作,A 的列数必须等于 B 的行数。结果的维度为 A 的行数 × B 的列数。
# 2x3 times 3x2 = 2x2
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)
cat('A (2x3):
'); print(A)
cat('B (3x2):
'); print(B)
cat('A %*% B (2x2):
'); print(A %*% B)rowSums() 和 colSums()
rowSums(m) 计算每行的总和;colSums(m) 计算每列的总和。如果矩阵具有维度名称,两者都会返回带名称的向量。
sales <- matrix(
c(120,135,110,98, 145,160,132,115, 88,95,102,78),
nrow = 3, byrow = TRUE,
dimnames = list(c('Q1','Q2','Q3'), c('Jan','Feb','Mar','Apr'))
)
cat('Sales matrix:
'); print(sales)
cat('Quarterly totals:', rowSums(sales), '
')
cat('Monthly totals: ', colSums(sales), '
')rowMeans() 和 colMeans()
rowMeans(m) 和 colMeans(m) 分别返回每行和每列的平均值。对于这一常见任务,它们比使用 apply() 应用 mean() 更快。
exam_scores <- matrix(
c(88,92,75,81, 79,85,90,73, 95,78,82,88),
nrow = 3, byrow = TRUE,
dimnames = list(c('Alice','Bob','Carol'), c('Math','Sci','Eng','Hist'))
)
cat('Student averages:
')
print(rowMeans(exam_scores))
cat('Subject averages:
')
print(colMeans(exam_scores))矩阵上的比较运算
应用于矩阵的比较运算符(==、>、<= 等)会返回一个维度相同的逻辑矩阵。随后,您可以使用这个掩码进行子集提取或计数。
scores <- matrix(c(88,45,92,61,73,55,84,79), nrow = 2)
cat('Scores:
'); print(scores)
# Which elements pass?
passing_mask <- scores >= 60
cat('Passing mask:
'); print(passing_mask)
cat('Number passing:', sum(passing_mask), '
')
cat('Passing scores:', scores[passing_mask], '
')使用 apply() 执行自定义行列运算
apply(m, MARGIN, FUN) 将函数应用于行(MARGIN=1)或列(MARGIN=2)。当您需要 rowSums/colMeans 之外的自定义聚合时,可以使用它。
m <- matrix(c(3,1,4,1,5,9,2,6,5,3,5,8), nrow = 3)
cat('Matrix:
'); print(m)
# Max of each row
cat('Row max: ', apply(m, 1, max), '
')
# Range of each column
cat('Col range:
')
print(apply(m, 2, range))
# Custom: count values > 4 per row
cat('Values > 4 per row:', apply(m, 1, function(x) sum(x > 4)), '
')将向量广播到各行
将向量与矩阵相加或相乘时,R 会循环使用该向量,使其长度与矩阵匹配。循环按列进行;如果您想进行按行运算,可能会得到意外结果。
m <- matrix(c(10,20,30, 40,50,60), nrow = 2)
cat('Matrix:
'); print(m)
# Add a 3-element vector: R recycles column-by-column
v <- c(1, 2, 3)
cat('m + c(1,2,3):
'); print(m + v)
# For row-wise scaling, use sweep()
row_weights <- c(0.5, 2.0) # scale row 1 by 0.5, row 2 by 2
cat('Row-wise scaled:
'); print(sweep(m, 1, row_weights, '*'))算术运算总结
R 中矩阵运算的主要函数:
+、-、*、/— 逐元素算术运算%*%— 矩阵乘法(线性代数)rowSums()、colSums()— 行列总和rowMeans()、colMeans()— 行列平均值apply(m, 1, fn)/apply(m, 2, fn)— 自定义行列聚合sweep()— 使用向量执行按行或按列的运算
m <- matrix(c(4,9,16,25), nrow = 2)
cat('Original:
'); print(m)
cat('sqrt (element-wise):
'); print(sqrt(m))
cat('rowSums:', rowSums(m), '
')
cat('colMeans:', colMeans(m), '
')快速检查
在 R 中,当 A 和 B 是 2x2 矩阵时,A * B 计算什么?
回顾:矩阵算术
做得很好!本课的要点如下:
- 矩阵上的
+、-、*、/都是逐元素运算 %*%是真正的矩阵乘法(行 × 列)rowSums()、colSums()、rowMeans()、colMeans()可对行或列进行聚合- 比较运算符会返回形状相同的逻辑矩阵
apply(m, 1, fn)按行应用函数;apply(m, 2, fn)按列应用函数- 使用
sweep()执行向量化的行列缩放
# Final: compute grade curve (add 5 to all scores, cap at 100)
raw <- matrix(c(88,55,92,73,60,45,78,95), nrow = 2)
curved <- pmin(raw + 5, 100) # pmin applies min element-wise
cat('Raw:
'); print(raw)
cat('Curved:
'); print(curved)用 AI 导师学习 R — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 43
- 课程
- 159
常见问题解答
「矩阵算术与运算」课时是免费的吗?
是的 — 「矩阵算术与运算」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「矩阵算术与运算」这节课中我会学到什么?
执行逐元素运算和矩阵乘法、加法与减法 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「矩阵算术与运算」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。