Menu
Coddy logo textTech

Działania na macierzach

Część sekcji Logika i przepływ sterowania ścieżki R w Coddy. Lekcja 20 z 64.

Działania arytmetyczne między macierzą a liczbą lub między dwiema macierzami o takich samych rozmiarach odbywają się komórka po komórce:

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)

Wynik:

     [,1] [,2]
[1,]    2    4
[2,]    6    8
     [,1] [,2]
[1,]   11   22
[2,]   33   44

Porównanie działa również komórka po komórce i zwraca macierz logiczną. Użyj go, aby policzyć komórki lub jako indeks, by zmienić tylko pasujące komórki:

m <- matrix(c(4, 12, 7, 15), nrow = 2, byrow = TRUE)
print(sum(m > 10))
m[m > 10] <- 10
print(m)

Wynik:

[1] 2
     [,1] [,2]
[1,]    4   10
[2,]    7   10

t(m) zamienia wiersze i kolumny. %*% to iloczyn macierzy, w którym każda komórka wyniku łączy wiersz pierwszej macierzy z kolumną drugiej, dlatego ncol(a) musi być równe nrow(b):

a <- matrix(1:4, nrow = 2, byrow = TRUE)
print(t(a))
print(a %*% a)

Wynik:

     [,1] [,2]
[1,]    1    3
[2,]    2    4
     [,1] [,2]
[1,]    7   10
[2,]   15   22

Operacje arytmetyczne element po elemencie na macierzach o różnych rozmiarach kończą się błędem non-conformable arrays, dlatego najpierw porównaj dim(). Iloczyn macierzy ma własną regułę dotyczącą rozmiarów:

a <- matrix(1:4, nrow = 2)
b <- matrix(1:6, nrow = 2)
print(identical(dim(a), dim(b)))
print(dim(a %*% b))

Wynik:

[1] FALSE
[1] 2 3
challenge icon

Wyzwanie

Łatwy

Uzupełnij cap_values(m, limit). Zwróć dwa wiersze: Over: z liczbą komórek o wartościach większych niż limit, a następnie Total: z sumą macierzy po zastąpieniu każdej wartości większej niż limit wartością limit.

Dostarczony kod odczytuje macierz z jednego wiersza: wiersze są oddzielone znakiem ;, a wartości w wierszu znakiem ,, więc 1,2;3,4 to macierz z wierszami 1 2 i 3 4. Następny wiersz zawiera limit. Kod wypisuje każdy zwrócony wiersz.

Spróbuj swoich sił

cap_values <- function(m, limit) {
  # Wpisz tutaj swój kod
  c("Over: 0", "Total: 0")
}

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator R online