Арифметика матриц
Часть раздела Логика и потоки выполнения путешествия по 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 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")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки углублённо
Подстроки с substr()Форматирование с sprintf()Разделение и объединениеПоиск в строкахЗамена текстаПовторение — создание имени пользователя4Матрицы
Создание матрицИндексация матрицСводные данные по строкам и столбцамАрифметика матрицПовторение — схема рассадки7Семейство Apply
lapply и sapplyMap и mapplyFilter и FindReduceПовторение — конвейер обработки данных10Продвинутые конструкции управления
Функция switch()Векторизованный ifelse()repeat и breakРекурсивные функцииПовторение — классификатор оценок2Поиск по ключам и значениям
Поиск в именованных векторахПроверка ключейДобавление и удаление ключейПеребор имёнПовторение — биржа акций5Проект — Журнал оценок
Добавление учениковВыставление оценок3Множества и подсчёт
Уникальные значенияОперации с множествамиПроверка принадлежностиПодсчёт с помощью table()Повторение — гости мероприятия6Функции как значения
Анонимные функцииПередача функцийВозврат функцийЗамыкания с состояниемПовторение — правила скидок9Таблицы данных
Создание таблиц данныхСтолбцы и строкиФильтрация строкДобавление и сортировкаПовторение — отчёт о продажах12Проект — Трекер расходов
Запись расходовОбщие расходыПотренируйтесь самостоятельно: Онлайн-компилятор R