矩阵运算
本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 20 课,共 64 课。
矩阵与数字之间,或两个大小相同的矩阵之间的算术运算会逐个单元格进行:
a <- matrix(1:4, nrow = 2, byrow = TRUE)
b <- matrix(c(10, 20, 30, 40), nrow = 2, byrow = TRUE)
print(a * 2)
print(a + b)输出:
[,1] [,2]
[1,] 2 4
[2,] 6 8
[,1] [,2]
[1,] 11 22
[2,] 33 44比较也会逐个单元格进行,并返回逻辑矩阵。你可以用它来统计单元格数量,也可以将它用作索引,只更改单元格匹配的值:
m <- matrix(c(4, 12, 7, 15), nrow = 2, byrow = TRUE)
print(sum(m > 10))
m[m > 10] <- 10
print(m)输出:
[1] 2
[,1] [,2]
[1,] 4 10
[2,] 7 10t(m) 会交换行和列。%*% 是矩阵乘积,其中每个结果单元格都由第一个矩阵的一行和第二个矩阵的一列计算得出,因此 ncol(a) 必须等于 nrow(b):
a <- matrix(1:4, nrow = 2, byrow = TRUE)
print(t(a))
print(a %*% a)输出:
[,1] [,2]
[1,] 1 3
[2,] 2 4
[,1] [,2]
[1,] 7 10
[2,] 15 22不同大小的矩阵进行逐元素算术运算时,会因 non-conformable arrays 错误而停止,因此要先比较 dim()。矩阵乘积有自己的尺寸规则:
a <- matrix(1:4, nrow = 2)
b <- matrix(1:6, nrow = 2)
print(identical(dim(a), dim(b)))
print(dim(a %*% b))输出:
[1] FALSE
[1] 2 3挑战
简单完成 cap_values(m, limit)。返回两行:Over: 后面是大于 limit 的单元格数量,然后是 Total: ,后面是将所有大于 limit 的值替换为 limit 后的矩阵总和。
提供的代码会从一行输入中读取矩阵:行之间用 ; 分隔,每行中的值用 , 分隔,因此 1,2;3,4 表示一个矩阵,其两行为 1 2 和 3 4。下一行包含 limit。代码会打印返回的每一行。
亲手试试
cap_values <- function(m, limit) {
# 在这里编写你的代码
c("Over: 0", "Total: 0")
}
# 提供的输入和输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
parse_matrix <- function(line) {
rows <- strsplit(line, ";")[[1]]
matrix(as.numeric(unlist(strsplit(rows, ","))), nrow = length(rows), byrow = TRUE)
}
cat(cap_values(parse_matrix(input[1]), as.numeric(input[2])), sep = "\n")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器