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

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



  • 相关阅读:
    调用其他类函数,且其他类函数使用自己脚本的成员变量的方法
    伟程君解决端口被占用问题(接口jmeter 本地端口被占用完了,jmeter报错的问题)(亲测是可以的)
    JMeter 使用 http长连接的方法
    解决端口被占用问题(端口timewait)
    光辉岁月吉他指弹
    Jmeter获取 json字符的另外一种写法
    Jmeter-Critical Section Controller(临界区控制器)(还没看,是一个控制请求按顺序执行的东东)
    wrk一个能做模拟高并发请求的东东
    017-mac下project
    016-mac下ps
  • 原文地址:https://www.cnblogs.com/geeksongs/p/12381564.html
Copyright © 2011-2022 走看看