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