R中的矩阵

时间:2020-02-23 14:43:51  来源:igfitidea点击:

矩阵是R编程中非常重要的概念,主要用于统计和数据操作。
向量是在单个维度上存储的一组值,而矩阵是在多个维度上存储的值的集合。
可以简单地将矩阵视为保存并可以一起操纵的多个向量。
R为此具有几个强大的功能。

在R编程中创建矩阵

矩阵的下标从1开始。
因此,[1,1]代表与第一行第一列对应的元素,[1,2]代表在第一行和第二列的元素,依此类推。

以下列方式创建R中的矩阵:

mymat <- matrix(c(2,4,6,8),ncol=2,nrow=2)

我们传递给矩阵创建的第一个参数是用于填充矩阵的值向量。
然后我们需要指定no。
列和行的数量,由ncolnrow参数指示。
向量中的元素数量应始终等于" ncol * nrow"。

R默认情况下以第一列的方式存储矩阵,即,它填充第一列,然后从左到右移至下一列。
让我们显示上面创建的mymat矩阵。

> mymat
   [,1] [,2]
[1,]    2    6
[2,]    4    8

要以行优先的方式填充矩阵,您需要为上述矩阵创建函数提供一个附加参数byrow = TRUE

> mymat <- matrix(c(2,4,6,8),ncol=2,nrow=2,byrow=TRUE)
> mymat
   [,1] [,2]
[1,]    2    4
[2,]    6    8

您还可以通过指定矩阵大小来预先创建一个矩阵,并在以后相应地填充它。

#Create space for matrix
> xmat <-matrix(ncol=3,nrow=3)
#Populate elements of the matrix
> xmat[1,1]=5
> xmat[1,2]=10
> xmat[1,3]=15
> xmat[2,1]=20
> xmat[2,2]=25
> xmat[2,3]=30
> xmat[3,1]=35
> xmat[3,2]=40
> xmat[3,3]=45
> xmat
   [,1] [,2] [,3]
[1,]    5   10   15
[2,]   20   25   30
[3,]   35   40   45

也可以为矩阵中的列和行分配名称。
这将有助于更好地记录数据集并消除混乱。
R中行和列的名称可以通过使用dimnames参数的列表来提供。

假设我们希望创建一个矩阵来保存3个男孩的生命统计数据,其中包括年龄,身高和体重。
我们需要用行来表示每个男孩的名字,并用列来表示每个重要数据。
我们可以使用以下代码来做到这一点:

vitals <- matrix(c(7,90.8,45,8,75.5,37,10,100.1,50),ncol=3,nrow=3,byrow=TRUE, dimnames = list(c("Raj","Rahul","Ravi"),c("Age","Height","Weight")))

现在让我们显示矩阵。

> vitals
    Age Height Weight
Raj     7   90.8     45
Rahul   8   75.5     37
Ravi   10  100.1     50

可以使用矩阵对象上的colnames()和rownames()函数来检索行和列的名称。

> colnames(vitals)
[1] "Age"    "Height" "Weight"
> rownames(vitals)
[1] "Raj"   "Rahul" "Ravi"

也可以使用这些功能重新分配行和列的名称。
假设我们需要更改列名"高度"和"重量",以包含有关测量单位的更多信息,我们可以通过以下方式进行操作:

> colnames(vitals) <- c("Age", "Height in cm", "Weight in KG")
> vitals
    Age Height in cm Weight in KG
Raj     7         90.8           45
Rahul   8         75.5           37
Ravi   10        100.1           50

R编程中的矩阵运算

R中的矩阵支持基本的线性代数运算,例如加法,乘法(逐元素乘法和矩阵乘法)以及标量乘法。

矩阵加法非常简单,需要两个操作数矩阵都具有相同的维数。

> x<-matrix(c(3,4,5,2,6,7,8,9,11),ncol=3,nrow=3)
> y<-matrix(c(3,2,6,7,8,22,1,54,10),ncol=3,nrow=3)
> x
   [,1] [,2] [,3]
[1,]    3    2    8
[2,]    4    6    9
[3,]    5    7   11
> y
   [,1] [,2] [,3]
[1,]    3    7    1
[2,]    2    8   54
[3,]    6   22   10
> x+y
   [,1] [,2] [,3]
[1,]    6    9    9
[2,]    6   14   63
[3,]   11   29   21

对于逐元素乘法,我们需要两个矩阵具有相同的维数,而对于m x n与p x q矩阵的矩阵乘法,n和p应该始终相同。
这两个示例如下所示。

使用" "符号指定逐元素乘法和标量乘法,使用"%%"符号指定矩阵乘法。

> x*y
   [,1] [,2] [,3]
[1,]    9   14    8
[2,]    8   48  486
[3,]   30  154  110

> x*2
   [,1] [,2] [,3]
[1,]    6    4   16
[2,]    8   12   18
[3,]   10   14   22

> x%*%y
   [,1] [,2] [,3]
[1,]   61  213  191
[2,]   78  274  418
[3,]   95  333  493

下一篇有关矩阵代数的文章将介绍一些更高级的矩阵运算。

R语言中的索引矩阵

在上一篇文章中,我们已经看到了索引向量和提取子集的过程。
矩阵索引的工作方式如下所示。
负下标用于排除特定的行或者列。

#Defined matrix x
> x
   [,1] [,2] [,3]
[1,]    3    2    8
[2,]    4    6    9
[3,]    5    7   11
#Display only the first row
> x[1,]
[1] 3 2 8

#Display only the first column
> x[,1]
[1] 3 4 5

#Display the rows 1 to 2
> x[1:2,]
   [,1] [,2] [,3]
[1,]    3    2    8
[2,]    4    6    9

#Display the columns 2 to 3
> x[,2:3]
   [,1] [,2]
[1,]    2    8
[2,]    6    9
[3,]    7   11

#Display all rows except the second
> x[-2,]
   [,1] [,2] [,3]
[1,]    3    2    8
[2,]    5    7   11

您还可以通过以下方式用新值重新分配这些子矩阵。
第2列和第3列均更改为指定的新值。

> x[,2:3] <- matrix(c(2,2,2,2,2,2),ncol=2)
> x
   [,1] [,2] [,3]
[1,]    3    2    2
[2,]    4    2    2
[3,]    5    2    2