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 44Poró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 10t(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 22Operacje 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 3Wyzwanie
ŁatwyUzupeł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")
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
1Łańcuchy znaków w szczegółach
Podciągi za pomocą substr()Formatowanie za pomocą sprintf()Dzielenie i łączenieWyszukiwanie w łańcuchach znakówZastępowanie tekstuPowtórka – kreator nazwy użytkownika4Macierze
Tworzenie macierzyIndeksowanie macierzyPodsumowania wierszy i kolumnDziałania na macierzachPowtórka – plan miejsc10Zaawansowane sterowanie przepływem
Funkcja switch()Wektorowe ifelse()repeat i breakFunkcje rekurencyjnePodsumowanie — klasyfikator ocen2Wyszukiwanie wartości po kluczach
Wyszukiwanie nazwanych elementów wektoraSprawdzanie kluczyDodawanie i usuwanie kluczyIterowanie po nazwachPowtórzenie — giełda5Projekt — dziennik ocen
Dodawanie uczniówZapisywanie ocen3Zbiory i zliczanie
Unikalne wartościOperacje na zbiorachTesty przynależnościZliczanie za pomocą table()Podsumowanie — goście wydarzenia6Funkcje jako wartości
Funkcje anonimowePrzekazywanie funkcjiZwracanie funkcjiDomknięcia ze stanemPowtórka — reguły rabatowe9Ramki danych
Tworzenie ramek danychKolumny i wierszeFiltrowanie wierszyDodawanie i sortowaniePodsumowanie – raport sprzedaży12Projekt – śledzenie wydatków
Rejestrowanie wydatkówŁączne wydatkiPoćwicz samodzielnie: Kompilator R online