My Coding > Software > R > R matrix

R matrix

Matrix in R are in fact rectangular array. It is possible to initialize matrix by reshaping vector into a two dimensional structure

In the following code we will combine 6 elements of vector into 3 rows and 2 columns. And we will fill it by columns (byrow=FALSE parameter)


> M <- matrix(c(1,2,3,10,10,30), nrow=3, ncol=2, byrow=F)
> M
     [,1] [,2]
[1,]    1   10
[2,]    2   10
[3,]    3   30

It is possible to access to individual element, to any row or column:


> M[1,2] # individual element
[1] 10
> M[1,] # Row
[1]  1 10
> M[,2] # Column
[1] 10 10 30

It is possible to convert matrix back to vector by function c()


> b <- c(B)
> b
[1]   1   2   3  10  10  30 100 200 300

Binding two matrices

If the matrices have some identical size, then it is possible to bind them by function cbind()


> M <- matrix(c(1,2,3,10,10,30), nrow=3, ncol=2, byrow=F)
> N <- matrix(c(100, 200, 300), nrow=3, ncol=1)
> B <- cbind(M, N)
> B
     [,1] [,2] [,3]
[1,]    1   10  100
[2,]    2   10  200
[3,]    3   30  300

Diagonal matrix

Matrix with non-zero elements located diagonally, called diagonal matrix. It is possible to create this matrix by function diag()


> d <-diag(c(2,4,6))
> d
     [,1] [,2] [,3]
[1,]    2    0    0
[2,]    0    4    0
[3,]    0    0    6

Identity matrix

If you only specify the size of diagonal matrix, then it will create identity matrix


> i <- diag(3)
> i
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

Basic matrix operations

R give very wide selection of tools to work with matrices. Lets check some of them:

  • det() - Determinant of the matrix
  • qr() - QR decomposition
  • svd() - Returns named list with singular value, and canonical u and v matrices for svd decomposition
  • eigen() - Returns eigen values and eigen vectors of our matrix
  • solve() - Returns inverse matrix


> M <- matrix(c(1,3,4,-1,0,5,4,11,34), nrow=3, ncol=3, byrow=F)
> det(M)
[1] 63
> qr(M)
$qr
           [,1]      [,2]       [,3]
[1,] -5.0990195 -3.726207 -33.928091
[2,]  0.5883484  3.480716  11.370339
[3,]  0.7844645 -0.922809  -3.549648

$rank
[1] 3

$qraux
[1] 1.196116 1.385258 3.549648

$pivot
[1] 1 2 3

attr(,"class")
[1] "qr"
> svd(M)
$d
[1] 36.5715204  2.6657656  0.6462128

$u
           [,1]       [,2]        [,3]
[1,] -0.1076815 -0.5574869 -0.82317254
[2,] -0.3065248 -0.7690334  0.56091901
[3,] -0.9457522  0.3127234 -0.08807287

$v
           [,1]        [,2]       [,3]
[1,] -0.1315303 -0.60533960  0.7850247
[2,] -0.1263573  0.79568289  0.5923872
[3,] -0.9832261 -0.02127673 -0.1811455

> eigen(M)
$values
[1] 35.993251+0.000000i -0.496625+1.226251i -0.496625-1.226251i

$vectors
              [,1]                  [,2]                  [,3]
[1,] 0.09997148+0i  0.4337928+0.5357119i  0.4337928-0.5357119i
[2,] 0.29841589+0i  0.7055059+0.0000000i  0.7055059+0.0000000i
[3,] 0.94918579+0i -0.1501591-0.0674553i -0.1501591+0.0674553i

> solve(M)
           [,1]       [,2]        [,3]
[1,] -0.8730159  0.8571429 -0.17460317
[2,] -0.9206349  0.2857143  0.01587302
[3,]  0.2380952 -0.1428571  0.04761905

###Matrix multiplications

There are two different typo of matrix multiplications in R:

  • * - element by element multiplication
  • %*% - Proper full matrix multiplication


> N <-diag(3)
> M*N
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    0    0
[3,]    0    0   34
> M%*%N
     [,1] [,2] [,3]
[1,]    1   -1    4
[2,]    3    0   11
[3,]    4    5   34


Published: 2021-11-10 12:21:05

Last 10 artitles


9 popular artitles

© 2020 MyCoding.uk -My blog about coding and further learning. This blog was writen with pure Perl and front-end output was performed with TemplateToolkit.