R矩陣運(yùn)算

用過Matlab的同學(xué)轉(zhuǎn)用R會覺得R的矩陣運(yùn)算真的有點(diǎn)蛋疼,但是學(xué)了統(tǒng)計(jì)酿傍,一直不用R也不是回事烙懦,所以索性放下Matlab,了解并使用一下R的矩陣運(yùn)算赤炒。

創(chuàng)建一個(gè)向量

x = c(1:12)
x
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12

創(chuàng)建一個(gè)矩陣

R中的矩陣輸入是內(nèi)容和格式分開的氯析,不像matlab直接可以輸入,需要把向量變?yōu)榫仃嚒?/p>

A = matrix(x, nrow = 3, ncol = 4, byrow = T, dimnames = NULL)  #注意R中輸入的矩陣默認(rèn)是先排列莺褒,后排行掩缓,與matlab不同。
A
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
args(matrix)
## function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) 
## NULL

data 項(xiàng)為必要的矩陣元素遵岩,nrow 為行數(shù)你辣,ncol 為列數(shù),注意 nrow 與 ncol 的乘積應(yīng)為矩陣元素個(gè)數(shù)尘执,byrow 項(xiàng)控制排列元素時(shí)是否按行進(jìn)行舍哄,dimnames 給定行和列的名稱。

矩陣轉(zhuǎn)置

t(A)
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

矩陣加減和數(shù)乘

使用“+”誊锭、“-”表悬、“*”,如:

A = B = matrix(1:12, nrow = 3, ncol = 4)
A + B
##      [,1] [,2] [,3] [,4]
## [1,]    2    8   14   20
## [2,]    4   10   16   22
## [3,]    6   12   18   24
A - B
##      [,1] [,2] [,3] [,4]
## [1,]    0    0    0    0
## [2,]    0    0    0    0
## [3,]    0    0    0    0
2 * A
##      [,1] [,2] [,3] [,4]
## [1,]    2    8   14   20
## [2,]    4   10   16   22
## [3,]    6   12   18   24

矩陣乘法

使用“%*%”

A = matrix(1:12, nrow = 3, ncol = 4)
B = matrix(1:12, nrow = 4, ncol = 3)
A %*% B  #真不知道怎么發(fā)明的這個(gè)符號……
##      [,1] [,2] [,3]
## [1,]   70  158  246
## [2,]   80  184  288
## [3,]   90  210  330
A = B = matrix(1:12, nrow = 4, ncol = 3)
crossprod(A, B)  #得到A'B丧靡,效率更高
##      [,1] [,2] [,3]
## [1,]   30   70  110
## [2,]   70  174  278
## [3,]  110  278  446

矩陣對角元素相關(guān)運(yùn)算

A = matrix(1:16, nrow = 4, ncol = 4)
diag(A)  #對一個(gè)矩陣應(yīng)用diag()函數(shù)將產(chǎn)生主對角線向量
## [1]  1  6 11 16
diag(diag(A))  #對一個(gè)向量應(yīng)用 diag()函數(shù)將產(chǎn)生以這個(gè)向量為對角元素的對角矩陣
##      [,1] [,2] [,3] [,4]
## [1,]    1    0    0    0
## [2,]    0    6    0    0
## [3,]    0    0   11    0
## [4,]    0    0    0   16
diag(3)  #對一個(gè)正整數(shù) z 應(yīng)用 diag()函數(shù)將產(chǎn)生以 z 維單位矩陣
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1

矩陣求逆

矩陣求逆可用函數(shù) solve()蟆沫,應(yīng)用 solve(a, b)運(yùn)算結(jié)果是解線性方程組 ax = b籽暇,若 b 缺省,則系統(tǒng)默認(rèn)為單位矩陣饭庞,因此可用其進(jìn)行矩陣求逆戒悠。

