Aritmética de Matrizes
Parte da seção Lógica e Fluxo do Journey de R da Coddy. Lição 20 de 64.
A aritmética entre uma matriz e um número, ou entre duas matrizes do mesmo tamanho, funciona célula por célula:
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)Saída:
[,1] [,2]
[1,] 2 4
[2,] 6 8
[,1] [,2]
[1,] 11 22
[2,] 33 44Uma comparação também funciona célula por célula e retorna uma matriz lógica. Use-a para contar células ou como um índice para alterar apenas as células correspondentes:
m <- matrix(c(4, 12, 7, 15), nrow = 2, byrow = TRUE)
print(sum(m > 10))
m[m > 10] <- 10
print(m)Saída:
[1] 2
[,1] [,2]
[1,] 4 10
[2,] 7 10t(m) troca linhas e colunas. %*% é o produto de matrizes, em que cada célula do resultado combina uma linha da primeira matriz com uma coluna da segunda; portanto, ncol(a) deve ser igual a nrow(b):
a <- matrix(1:4, nrow = 2, byrow = TRUE)
print(t(a))
print(a %*% a)Saída:
[,1] [,2]
[1,] 1 3
[2,] 2 4
[,1] [,2]
[1,] 7 10
[2,] 15 22A aritmética célula a célula entre matrizes de tamanhos diferentes é interrompida com o erro non-conformable arrays, portanto compare dim() primeiro. O produto de matrizes tem sua própria regra de tamanho:
a <- matrix(1:4, nrow = 2)
b <- matrix(1:6, nrow = 2)
print(identical(dim(a), dim(b)))
print(dim(a %*% b))Saída:
[1] FALSE
[1] 2 3Desafio
FácilComplete cap_values(m, limit). Retorne duas linhas: Over: com o número de células acima de limit e, em seguida, Total: com a soma da matriz depois que todo valor acima de limit for substituído por limit.
O código fornecido lê uma matriz de uma linha: as linhas são separadas por ; e os valores de uma linha por ,, portanto 1,2;3,4 é uma matriz com as linhas 1 2 e 3 4. A linha seguinte contém limit. O código imprime cada linha retornada.
Experimente você mesmo
cap_values <- function(m, limit) {
# Escreva seu código aqui
c("Over: 0", "Total: 0")
}
# Código de entrada/saída fornecido: mantenha-o como está
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")
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings em Profundidade
Substrings com substr()Formatação com sprintf()Dividindo e UnindoPesquisando StringsSubstituindo TextoRecapitulação - Criador de Nome de Usuário4Matrizes
Criando MatrizesIndexando MatrizesResumos de Linhas e ColunasAritmética de MatrizesRecapitulação - Tabela de Assentos10Fluxo de Controle Avançado
A Função switch()ifelse() Vetorizadorepeat e breakFunções RecursivasRevisão — Classificador de Notas2Consultas de Chave-Valor
Consultas em Vetores NomeadosVerificando ChavesAdicionando e Removendo ChavesPercorrendo NomesRecapitulação - Mesa de Ações5Projeto - Boletim de Notas
Adicionando AlunosRegistrando Notas3Conjuntos e Contagem
Valores ÚnicosOperações com ConjuntosTestes de PertinênciaContagem com table()Recapitulação - Convidados do Evento6Funções como Valores
Funções AnônimasPassando FunçõesRetornando FunçõesClosures com EstadoRecapitulação - Regras de Desconto9Data Frames
Criando Data FramesColunas e LinhasFiltrando LinhasAdicionando e OrdenandoRecapitulação - Relatório de Vendas12Projeto - Rastreador de Despesas
Registro de DespesasGastos TotaisPratique por conta própria: Compilador de R online