Phép toán ma trận
Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 20 trên 64.
Phép tính số học giữa một ma trận và một số, hoặc giữa hai ma trận cùng kích thước, được thực hiện trên từng ô:
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)Đầu ra:
[,1] [,2]
[1,] 2 4
[2,] 6 8
[,1] [,2]
[1,] 11 22
[2,] 33 44Phép so sánh cũng áp dụng cho từng ô và trả về một ma trận logic. Dùng phép so sánh này để đếm số ô hoặc làm chỉ số để chỉ thay đổi các ô khớp:
m <- matrix(c(4, 12, 7, 15), nrow = 2, byrow = TRUE)
print(sum(m > 10))
m[m > 10] <- 10
print(m)Đầu ra:
[1] 2
[,1] [,2]
[1,] 4 10
[2,] 7 10t(m) hoán đổi các hàng và cột. %*% là phép nhân ma trận, trong đó mỗi ô kết quả kết hợp một hàng của ma trận thứ nhất với một cột của ma trận thứ hai, vì vậy ncol(a) phải bằng nrow(b):
a <- matrix(1:4, nrow = 2, byrow = TRUE)
print(t(a))
print(a %*% a)Đầu ra:
[,1] [,2]
[1,] 1 3
[2,] 2 4
[,1] [,2]
[1,] 7 10
[2,] 15 22Phép tính số học theo từng ô giữa các ma trận có kích thước khác nhau sẽ dừng lại với lỗi non-conformable arrays, vì vậy hãy so sánh dim() trước. Tích ma trận có quy tắc kích thước riêng:
a <- matrix(1:4, nrow = 2)
b <- matrix(1:6, nrow = 2)
print(identical(dim(a), dim(b)))
print(dim(a %*% b))Đầu ra:
[1] FALSE
[1] 2 3Thử thách
DễHoàn thiện cap_values(m, limit). Trả về hai dòng: Over: kèm số ô có giá trị lớn hơn limit, sau đó là Total: kèm tổng của ma trận sau khi mọi giá trị lớn hơn limit được thay bằng limit.
Code được cung cấp đọc ma trận từ một dòng: các hàng được phân tách bằng ;, còn các giá trị trong một hàng được phân tách bằng ,, vì vậy 1,2;3,4 là ma trận có các hàng 1 2 và 3 4. Dòng tiếp theo chứa limit. Code in ra từng dòng được trả về.
Tự làm thử
cap_values <- function(m, limit) {
# Viết code của bạn ở đây
c("Over: 0", "Total: 0")
}
# Đoạn code đầu vào và đầu ra đã được cung cấp: giữ nguyên
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")
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Chuỗi chuyên sâu
Chuỗi con với substr()Định dạng với sprintf()Tách và nối chuỗiTìm kiếm trong chuỗiThay thế văn bảnÔn tập: Tạo tên người dùng10Luồng điều khiển nâng cao
Hàm switch()ifelse() dạng vector hóarepeat và breakHàm đệ quyÔn tập: phân loại điểmTự luyện tập: Trình biên dịch R online