a = matrix(rnorm(16), 4, 4)
a
##         [,1]    [,2]     [,3]      [,4]
## [1,]  1.3724  0.2891 -0.88780 -1.090857
## [2,] -0.4679  0.6059 -1.91791  1.223136
## [3,]  0.1232  0.1639  0.06772  0.005791
## [4,]  1.8251 -0.6050  1.18867 -1.110864
solve(a)
##         [,1]    [,2]   [,3]     [,4]
## [1,] -0.1268  0.5369 0.8980  0.72034
## [2,]  0.2643 -0.3279 4.6452 -0.59628
## [3,] -0.3471 -0.2506 1.8130  0.07441
## [4,] -0.7237  0.7925 0.8852  0.68764

矩陣的特征值與特征向量

矩陣 A 的譜分解為 A=UΛU',其中 Λ 是由 A 的特征值組成的對角矩陣,U 的列為 A 的特征值對應(yīng)的特征向量但绕,在 R 中可以用函數(shù) eigen()函數(shù)得到 U 和 Λ救崔。

args(eigen)
## function (x, symmetric, only.values = FALSE, EISPACK = FALSE) 
## NULL

其中:x 為矩陣,symmetric 項(xiàng)指定矩陣 x 是否為對稱矩陣捏顺,若不指定六孵,系統(tǒng)將自動檢測 x 是否為對稱矩陣。

A = diag(4) + 1
A
##      [,1] [,2] [,3] [,4]
## [1,]    2    1    1    1
## [2,]    1    2    1    1
## [3,]    1    1    2    1
## [4,]    1    1    1    2
A.eigen = eigen(A, symmetric = T)
A.eigen  #$vectors為特征值幅骄,$values為特征向量
## $values
## [1] 5 1 1 1
## 
## $vectors
##      [,1]    [,2]    [,3]    [,4]
## [1,] -0.5  0.8660  0.0000  0.0000
## [2,] -0.5 -0.2887 -0.5774 -0.5774
## [3,] -0.5 -0.2887 -0.2113  0.7887
## [4,] -0.5 -0.2887  0.7887 -0.2113
A.eigen$vectors %*% diag(A.eigen$values) %*% t(A.eigen$vectors)
##      [,1] [,2] [,3] [,4]
## [1,]    2    1    1    1
## [2,]    1    2    1    1
## [3,]    1    1    2    1
## [4,]    1    1    1    2
t(A.eigen$vectors) %*% A.eigen$vectors
##            [,1]       [,2]       [,3]       [,4]
## [1,]  1.000e+00 -5.551e-17 -1.110e-16 -9.714e-17
## [2,] -5.551e-17  1.000e+00 -5.551e-17 -5.551e-17
## [3,] -1.110e-16 -5.551e-17  1.000e+00  0.000e+00
## [4,] -9.714e-17 -5.551e-17  0.000e+00  1.000e+00

矩陣的維數(shù)

函數(shù)dim()將返回一個(gè)矩陣的維數(shù)劫窒,nrow()返回行數(shù),ncol()返回列數(shù)

A = matrix(1:12, 3, 4)
A
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
nrow(A)  #行數(shù)
## [1] 3
ncol(A)  #列數(shù)
## [1] 4
dim(A)  #w維數(shù)
## [1] 3 4

矩陣的行和拆座、列和主巍、行平均與列平均

A
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
rowSums(A)  #行和
## [1] 22 26 30
rowMeans(A)  #列和
## [1] 5.5 6.5 7.5
colSums(A)  #行平均
## [1]  6 15 24 33
colMeans(A)  #列平均
## [1]  2  5  8 11

取矩陣的上、下三角部分

函數(shù)lower.tri()和函數(shù)upper.tri()可以很方便的取到一個(gè)矩陣的上挪凑、下三角部分的元素

