Mnożenie macierzy i wyznaczniki
Używaj %*% do mnożenia macierzy i det() do obliczania wyznacznika.
Mnożenie macierzy i wyznaczniki to bezpłatna lekcja R Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Tworzenie macierzy w R
Macierze są tablicami dwuwymiarowymi, które domyślnie są wypełniane kolumnami. Użyj matrix(data, nrow, ncol). Nazwy wierszy i kolumn możesz nadać za pomocą rownames() i colnames().
# Create a 3x3 matrix (filled column-wise)
A <- matrix(c(1, 2, 3,
4, 5, 6,
7, 8, 9), nrow = 3, ncol = 3, byrow = TRUE)
print(A)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# [3,] 7 8 9
dim(A) # 3 3
nrow(A) # 3
ncol(A) # 3Mnożenie macierzy: %*%
Operator %*% wykonuje prawdziwe mnożenie macierzy (iloczyn skalarny wierszy i kolumn). Operator * działa element po elemencie — pomylenie tych operatorów jest częstym błędem. Wymiary muszą być zgodne: (m×n) %*% (n×p) = (m×p).
A <- matrix(c(1, 2, 3, 4), nrow = 2)
B <- matrix(c(5, 6, 7, 8), nrow = 2)
# Element-wise multiplication (NOT matrix mult)
A * B
# [,1] [,2]
# [1,] 5 21
# [2,] 12 32
# True matrix multiplication
A %*% B
# [,1] [,2]
# [1,] 19 43
# [2,] 22 50
# Verify: entry [1,1] = 1*5 + 2*6 = 17... wait:
# A[1,] = c(1,3), B[,1] = c(5,6): 1*5 + 3*6 = 23Zrozumienie wyników %*%
Zweryfikujmy ręcznie mnożenie macierzy. Element (i,j) macierzy C = A %*% B jest iloczynem skalarnym i-tego wiersza A oraz j-tej kolumny B: sum(A[i,] * B[,j]).
A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, byrow = TRUE)
B <- matrix(c(7, 8, 9, 10, 11, 12), nrow = 3, byrow = TRUE)
# A is 2x3, B is 3x2 -> result is 2x2
C <- A %*% B
print(C)
# Verify entry C[1,1]:
# row 1 of A: c(1,2,3), col 1 of B: c(7,9,11)
manual_11 <- sum(A[1, ] * B[, 1])
manual_11 # 1*7 + 2*9 + 3*11 = 58
C[1, 1] # should matchWyznacznik: det()
Wyznacznik jest wartością skalarną opisującą współczynnik skali macierzy. Funkcja det(A) go oblicza. Jeśli det(A) == 0, macierz jest osobliwa (nieodwracalna). Dla macierzy 2×2: det = ad - bc.
# 2x2 matrix: det = a*d - b*c
A <- matrix(c(3, 2, 1, 4), nrow = 2)
det(A) # 3*4 - 2*1 = 10
# Singular matrix: det = 0
S <- matrix(c(1, 2, 2, 4), nrow = 2)
det(S) # 0 -> not invertible
# Larger matrix
B <- matrix(c(2, -1, 0,
-1, 2, -1,
0, -1, 2), nrow = 3, byrow = TRUE)
det(B) # 4Ślad: sum(diag())
Ślad macierzy to suma jej elementów na przekątnej. R nie ma wbudowanej funkcji trace() przeznaczonej do macierzy (jest to inna funkcja), dlatego użyj sum(diag(A)). Ślad jest równy sumie wartości własnych.
A <- matrix(c(4, 2, 1,
3, 5, 0,
2, 1, 6), nrow = 3, byrow = TRUE)
# Extract diagonal elements
diag(A) # c(4, 5, 6)
# Trace = sum of diagonal
trace_A <- sum(diag(A))
trace_A # 15
# Trace = sum of eigenvalues (verify)
eigs <- eigen(A)$values
sum(Re(eigs)) # should also be approximately 15
# trace() in base R is NOT the matrix trace:
# trace(A) # this does something elsecrossprod() i tcrossprod()
crossprod(A, B) wydajnie oblicza t(A) %*% B — iloczyn krzyżowy. tcrossprod(A, B) oblicza A %*% t(B). Funkcje te są szybsze niż jawna transpozycja, ponieważ nie tworzą transponowanej macierzy.
A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3)
B <- matrix(c(7, 8, 9, 10, 11, 12), nrow = 3)
# t(A) %*% B (the slow way)
result1 <- t(A) %*% B
# crossprod(A, B) = t(A) %*% B (faster)
result2 <- crossprod(A, B)
all.equal(result1, result2) # TRUE
# crossprod(A) = t(A) %*% A
ATA <- crossprod(A)
print(ATA)
# tcrossprod(A, B) = A %*% t(B)
result3 <- tcrossprod(A, B)
all.equal(A %*% t(B), result3) # TRUEMacierz jednostkowa za pomocą diag()
diag(n) tworzy macierz jednostkową n×n. diag(v), gdzie v jest wektorem, tworzy macierz diagonalną z wartościami v na przekątnej. diag(A), gdzie A jest macierzą, wyodrębnia przekątną.
# 3x3 identity matrix
I3 <- diag(3)
print(I3)
# [,1] [,2] [,3]
# [1,] 1 0 0
# [2,] 0 1 0
# [3,] 0 0 1
# A * I = A (identity property)
A <- matrix(c(2, 3, 4, 5), nrow = 2)
all.equal(A %*% diag(2), A) # TRUE
# Create diagonal matrix from vector
D <- diag(c(2, 5, 10))
print(D)
det(D) # Product of diagonal: 100Potęgowanie macierzy i wielokrotne mnożenie
R nie ma wbudowanego operatora potęgowania macierzy, ale można go napisać, używając %*% w pętli, lub skorzystać z pakietu expm. Kwadrat macierzy A² = A %*% A jest częstą operacją.
# Matrix square
A <- matrix(c(1, 1, 1, 0), nrow = 2)
A_sq <- A %*% A
print(A_sq)
# Fibonacci connection: A^n gives Fib numbers!
# Simple matrix power function
mat_pow <- function(M, n) {
result <- diag(nrow(M)) # start with identity
for (i in seq_len(n)) result <- result %*% M
result
}
mat_pow(A, 5) # A to the 5th power
# [1,] 8 5
# [2,] 5 3Iloczyn zewnętrzny za pomocą %o%
Iloczyn zewnętrzny x %o% y tworzy macierz, w której element (i,j) = x[i] * y[j]. Jest równoważny wywołaniu outer(x, y). Przydaje się do tworzenia macierzy interakcji i niektórych konstrukcji matematycznych.
x <- c(1, 2, 3)
y <- c(10, 20)
# Outer product: 3x2 matrix
P <- x %o% y
print(P)
# [,1] [,2]
# [1,] 10 20
# [2,] 20 40
# [3,] 30 60
# Same as outer(x, y)
identical(P, outer(x, y)) # TRUE
# Outer with custom function
outer(1:3, 1:3, FUN = '+')
# [,1] [,2] [,3]
# [1,] 2 3 4
# [2,] 3 4 5
# [3,] 4 5 6Własności wyznacznika
Najważniejsze własności: det(A %*% B) = det(A) * det(B); det(t(A)) = det(A); det(k*A) = k^n * det(A) dla macierzy n×n; operacje na wierszach zmieniają wyznacznik w przewidywalny sposób.
A <- matrix(c(2, 1, 5, 3), nrow = 2)
B <- matrix(c(4, 2, 1, 6), nrow = 2)
# det(A %*% B) = det(A) * det(B)
det(A %*% B)
det(A) * det(B)
# det(t(A)) = det(A)
det(t(A)); det(A)
# det(2A) = 2^n * det(A) for n=2
det(2 * A); 2^2 * det(A)
# det of upper triangular = product of diagonal
U <- matrix(c(3, 0, 0, 4, 2, 0, 1, 5, 7), nrow = 3, byrow = TRUE)
det(U); prod(diag(U)) # both = 42W praktyce: równania normalne
W regresji liniowej estymator OLS spełnia równanie t(X) %*% X %*% beta = t(X) %*% y. Wykorzystuje ono mnożenie macierzy oraz warunek det(t(X)%*%X) != 0, który zapewnia jednoznaczne rozwiązanie.
# Generate simple regression data
set.seed(42)
n <- 20
x <- runif(n, 0, 10)
y <- 2 + 3 * x + rnorm(n)
# Design matrix with intercept column
X <- cbind(1, x)
# Check det of X'X (should be nonzero)
XtX <- crossprod(X) # t(X) %*% X
det(XtX) # large positive value
# Solve normal equations: beta = solve(X'X) %*% X'y
Xty <- crossprod(X, y) # t(X) %*% y
beta <- solve(XtX) %*% Xty
beta # Should be close to c(2, 3)
# Compare with lm()
coef(lm(y ~ x)) # same resultSzybkie sprawdzenie
Sprawdź swoją znajomość operacji na macierzach w R.
Podsumowanie: operacje na macierzach
Najważniejsze informacje: Do mnożenia macierzy używaj %*%, a nie *. det(A) zwraca wyznacznik — wartość zero oznacza macierz osobliwą. sum(diag(A)) to ślad macierzy. crossprod(A,B) wydajnie oblicza t(A)%*%B. diag(n) tworzy macierz jednostkową, a diag(v) — macierz diagonalną. Operacje te stanowią podstawę regresji, PCA i wielu metod numerycznych.
A <- matrix(c(2, 1, 1, 3), nrow = 2)
B <- matrix(c(1, 0, 0, 1), nrow = 2) # Identity
# Core matrix operations summary:
A %*% B # matrix multiply -> A
det(A) # 2*3 - 1*1 = 5
sum(diag(A)) # trace = 2+3 = 5
crossprod(A) # t(A) %*% A
tcrossprod(A) # A %*% t(A)
diag(3) # 3x3 identity
diag(c(1,2,3)) # diagonal matrix
A %o% c(1, 2) # outer productUcz się R dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 43
- Lekcje
- 159
Często zadawane pytania
Czy lekcja „Mnożenie macierzy i wyznaczniki” jest bezpłatna?
Tak — pełny tekst „Mnożenie macierzy i wyznaczniki” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Mnożenie macierzy i wyznaczniki”?
Używaj %*% do mnożenia macierzy i det() do obliczania wyznacznika. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Mnożenie macierzy i wyznaczniki”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Mnożenie macierzy i wyznaczniki
- Rozwiązywanie układów równań liniowych za pomocą solve()
- Wartości własne i wektory własne
- Rozkłady SVD, QR i Cholesky’ego