zoukankan      html  css  js  c++  java
  • R语言入门:矩阵和数组的运算

    一.创建矩阵和数组

    首先在这一节的教程开始之前,我们需要清楚的是矩阵是特殊的数组,因为矩阵属于二维数组,而数组可以是一维,三维,甚至n维。

    比如说我们要创建一个元素为20个,4行5列的矩阵,则输入以下代码:

    > x <-matrix(1:20,4,5)
    > x
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    5    9   13   17
    [2,]    2    6   10   14   18
    [3,]    3    7   11   15   19
    [4,]    4    8   12   16   20

    这样我们的一个矩阵就创建完成了。为了更加详细地表示出有多少航和有多少列,则可以使用参数nrow和ncol,也可以像上面的例子一样不加,下面是加上这两个参数的例子:

    > v<-1:30
    > w<-matrix(v,nrow=10,ncol = 3)
    > w
          [,1] [,2] [,3]
     [1,]    1   11   21
     [2,]    2   12   22
     [3,]    3   13   23
     [4,]    4   14   24
     [5,]    5   15   25
     [6,]    6   16   26
     [7,]    7   17   27
     [8,]    8   18   28
     [9,]    9   19   29
    [10,]   10   20   30

    我们可以看到这两个矩阵都是按照列来排列数字的,每一列从上到下数字从小到大,但我们能不能够将数字进行按行排列呢?答案显然是可以的,只需要在后面就上参数byrow=T就可以了。代码如下所示:

    > w<-matrix(v,10,3,byrow = T)
    > w
          [,1] [,2] [,3]
     [1,]    1    2    3
     [2,]    4    5    6
     [3,]    7    8    9
     [4,]   10   11   12
     [5,]   13   14   15
     [6,]   16   17   18
     [7,]   19   20   21
     [8,]   22   23   24
     [9,]   25   26   27
    [10,]   28   29   30

    当然,我们能不能够将每行每列都进行命名呢,这样一个矩阵旁边全是数字看起来未免也太繁琐了,下面的dimnames()命名函数则给予了我们这个机会。我们首先将每行每列的名称写出来,然后再利用dimnames()函数和list列表将这些名字输入到矩阵当中即可:

    > rowname=c("R1","R2","R3","R4","R5","R6","R7","R8","R9","R10")
    > columnname=c("C1","C2","C3")
    > dimnames(w)<-list(rowname,columnname)
    > w
        C1 C2 C3
    R1   1  2  3
    R2   4  5  6
    R3   7  8  9
    R4  10 11 12
    R5  13 14 15
    R6  16 17 18
    R7  19 20 21
    R8  22 23 24
    R9  25 26 27
    R10 28 29 30

    这里已经使用了dimnames()函数,还有一个和这个函数相近的函数dim(),这个函数是用来测量数组的维度的,如果是矩阵则会有两维,并且能够显示出每一个维度的大小。我们对之前已经创建好的x矩阵进行判断:

    > dim(x)
    [1] 4 5

    同时dim()函数也可以用于建立多维数组,它具有两个功能,建立二维数组的代码如下:

    > dim(x)<-c(4,5)
    > x
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    5    9   13   17
    [2,]    2    6   10   14   18
    [3,]    3    7   11   15   19
    [4,]    4    8   12   16   20

    建立三维数组的代码如下:

    > dim(x)<-c(2,2,5)
    > x
    , , 1
    
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
    
    , , 2
    
         [,1] [,2]
    [1,]    5    7
    [2,]    6    8
    
    , , 3
    
         [,1] [,2]
    [1,]    9   11
    [2,]   10   12
    
    , , 4
    
         [,1] [,2]
    [1,]   13   15
    [2,]   14   16
    
    , , 5
    
         [,1] [,2]
    [1,]   17   19
    [2,]   18   20

    下面是给三维数组命名的方法,和之前的矩阵命名行列的方式也比较类似,也是首先列出每一个维度的名称,然后在利用dimnames()函数将这些名称输入进数组当中,如下所示:

    > dim1<-c("A1","A2")
    > dim2<-c("B1","B2","B3")
    > dim3<-c("C1","C2","C3","C4")
    > z<-array(1:24,c(2,3,4),dimnames = list(dim1,dim2,dim3))
    > z
    , , C1
    
       B1 B2 B3
    A1  1  3  5
    A2  2  4  6
    
    , , C2
    
       B1 B2 B3
    A1  7  9 11
    A2  8 10 12
    
    , , C3
    
       B1 B2 B3
    A1 13 15 17
    A2 14 16 18
    
    , , C4
    
       B1 B2 B3
    A1 19 21 23
    A2 20 22 24

    从上面我们可以看到创建数组还可以使用array函数,不仅仅是dim()函数可以进行创建。这两个函数来进行创建也是有区别的,如果用array函数进行创建,那么必须引入z变量,将z变量赋值为使用array函之后的形式,但是使用dim(x)函数则直接可以对x进行实质上的改变,而不需要再引入其他的变量了。

    下面是本教程的第二个部分,矩阵的索引,这部分使用索引的方法和python十分类似。

    二.矩阵的索引

    首先我们创建一个四行五列的矩阵:

    > m <- matrix(1:20,4,5,byrow = T)
    > m
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    2    3    4    5
    [2,]    6    7    8    9   10
    [3,]   11   12   13   14   15
    [4,]   16   17   18   19   20

    得到第一行第二列的元素:

    > m[1,2]
    [1] 2

    得到第一行,列数为2,3,4的元素:

    > m[1,c(2,3,4)]
    [1] 2 3 4

    得到行数为2到4,列数为2到3的元素:

    > m[c(2:4),c(2,3)]
         [,1] [,2]
    [1,]    7    8
    [2,]   12   13
    [3,]   17   18

    得到第二行的全部元素:

    > m[2,]
    [1]  6  7  8  9 10

    得到第二列当中,除了第一行第二列的元素其余的全部元素:

    > m[-1,2]
    [1]  7 12 17

    三.矩阵的计算

    首选是矩阵自身的运算,首先创造矩阵V:

    > v=matrix(1:20,5,4)
    > v
         [,1] [,2] [,3] [,4]
    [1,]    1    6   11   16
    [2,]    2    7   12   17
    [3,]    3    8   13   18
    [4,]    4    9   14   19
    [5,]    5   10   15   20

    计算矩阵当中每一列和每一行的和:

    > colSums(v)
    [1] 15 40 65 90
    > rowSums(v)
    [1] 34 38 42 46 50

    由于看着矩阵周围的数字太不顺眼了,因此更换为字符来表示:

    > rowname=c("R1","R2","R3","R4","R5")
    > colname=c("C1","C2","C3","C4")
    > dimnames(v)=list(rowname,colname)
    > v
       C1 C2 C3 C4
    R1  1  6 11 16
    R2  2  7 12 17
    R3  3  8 13 18
    R4  4  9 14 19
    R5  5 10 15 20

    下面是矩阵外身的计算;包括矩阵的加和乘法:

    > colMeans(v)#用来计算平均值
    C1 C2 C3 C4 
     3  8 13 18 
    > n=matrix(1:9,3,3)
    > t=matrix(2:10,3,3)
    > n
         [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    2    5    8
    [3,]    3    6    9
    > t
         [,1] [,2] [,3]
    [1,]    2    5    8
    [2,]    3    6    9
    [3,]    4    7   10
    > #现在演示矩阵的内积,也就是对应元素相称,不需要做正规的,数学上的矩阵乘法
    > n*t
         [,1] [,2] [,3]
    [1,]    2   20   56
    [2,]    6   30   72
    [3,]   12   42   90
    > #现在进行矩阵的外积,也就是正式的矩阵的乘法
    > n %*% t
         [,1] [,2] [,3]
    [1,]   42   78  114
    [2,]   51   96  141
    [3,]   60  114  168
    > #这个外积的结果正好是我所需要的,和数学当中的运算·结果一模一样
    > #下面返回对角线位置的值
    > diag(n)
    [1] 1 5 9
    > #下面进行矩阵的转置
    > v
       C1 C2 C3 C4
    R1  1  6 11 16
    R2  2  7 12 17
    R3  3  8 13 18
    R4  4  9 14 19
    R5  5 10 15 20
    > t(v)
       R1 R2 R3 R4 R5
    C1  1  2  3  4  5
    C2  6  7  8  9 10
    C3 11 12 13 14 15
    C4 16 17 18 19 20

    今天的教程就到此结束啦!



  • 相关阅读:
    noi 2011 noi嘉年华 动态规划
    最小乘积生成树
    noi 2009 二叉查找树 动态规划
    noi 2010 超级钢琴 划分树
    noi 2011 阿狸的打字机 AC自动机
    noi 2009 变换序列 贪心
    poj 3659 Cell Phone Network 动态规划
    noi 2010 航空管制 贪心
    IDEA14下配置SVN
    在SpringMVC框架下建立Web项目时web.xml到底该写些什么呢?
  • 原文地址:https://www.cnblogs.com/geeksongs/p/12381564.html
Copyright © 2011-2022 走看看