args(lower.tri)  #函數(shù)將返回一個(gè)邏輯值矩陣孕索,其中下三角部分為真,上三角部分為假躏碳,選項(xiàng)diag為真時(shí)包含對角元素搞旭,為假時(shí)不包含對角元素。upper.tri()的效果與之孑然相反菇绵。
## function (x, diag = FALSE) 
## NULL
A
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
lower.tri(A)
##       [,1]  [,2]  [,3]  [,4]
## [1,] FALSE FALSE FALSE FALSE
## [2,]  TRUE FALSE FALSE FALSE
## [3,]  TRUE  TRUE FALSE FALSE
lower.tri(A, diag = T)
##      [,1]  [,2]  [,3]  [,4]
## [1,] TRUE FALSE FALSE FALSE
## [2,] TRUE  TRUE FALSE FALSE
## [3,] TRUE  TRUE  TRUE FALSE
A[lower.tri(A)] = 0  #上三角元素
A
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    0    5    8   11
## [3,]    0    0    9   12
A = matrix(1:12, 3, 4)
upper.tri(A)
##       [,1]  [,2]  [,3] [,4]
## [1,] FALSE  TRUE  TRUE TRUE
## [2,] FALSE FALSE  TRUE TRUE
## [3,] FALSE FALSE FALSE TRUE
upper.tri(A, diag = T)
##       [,1]  [,2] [,3] [,4]
## [1,]  TRUE  TRUE TRUE TRUE
## [2,] FALSE  TRUE TRUE TRUE
## [3,] FALSE FALSE TRUE TRUE
A[upper.tri(A)] = 0  #下三角元素
A
##      [,1] [,2] [,3] [,4]
## [1,]    1    0    0    0
## [2,]    2    5    0    0
## [3,]    3    6    9    0

行列式的值

在R中肄渗,函數(shù)det(x)將計(jì)算方陣x的行列式的值

x = matrix(rnorm(16), 4, 4)
x
##         [,1]      [,2]     [,3]   [,4]
## [1,] -0.6702 -0.373644 -0.49882 0.6437
## [2,] -0.1772  0.197085  1.33065 1.2033
## [3,]  0.9153  1.679349 -0.06697 0.4548
## [4,] -1.0058 -0.009947  0.90347 0.2930
det(x)
## [1] -2.777
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咬最,隨后出現(xiàn)的幾起案子翎嫡,更是在濱河造成了極大的恐慌,老刑警劉巖永乌,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惑申,死亡現(xiàn)場離奇詭異,居然都是意外死亡翅雏,警方通過查閱死者的電腦和手機(jī)圈驼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枚荣,“玉大人,你說我怎么就攤上這事啼肩¢献保” “怎么了衙伶?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長害碾。 經(jīng)常有香客問我矢劲,道長,這世上最難降的妖魔是什么慌随? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任芬沉,我火速辦了婚禮图筹,結(jié)果婚禮上钧唐,老公的妹妹穿的比我還像新娘郭计。我一直安慰自己透硝,他們只是感情好驱犹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布腕侄。 她就那樣靜靜地躺著灵寺,像睡著了一般诫尽。 火紅的嫁衣襯著肌膚如雪民效。 梳的紋絲不亂的頭發(fā)上憔维,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音畏邢,去河邊找鬼业扒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舒萎,可吹牛的內(nèi)容都是我干的程储。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逆甜,長吁一口氣:“原來是場噩夢啊……” “哼虱肄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起交煞,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤咏窿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后素征,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體集嵌,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年御毅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了根欧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡端蛆,死狀恐怖凤粗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情今豆,我是刑警寧澤嫌拣,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布柔袁,位于F島的核電站,受9級特大地震影響异逐,放射性物質(zhì)發(fā)生泄漏捶索。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一灰瞻、第九天 我趴在偏房一處隱蔽的房頂上張望腥例。 院中可真熱鬧,春花似錦酝润、人聲如沸燎竖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽底瓣。三九已至,卻和暖如春蕉陋,著一層夾襖步出監(jiān)牢的瞬間捐凭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工凳鬓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茁肠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓缩举,卻偏偏與公主長得像垦梆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子仅孩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容