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

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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM