Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyVýpočetní matematické systémy Výuka jazyka R Matice a pole Funkce pro manipulaci s maticemi

Logo Matematická biologie

Funkce pro manipulaci s maticemi

nrow(), ncol() počet řádků a sloupců pole
dim() dimenze pole
t() transpozice matice
diag(A) vypíše diagonálu matice A
diag(v)
vytvoří diagonální matici se složkami vektoru v na diagonále
diag(k)
pro každé přirozené číslo k vygeneruje jednotkovou matici rozměrů k x k

lower.tri()

upper.tri()

výstupem je matice logických hodnot stejných rozměrů jako matice v argumentu. Hodnoty TRUE odpovídají prvkům v dolní/horní trojúhelníkové matici. Implicitní nastavení diag=FALSE nezahrnuje diagonálu.
 
det() determinant matice
eigen()
výstupem je seznam o dvou položkách - values (vlastní čísla) a vectors (vlastní vektory). V případě, že nás zajímají pouze vlastní čísla, popř. pouze vlastní vektory matice, použijeme operátoru $:eigen()$values, popř. eigen()$vectors.
qr()
QR rozklad. Jedním z výstupů je i hodnost matice, chceme-li zjistit pouze hodnost matice, můžeme použít příkaz qr()$rank
svd() singulární rozklad trojúhelníkové matice
norm()
norma matice. Je potřeba nainstalovat a načíst podpůrný balíček Matrix pomocí příkazů install.packages("Matrix") a library(Matrix). Volitelnými argumenty můžeme zvolit typ normy:
"O", "o" nebo "1" pro maximální součty ve sloupcích, implicitní nastavení,
"I" nebo "i" pro maximální součty v řádcích,
"F" nebo "f" pro Frobeniovu normu (euklidovská norma vektor, když je na vstupní matici nahlíženo jako na vektor)
sum(diag()) stopa matice

 

> (A <- matrix(c(3, 2, -1, 0), 2))

.
[,1]
[,2]
[1,]
3
-1
[2,]
2
0
> (v <- diag(A))
[1]    3    0
> diag(v)

 

 
[,1]
[,2]
[1,]
3
0
[2,]
0
0

> diag(2)

 
[,1]
[,2]
[1,]
1
0
[2,]
0
1

> lower.tri(A)

 
[,1]
[,2]
[1,]
 FALSE
 FALSE
[2,]
TRUE
FALSE

> A[lower.tri(A)] <- 0     horní trojúhelníková matice

 
[,1]
[,2]
[1,]
3
-1
[2,]
0
0

> eigen(A)
$values
[1]    2    1
$vectors

 
[,1]
[,2]
[1,]
 0.7071068
 0.4472136
[2,]
 0.7071068
0.8944272

> eigen(A)$values
[1]    2    1
> qr(A)$rank
[1]    2
> norm(A, "1"); norm(A, "i"); norm(A, "f")
[1]    5
[1]    4
[1]    3.741657

> sum(diag(A))
[1]    3

Násobení matic

Pro násobení matic po složkách se používá operátor *, navíc musí mít násobené matice souhlasné rozměry. Pro součin matice a vektoru (v libovolném pořadí) se uplatňuje pravidlo recycling rule, tzn. jednotlivé složky matice jsou po sloupcích postupně násobeny složkami vektoru.

> u <- c(1, 0, 0)
> v <- c(1, 0, 0, 0, 1)
> A <- matrix(c(1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1), ncol=3)
> A

 
[,1]
[,2]
[,3]
[1,]
1
0
0
[2,]
0
1
0
[3,]
0
1
1
[4,]
1
1
1

> u * A    použití pravidla recycling rule

 
[,1]
[,2]
[,3]
[1,]
1
0
0
[2,]
0
0
0
[3,]
0
1
0
[4,]
1
0
0

> v * A    použití pravidla recycling rule. Výstup navíc obsahuje varovné hlášení, neboť počet prvků matice  není dělitelný délkou vektoru v

 
[,1]
[,2]
[,3]
[1,]
1
0
0
[2,]
0
1
0
[3,]
0
0
1
[4,]
0
0
0
Warning message:
In v * A : longer object length is not a multiple of shorter object length

Pro maticové násobení se používá operátor %*% oba činitelé musí být odpovídajících rozměrů (vnitřní rozměry obou činitelů musí být shodné).

> A %*% u

 
 [,1]
 [1,]
1
[2,]
0
[3,]
0
[4,]
1

> B <- matrix(c(0, 1, 1, 1, 0, 1, 0, 1), ncol=4)

 
[,1]
[,2]
[,3]
[,4]
[1,]
0
1
0
0
[2,]
1
1
1
1
> A %*% B    nesouhlasné rozměry matic
Error in A %*% B : non-conformable arguments
> B %*% A
 
[,1]
[,2]
[,3]
[1,]
0
1
0
[2,]
2
3
2
Zatímco v systému MATLAB operaci násobení po složkách zajišťuje operátor .*, v jazyce R je to *. Operátor * v systému MATLAB označuje maticové násobení, v jazyce R je to operátor %*%.

Řešení lineárních rovnic a inverze

Řešení lineárních rovnic je inverzní operací k maticovému násobení
> b <- A %*% x
A značí čtvercovou matici koeficientů pro lineární systém, b je vektor nebo matice pravé strany. Vektor/matice x je řešením systému lineárních rovnic Ax=b, které získáme příkazem solve(A, b). V lineární algebře řešení formálně dostaneme  x=A-1b , kde A-1 značí matici inverzní k matici A. Matici inverzní můžeme v R spočítat pomocí solve(A)

> (A <- matrix(c(1, 3, 1, -1), 2))

.
[,1]
[,2]
[1,]
0
1
[2,]
3
-1

> (b <- matrix(c(3, 1), 2))

 
[,1]
[1,]
3
[2,]
1

> solve(A, b)

 
[,1]
[1,]
1
[2,]
2

> solve(A) %*% b

 
[,1]
[1,]
1
[2,]
2

Příkaz backsolve(A, b, k, upper.tri, transpose) rovněž slouží k řešení lineárních rovnic s horní (upper.tri=TRUE, implicitně) nebo dolní trojúhelníkovou maticí (upper.tri=FALSE). Vektor b je vektor/matice pravých stran, k je počet sloupců matice A, které mají být použity. Pro transpose=TRUE řešíme systém A'x=b, implicitní nastavení je transpose=FALSE.

> backsolve(A, b, upper.tri=TRUE)    řeší systém lineárních rovnic 

 

 
[,1]
[1,]
4
[2,]
-1

Poznámka. Stejně jako u maticového násobení, ani u funkcí solve() a backsolve() není nezbytně nutné zadávat vektory pravé strany jako sloupcové vektory. Pro vstupní řádkový vektor bude výstupem řádkový vektor.

 
vytvořil Institut biostatistiky a analýz Lékařské fakulty Masarykovy univerzity