Menu
Coddy logo textTech

Арифметика матриц

Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 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   10

t(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
challenge icon

Задание

Легко

Завершите 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")
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор R