首先在這一節的教程開始以前,咱們須要清楚的是矩陣是特殊的數組,由於矩陣屬於二維數組,而數組能夠是一維,三維,甚至n維。python
好比說咱們要建立一個元素爲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就能夠了。代碼以下所示:spa
> 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列表將這些名字輸入到矩陣當中便可:code
> 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矩陣進行判斷:blog
> 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進行實質上的改變,而不須要再引入其餘的變量了。class
下面是本教程的第二個部分,矩陣的索引,這部分使用索引的方法和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
今天的教程就到此結束啦!