R语言基础入门(10)之矩阵和数组
目錄
1.矩陣
創建矩陣
查看矩陣的行與列數
轉置
2.矩陣子集
3.矩陣行列命名
4.命名后取子集
5.邏輯下標取子集
6.正整數向量的矩陣取子集
7.返回對角線向量
8.創建單位矩陣
9.cbind() 和 rbind() 函數
10.?矩陣運算
10.1??四則運算
10.2??矩陣乘法
10.3?向量與矩陣相乘
10.4 內積
10.5 外積
10.6?逆矩陣與線性方程組求解
10.7?apply() 函數
10.8?多維數組
1.矩陣
創建矩陣
????????矩陣用 matrix 函數定義,實際存儲成一個向量,根據保存的行數和列數對應到矩陣的元素,存儲次序為按列存儲。定義如 A <- matrix(11:16, nrow=3, ncol=2); print(A)返回:
再如:
B <- matrix(c(1,-1, 1,1), nrow=2, ncol=2, byrow=TRUE); print(B)返回:
matrix() 函數把矩陣元素以一個向量的形式輸入,用 nrow 和 ncol 規定行數和列數,向量元素填入矩陣的缺省次序是按列填入,用 byrow=TRUE 選項可以轉換成按行填入。查看矩陣的行與列數
用 nrow() 和 ncol() 函數可以訪問矩陣的行數和列數,如 nrow(A)返回:
ncol(A)返回:
矩陣有一個 dim 屬性,內容是兩個元素的向量,兩個元素分別為矩陣的行數和列數。dim 屬性可以用 dim() 函數訪問。如
attributes(A)返回:
?還有一個:
dim(A)返回:
轉置
t(A)?返回:
2.矩陣子集
用 A[1,] 取出 A 的第一行,變成一個普通向量。用 A[,1] 取出 A 的第一列,變成一個普通向量。用 A[c(1,3),1:2] 取出指定行、列對應的子矩陣。如 看整個矩陣: A返回:
?取第一行:
A[1,]返回:
取第一列:
A[,1]返回:
?取1到3行,1到2列:
A[c(1,3), 1:2]返回:
3.矩陣行列命名
用 colnames() 函 數 可 以 給 矩 陣 每 列 命 名, 也 可 以 訪 問 矩 陣 列 名, 用 rownames() 函數可以給矩陣每行命名,也可以訪問矩陣行名。如 colnames(A) <- c('X', 'Y') rownames(A) <- c('a', 'b', 'c') A返回:
4.命名后取子集
矩陣可以有一個 dimnames 屬性,此屬性是兩個元素的列表(列表見稍后部分的介紹),兩個元素分別為矩陣的行名字符型向量與列名字符型向量。如果僅有其中之一,缺失的一個取為 NULL。 有了列名、行名后,矩陣下標可以用字符型向量,如 A[,'Y'] A['b',] A[c('a', 'c'), 'Y']返回:
注意在對矩陣取子集時,如果取出的子集僅有一行或僅有一列,結果就不再是矩陣而是變成了 R 向量,R 向量既不是行向量也不是列向量。如果想避免這樣的規則起作用,需要在方括號下標中加選項 drop=FALSE,如
A[,1,drop=FALSE]返回:
取出了 A 的第一列,作為列向量取出,所謂列向量實際是列數等于 1 的矩陣。如果用常量作為下標,其結果維數是確定的,不會出問題;如果用表達式作為下標,則表達式選出零個、一個、多個下標,結果維數會有不同,加 drop=FALSE 則是安全的做法。5.邏輯下標取子集
矩陣也可以用邏輯下標取子集,比如 A返回:
A[A[,1]>=2,'Y']返回:
6.正整數向量的矩陣取子集
矩陣本質上是一個向量添加了 dim 屬性,實際保存還是保存成一個向量,其中元素的保存次序是按列填入,所以,也可以向對一個向量取子集那樣,僅用一個正整數向量的矩陣取子集。如 A返回:?
A[c(1,3,5)]返回:
為了挑選矩陣的任意元素組成的子集而不是子矩陣,可以用一個兩列的矩陣作為下標,矩陣的每行的兩個元素分別指定一個元素的行號和列號。如 ind <- matrix(c(1,1, 2,2, 3,2), ncol=2, byrow=TRUE) A返回:
ind返回:
A[ind]返回:
用 c(A) 或 A[] 返回矩陣 A 的所有元素。如果要修改矩陣 A 的所有元素,可以對 A[] 賦值。7.返回對角線向量
對矩陣 A,diag(A) 訪問 A 的主對角線元素組成的向量 diag(A)返回:
8.創建單位矩陣
若 x 為正整數值標量,diag(x) 返回 x 階單位陣;若 x 為長度大于 1 的向量,diag(x) 返回以 x 的元素為主對角線元素的對角矩陣:9.cbind() 和 rbind() 函數
若 x 是向量,cbind(x) 把 x 變成列向量,即列數為 1 的矩陣,rbind(x) 把 x 變成行向量。 若 x1, x2, x3 是等長的向量,cbind(x1, x2, x3) 把它們看成列向量并在一起組成一個矩陣。cbind() 的自變量可以同時包含向量與矩陣,向量的長度必須與矩陣行數相等。 如 cbind(c(1,2), c(3,4), c(5,6))返回:
再如,
cbind(A, c(1,-1,10))返回:
cbind() 的自變量中也允許有標量,這時此標量被重復使用。如
cbind(1, c(1,-1,10))返回:
而rbind() 與cbind() 用法類似,可以等長的向量看成行向量上下摞在一起,可以是矩陣與長度等于矩陣列數的向量上下摞在一起,向量長度為 1 也可以。簡單說就是這兩個函數互為轉置!! 如10.?矩陣運算
10.1??四則運算
矩陣可以與標量作四則運算,結果為每個元素進行相應運算,如?
A返回:
如加法運算:
C1 <- A + 2; C1返回:
?
如除法運算:
C2 <- A / 2; C2返回:
當運算為矩陣乘以一個標量時,就是線性代數中的矩陣的數乘運算。兩個同形狀的矩陣進行加、減運算,即對應元素相加、相減,用 A + B,A - B 表示,如 C1 + C2返回:
C1 - C2返回:
這就是線性代數中矩陣的加、減運算。 對兩個同形狀的矩陣,用 * 表示兩個矩陣對應元素相乘 (注意這不是線性代數中的矩陣乘法),用/表示兩個矩陣對應元素相除。如 C1 * C2返回:
C1 / C2返回:
10.2??矩陣乘法
用%*% 表示矩陣乘法而不是用 * 表示,注意矩陣乘法要求左邊的矩陣的列數等于右邊的矩陣的行數。如 先看一下前面的A,B矩陣 A B?返回:
?然后看一下矩陣相乘并賦值給c3
C3 <- A %*% B; C3返回:
10.3?向量與矩陣相乘
B返回:
看一下向量(1,1)與矩陣B相乘
c(1,1) %*% B返回:
再看一下矩陣B與向量(1,1)相乘
B %*% c(1,1)返回:
再看一下 向量*矩陣*向量
c(1,1) %*% B %*% c(1,1)返回:
注意:矩陣乘法總是給出矩陣結果,即使此矩陣已經退化為行向量、列向量甚至于退化為標量也是一樣。如果需要,可以用 c() 函數把一個矩陣轉換成按列拉直的向量。10.4 內積
設 x, y 是兩個向量,計算向量內積,可以用 sum(x*y) 表示。 設 A, B 是兩個矩陣,ATB 是廣義的內積,也稱為叉積 (crossprod),結果是一個矩陣,元素為 A 的每列與 B 的每列計算內積的結果。ATB 在 R 中可以表示為 crossprod(A, B), AT A 可以表示為 crossprod(A)。要注意的是,crossprod() 的結果總是矩陣,所以計算兩個向量的內積用 sum(x,y) 而不用 crossprod(x,y)。 如: sum(A,B) crossprod(A,B)返回:
10.5 外積
R 向量支持外積運算,記為%o%, 結果為矩陣。x %o% y 的第 i 行第 j 列元素等于 x[i] 乘以 y[j]。如 c(1,2,3) %o% c(1, -1)返回:
?
這種運算還可以推廣到 x 的每一元素與 y 的每一元素進行其它的某種運算,而不限于乘積運算,可以用 outer(x,y,f) 完成,其中 f 是某種運算,或者接受兩個自變量的函數。10.6?逆矩陣與線性方程組求解
用 solve(A) 求 A 的逆矩陣,如
solve(A) solve(B)返回:
用 solve(A,b) 求解線性方程組 Ax = b 中的 x, 如 求解線性方程組 B返回:
solve(B, c(1,2))返回:
10.7?apply() 函數
apply(A, 2, FUN) 把矩陣 A 的每一列分別輸入到函數 FUN 中,得到對應于每一列的結果,如 D <- matrix(c(6,2,3,5,4,1), nrow=3, ncol=2); D返回:
apply(D, 2, sum)返回:
apply(A, 1, FUN) 把矩陣 A 的每一行分別輸入到函數 FUN 中,得到與每一行對應的結果,如 apply(D, 1, mean)返回:
如果函數 FUN 返回多個結果,則 apply(A, 2, FUN) 結果為矩陣,矩陣的每一列是輸入矩陣相應列輸入到 FUN 的結果,結果列數等于 A 的列數。如 apply(D, 2, range)返回:
如果函數 FUN 返回多個結果,為了對每行計算 FUN 的結果,結果存入一個與輸入的矩陣行數相同的矩陣,應該用 t(apply(A, 1, FUN)) 的形式,如 t(apply(D, 1, range))返回:
10.8?多維數組
矩陣是多維數組 (array) 的特例。矩陣是 xij , i = 1, 2, . . . , n, j = 1, 2, . . . , m 這樣的兩下標數據的存貯格式,三維數組是 xijk, i = 1, 2, . . . , n, j = 1, 2, . . . , m, k = 1, 2, . . . , p 這樣的三下標數據的存貯格式,s 維數組則是有 s 個下標的數據的存貯格式。實際上,給一個向量添加一個 dim 屬性就可以把它 變成多維數組。 多維數組的一般定義語法為 ????????數組名 <- array(數組元素, ????????????????dim=c(第一下標個數, 第二下標個數, ..., 第s下標個數)) 其中數組元素的填入次序是第一下標變化最快,第二下標次之,最后一個下標 是變化最慢的。這種次序稱為 FORTRAN 次序。 下面是一個三維數組定義例子。 ara <- array(1:24, dim=c(2,3,4)); ara返回:
這樣的數組保存了 xijk, i = 1, 2, j = 1, 2, 3, k = 1, 2, 3, 4。三維數組 ara 可以看成是 4 個 2 × 3 矩陣。取出其中一個如 ara[,,2](取出第二個矩陣) ara[,,2]返回:
多維數組可以利用下標進行一般的子集操作,比如 ara[,2, 2:3] 是 xijk, i = 1, 2, j = 2, k = 2, 3 的值,結果是一個 2 × 2 矩陣: ara[,2,2:3]返回:
多維數組在取子集時如果某一維下標是標量,則結果維數會減少,可以在方括號內用 drop=FALSE 選項避免這樣的規則發生作用。 類似于矩陣,多維數組可以用一個矩陣作為下標,如果是三維數組,矩陣就需要有 3 列,四維數組需要用 4 列矩陣。下標矩陣的每行對應于一個數組元素。總結
以上是生活随笔為你收集整理的R语言基础入门(10)之矩阵和数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6000毫安以上智能手机_展望2021年
- 下一篇: 手把手教你爬虫requests实战演练—