Aritmética de matrices
Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 20 de 64.
La aritmética entre una matriz y un número, o entre dos matrices del mismo tamaño, funciona celda por celda:
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)Salida:
[,1] [,2]
[1,] 2 4
[2,] 6 8
[,1] [,2]
[1,] 11 22
[2,] 33 44Una comparación también funciona celda por celda y devuelve una matriz lógica. Úsala para contar celdas o como índice para cambiar únicamente las celdas coincidentes:
m <- matrix(c(4, 12, 7, 15), nrow = 2, byrow = TRUE)
print(sum(m > 10))
m[m > 10] <- 10
print(m)Salida:
[1] 2
[,1] [,2]
[1,] 4 10
[2,] 7 10t(m) intercambia las filas y las columnas. %*% es el producto de matrices, donde cada celda del resultado combina una fila de la primera matriz con una columna de la segunda, por lo que ncol(a) debe ser igual a nrow(b):
a <- matrix(1:4, nrow = 2, byrow = TRUE)
print(t(a))
print(a %*% a)Salida:
[,1] [,2]
[1,] 1 3
[2,] 2 4
[,1] [,2]
[1,] 7 10
[2,] 15 22La aritmética celda por celda entre matrices de distintos tamaños se detiene con el error non-conformable arrays, así que compara primero dim(). El producto de matrices tiene su propia regla de tamaño:
a <- matrix(1:4, nrow = 2)
b <- matrix(1:6, nrow = 2)
print(identical(dim(a), dim(b)))
print(dim(a %*% b))Salida:
[1] FALSE
[1] 2 3Desafío
FácilCompleta cap_values(m, limit). Devuelve dos líneas: Over: con el número de celdas superiores a limit, después Total: con la suma de la matriz después de reemplazar por limit cada valor superior a limit.
El código proporcionado lee una matriz de una línea: las filas están separadas por ; y los valores de una fila por ,, por lo que 1,2;3,4 es una matriz con las filas 1 2 y 3 4. La siguiente línea contiene limit. El código imprime cada línea devuelta.
Pruébalo tú mismo
cap_values <- function(m, limit) {
# Escribe tu código aquí
c("Over: 0", "Total: 0")
}
# Código de entrada/salida suministrado: mantenlo tal 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 lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Cadenas a fondo
Subcadenas con substr()Formateo con sprintf()Dividir y unirBuscar cadenasReemplazar textoRepaso - Constructor de nombres de usuario4Matrices
Creación de matricesIndexación de matricesResúmenes de filas y columnasAritmética de matricesRepaso: tabla de asientos2Búsquedas clave-valor
Búsquedas en vectores con nombreComprobar clavesAñadir y eliminar clavesRecorrer nombresRepaso: panel bursátil5Proyecto - Libro de calificaciones
Añadir estudiantesRegistrar calificaciones3Conjuntos y conteo
Valores únicosOperaciones con conjuntosPruebas de pertenenciaConteo con table()Repaso: invitados al evento6Funciones como valores
Funciones anónimasPasar funcionesDevolver funcionesClausuras con estadoRepaso: reglas de descuento9Marcos de datos
Creación de marcos de datosColumnas y filasFiltrado de filasAdición y ordenaciónRepaso - Informe de ventas12Proyecto: Rastreador de gastos
Registro de gastosGasto totalPractica por tu cuenta: Compilador de R online