Operace s maticemi v programu R © TGU 2022 1 Operace matic v programu R R je open-source statistický programovací balíček, který obsahuje mnohé operátory vektorů a matic. Matice # maticová funkce # R zadává data vložená po sloupcích začínajících sloupcem jedna # 1. arg: c(2,3,-2,1,2,2) hodnoty prvků vyplňující sloupce # 2. arg: 3 počet řádků (rows) # 3. arg: 2 počet sloupců (columns) A <- matrix(c(2,3,-2,1,2,2),3,2) A <- matrix(c(2,3,-2,1,2,2), nrow=3, ncol=2) A [,1] [,2] [1,] 2 1 [2,] 3 2 [3,] -2 2 Je to matice? is.matrix(A) [1] TRUE is.vector(A) [1] FALSE Násobení skalárem c <- 3 c*A [,1] [,2] [1,] 6 3 [2,] 9 6 [3,] -6 6 Sčítání a odečítání matic B <- matrix(c(1,4,-2,1,2,1),3,2) B [,1] [,2] [1,] 1 1 [2,] 4 2 [3,] -2 1 C <- A + B C [,1] [,2] [1,] 3 2 [2,] 7 4 [3,] -4 3 Operace s maticemi v programu R © TGU 2022 2 D <- A - B D [,1] [,2] [1,] 1 0 [2,] -1 0 [3,] 0 1 Násobení matic %*% D <- matrix(c(2,-2,1,2,3,1),2,3) D [,1] [,2] [,3] [1,] 2 1 3 [2,] -2 2 1 C <- D %*% A C [,1] [,2] [1,] 1 10 [2,] 0 4 C <- A %*% D C [,1] [,2] [,3] [1,] 2 4 7 [2,] 2 7 11 [3,] -8 2 -4 D <- matrix(c(2,1,3),1,3) D [,1] [,2] [,3] [1,] 2 1 3 C <- D %*% A C [,1] [,2] [1,] 1 10 C <- A %*% D Chyba v A %*% D : nekonformní k násobení Transpozice matic AT <- t(A) AT [,1] [,2] [,3] [1,] 2 3 -2 [2,] 1 2 2 ATT <- t(AT) >ATT [,1] [,2] [1,] 2 1 [2,] 3 2 [3,] -2 2 Jedničkový vektor U <- matrix(1,3,1) U [,1] [1,] 1 [2,] 1 [3,] 1 Operace s maticemi v programu R © TGU 2022 3 Jedničková matice U <- matrix(1,3,2) U [,1] [,2] [1,] 1 1 [2,] 1 1 [3,] 1 1 Diagonální matice S <- matrix(c(2,3,-2,1,2,2,4,2,3),3,3) S [,1] [,2] [,3] [1,] 2 1 4 [2,] 3 2 2 [3,] -2 2 3 D <- diag(S) D [1] 2 2 3 D <- diag(diag(S)) D [,1] [,2] [,3] [1,] 2 0 0 [2,] 0 2 0 [3,] 0 0 3 Jednotková (identická) matice I <- diag(c(1,1,1)) id = function(n) diag(c(1),nrow=n,ncol=n) I = id(3) I [,1] [,2] [,3] [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1 id = function(n) diag(c(1),nrow=n,ncol=n) I3 = id(3) Symetrická matice C <- matrix(c(2,1,5,1,3,4,5,4,-2),3,3) C [,1] [,2] [,3] [1,] 2 1 5 [2,] 1 3 4 [3,] 5 4 -2 CT <- t(C) CT [,1] [,2] [,3] [1,] 2 1 5 [2,] 1 3 4 [3,] 5 4 -2 Operace s maticemi v programu R © TGU 2022 4 Inverze matice A <- matrix(c(4,4,-2,2,6,2,2,8,4),3,3) A [,1] [,2] [,3] [1,] 4 2 2 [2,] 4 6 8 [3,] -2 2 4 AI <- solve(A) AI [,1] [,2] [,3] [1,] 1.0 -0.5 0.5 [2,] -4.0 2.5 -3.0 [3,] 2.5 -1.5 2.0 A %*% AI [,1] [,2] [,3] [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1 AI %*% A [,1] [,2] [,3] [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1 Inverze & determinant matice C <- matrix(c(2,1,6,1,3,4,6,4,-2),3,3) C [,1] [,2] [,3] [1,] 2 1 6 [2,] 1 3 4 [3,] 6 4 -2 CI <- solve(C) CI [,1] [,2] [,3] [1,] 0.2156863 -0.25490196 0.13725490 [2,] -0.2549020 0.39215686 0.01960784 [3,] 0.1372549 0.01960784 -0.04901961 d <- det(C) d [1] -102 Počet řádků & sloupců X <- matrix(c(3,2,4,3,2,-2,6,1),4,2) X [,1] [,2] [1,] 3 2 [2,] 2 -2 [3,] 4 6 [4,] 3 1 Operace s maticemi v programu R © TGU 2022 5 dim(X) [1] 4 2 r <- nrow(X) r [1] 4 c <- ncol(X) c [1] 2 Stopa matice trA = sum(diag(A)) Výběr řádku H[1, ] * výběr 1. řádku [1] 5 2 1 Výběr sloupce H[, 2] * výběr 2. sloupce [1] 1 1 2 2 6 Výpočet součtů sloupců a řádků # pozor na velké písmeno S A <- matrix(c(2,3,-2,1,2,2),3,2) A [,1] [,2] [1,] 2 1 [2,] 3 2 [3,] -2 2 c <- colSums(A) c [1] 3 5 r <- rowSums(A) r [1] 3 5 0 a <- sum(A) a [1] 8 Výpočet průměrů sloupců a řádků # pozor na velké písmeno M cm <- colMeans(A) cm [1] 1.000000 1.666667 Operace s maticemi v programu R © TGU 2022 6 rm <- rowMeans(A) rm [1] 1.5 2.5 0.0 m <- mean(A) m [1] 1.333333 Výběr submatice z matice A[, 1:3] * výběr 1. až 3. sloupce A[2:3, ] * výběr 2. až 3. řádku Horizontální spojování matic A [,1] [,2] [1,] 2 1 [2,] 3 2 [3,] -2 2 B <- matrix(c(1,3,2,1,4,2),3,2) B [,1] [,2] [1,] 1 1 [2,] 3 4 [3,] 2 2 C <- cbind(A,B) C [,1] [,2] [,3] [,4] [1,] 2 1 1 1 [2,] 3 2 3 4 [3,] -2 2 2 2 Vertikální spojování matic C <- rbind(A,B) C [,1] [,2] [1,] 2 1 [2,] 3 2 [3,] -2 2 [4,] 1 1 [5,] 3 4 [6,] 2 2 2. odmocnica sqrt(b) Operace s maticemi v programu R © TGU 2022 7 Řešení soustavy rovnic 3x1 + 4x2 = 4 x1 + 6x2 = 2 V maticovém zápisu: Ax = y, kde Pak x = A-1 y, nebo v R        61 43 A        2 1 x x x ,        2 4 y A <- matrix(c(3,1,4,6),nrow=2) y <- matrix(c(4,2),nrow=2) x <- solve(A)%*%y x Maticové příkazy V následujících příkladech jsou A a B matice a x a b jsou vektory. Operátor nebo funkce Popis A * B Násobení prvku prvkem A %*% B Násobení matic A %o% B Outer product. AB' (Kronekerův součin; ) crossprod(A,B) crossprod(A) A'B a A'A t(A) Transpozice diag(x) Vytvoření diagonální matice s prvky x na hlavní diagonále. diag(A) Vrátí vektor obsahující prvky hlavní diagonály. diag(k) Jestliže k je skalár, vytvoří k x k matici identity. solve(A, b) Vrátí vektor x z rovnice b = Ax (tj. A-1 b) solve(A) Inverze matice A (A je čtvercová matice) ginv(A) Moore-Penrose zobecněná inverze matice A. ginv(A) vyžaduje nahrání MASS balíčku. cbind(A,B,...) Kombinuje matice (vektory) horizontálně. rbind(A,B,...) Kombinuje matice (vectory) vertikálně. rowMeans(A) Vrátí vektor průměrů řádků. rowSums(A) Vrátí vektor součtů řádků. colMeans(A) Vrátí vektor průměrů sloupců. colSums(A) Vrátí vektor součtů sloupců. Prof. Ing. Tomáš Urban, Ph.D. UMFGZ MENDELU v Brně urban@mendelu.cz